From 70aec677ce3c76f80df48e9732c2ad686738ca4c Mon Sep 17 00:00:00 2001 From: MeowOS Date: Tue, 1 Sep 2026 14:14:38 +0800 Subject: [PATCH] =?UTF-8?q?ncm:=20FLAC=20=E8=A7=A3=E7=A0=81=E8=90=BD?= =?UTF-8?q?=E5=9C=B0(dr=5Fflac=200.13.4=20=E5=8D=95=E5=A4=B4=E5=85=A5?= =?UTF-8?q?=E5=BA=93)=20+=20=E7=BC=93=E5=AD=98=E9=94=AE=3D=E6=AD=8C?= =?UTF-8?q?=E6=9B=B2ID+=E9=9F=B3=E8=B4=A8=E6=A1=A3=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 解码分发 decoder.c:magic(fLaC→dr_flac / 其它→minimp3);flac ≤16bit→S16、 >16bit→S32 满幅送 audiod(AUDIO_FMT_S32),rate/ch/bits 按实际流,零 SRC 零裁剪 - song_url_auto 接受 flac(type 权威/url 扩展名兜底),降级语义不变;flac 下载限幅 1GB - 缓存键 song__.:同歌同档命中不重下,换档新条目旧档留 LRU; ext 前导点正名(修双点名),lookup 回退历史双点名+旧无档键温和兼容 - audio_out S32 通路(AUDIOD/ALSA/WAV)+ 流死重开按 bits 还原格式 - 验证(0 真实请求):44.1k/16 与 96k/24 自制样本宿主+qemu 帧数/时长精确、 逐样本零误差;mp3 回归逐帧一致;player_flow_sim P1-P6(新 P6 档位键/flac ext)、 cache_evict/cover/pagination/window/audiod_chain sim 全 PASS;mipsel 0 warning - REPORT §19 / VENDOR_NOTES dr_flac 条目;未部署真机(留主会话) --- .gitignore | 4 +- patch_v2/ncm_app/REPORT.md | 155 + patch_v2/ncm_app/VENDOR_NOTES.md | 11 + patch_v2/ncm_app/app/logic/appstate.c | 8 +- patch_v2/ncm_app/app/ncm_app_internal.h | 4 +- patch_v2/ncm_app/app/play/audio_out.c | 28 +- patch_v2/ncm_app/app/play/decoder.c | 141 + patch_v2/ncm_app/app/play/decoder.h | 34 + patch_v2/ncm_app/app/play/dr_flac_impl.c | 7 + patch_v2/ncm_app/app/play/player_manager.c | 100 +- patch_v2/ncm_app/app/test/test_decode.c | 83 +- patch_v2/ncm_app/bench/player_flow_sim.c | 85 +- patch_v2/ncm_app/build_ncm.sh | 9 +- patch_v2/ncm_app/build_ncm_host.sh | 6 +- patch_v2/ncm_app/core/ncm_api.c | 13 +- patch_v2/ncm_app/core/ncm_api.h | 7 +- patch_v2/ncm_app/core/ncm_cache.c | 14 +- patch_v2/ncm_app/core/ncm_cache.h | 3 +- patch_v2/ncm_app/ncm | Bin 963404 -> 1050204 bytes patch_v2/ncm_app/ncm_host | Bin 1003048 -> 1074744 bytes patch_v2/ncm_app/test/test_ncm_core.c | 15 + patch_v2/ncm_app/test/test_ncm_core_host | Bin 554208 -> 554208 bytes patch_v2/ncm_app/vendor/dr_flac/dr_flac.h | 12760 +++++++++++++++++++ 23 files changed, 13377 insertions(+), 110 deletions(-) create mode 100644 patch_v2/ncm_app/app/play/decoder.c create mode 100644 patch_v2/ncm_app/app/play/decoder.h create mode 100644 patch_v2/ncm_app/app/play/dr_flac_impl.c create mode 100644 patch_v2/ncm_app/vendor/dr_flac/dr_flac.h diff --git a/.gitignore b/.gitignore index 2b77778..6270093 100644 --- a/.gitignore +++ b/.gitignore @@ -75,7 +75,9 @@ font/src/**/*.ttc patch_v2/sdk/test_p1p2p3_repro # ncm_app vendor 源码与构建产物(体积大;版本/获取方式见 VENDOR_NOTES.md,构建脚本可复现) -patch_v2/ncm_app/vendor/ +# 例外:dr_flac 单头文件入库(§19 FLAC 解码依赖,532KB 单文件可入库) +patch_v2/ncm_app/vendor/* +!patch_v2/ncm_app/vendor/dr_flac/ patch_v2/ncm_app/out/ patch_v2/sdk/test_sdk_fixes diff --git a/patch_v2/ncm_app/REPORT.md b/patch_v2/ncm_app/REPORT.md index fd54773..1ab5b3a 100644 --- a/patch_v2/ncm_app/REPORT.md +++ b/patch_v2/ncm_app/REPORT.md @@ -1586,3 +1586,158 @@ fee4204e945866f5a07ca7d191fa83e3 bench/player_flow_sim.c 挂机时封面可能缺席但不影响播放。 - 播放页 BUFFER 态进度条仍画 0:00 标尺(缓冲文案在歌词区),未做进度条一体化——观感项。 - meow_audiod_host 工作区有他人改动(其他 agent 在改 audiod),本批未 add/未提交该文件。 + +--- + +## 19. FLAC 解码落地(dr_flac)+ 缓存键 = 歌曲ID+音质档位(2026-09-01) + +> 范围:仅 `patch_v2/ncm_app/` + 根 `.gitignore`(vendor/dr_flac 例外条目)。未动 `sdk/`、 +> `meow_audiod/`、`meow_launcherd/`。风控纪律:本批真实 NCM 请求 **0 次**(全部离线 stub/sim/ +> 自制测试样本;song_url 降级链只改接受条件,未新增请求路径)。 +> **本批未部署真机**(部署留主会话统一做)。 + +### 19.1 动机 + +播放链此前只有 minimp3(mp3-only):`song_url_auto` 只收 mp3 URL,无损 SQ/Hi-Res 档位 +拿到 flac 也只能继续降级 → 无损/Hi-Res 空转(NCM_CACHE_DESIGN §2.5「同日发现」)。 +硬件侧 CS43198 支持到 768kHz/S24,audiod 已支持 S16/S24/S32 输入 + DAC 原生率跟随 +(AUDIOD_DESIGN §4),缺的只是解码器。本批引入 dr_flac 并打通全链。 + +### 19.2 dr_flac 引入(vendor/dr_flac/dr_flac.h,入库) + +- 来源:https://github.com/mackron/dr_libs(master 分支 `dr_flac.h`,2026-09-01 取得, + 532768 B,版本宏 0.13.4);许可证 **public domain / MIT-0 任选**(文件头/尾双许可声明)。 +- 单头文件直接入库:`.gitignore` 由 `patch_v2/ncm_app/vendor/` 改为 `vendor/*` + + `!vendor/dr_flac/` 例外(其余 vendor 大树维持不入库,VENDOR_NOTES.md 记版本/获取方式)。 +- 集成:`app/play/dr_flac_impl.c` 唯一实现 TU(`DR_FLAC_IMPLEMENTATION` + + `DR_FLAC_NO_OGG`——song_url 下发的 flac 恒原生封装,裁 ogg 容器省 text), + 编译豁免告警(与 minimp3 同口径)。 + +### 19.3 解码分发(app/play/decoder.{h,c},新) + +- `ncm_dec_open` 按 **magic** 分发:首 4 字节 `fLaC` → dr_flac;其余(ID3 / 0xFF 帧同步/ + 未知)→ minimp3(未知格式由 minimp3 open 报错兜底,不加第三分支)。 +- 统一接口:`open(回填 rate/ch/bits/total_frames)` / `read(帧)` / `seek_ms` / `close` / + `format`。位宽映射:flac ≤16bit → S16;>16bit → **S32 左对齐满幅**(drflac s32 输出), + 送 audiod `AUDIO_FMT_S32`——格式归一/SRC-free 原生率跟随全在 audiod 侧(AUDIOD §4), + 本层零裁剪零 SRC。mp3 恒 S16。 +- mp3 细节:minimp3_ex 的 `dec.info` 首读后才有效 → open 时预读一块进 stash(4096 帧), + read 先吐 stash;seek 保持旧语义(关+重开按字节近似)。flac seek = 精确 PCM 帧。 +- `player_manager.c` run_song 改走 decoder:`audio_out_open(rate, ch, bits)` 按实际流 + (不再硬编码 44100/2/16);进度 pos/暂停日志/seek 帧数全部用实际 rate; + song 元数据 duration 缺失时用 `total_frames/rate` 推准确时长(flac 精确)。 + 单块 PCM 缓冲改静态 32KB(4096 帧 ×2ch ×4B S32 上限;播放线程单实例,省栈)。 + +### 19.4 audio_out 位宽参数化(S32 通路) + +- `audio_out_write` 签名 `const short *` → `const void *`(字节数按 open 的 bits×ch 算, + FILE/ALSA 两后端本就如此)。 +- AUDIOD 后端:bits 16→`AUDIO_FMT_S16`、32→`AUDIO_FMT_S32`(其余拒绝);流死重开 + (pause resume 失败路径)按本次 bits 还原格式(旧版恒 S16,flac 曲重开会错格式——随本批修)。 +- ALSA 直开保底:支持 S32_LE(16/32);WAV sink 头 bits 字段如实写(16/32 均合法 PCM WAV)。 + +### 19.5 song_url 降级链接收 flac(core/ncm_api.c) + +- `ncm_api_song_url_auto` 接受条件:`type ∈ {mp3, flac}`;`type` 缺失(旧端点兼容)时看 + url 扩展名(`.flac` → 回填 type=flac),默认当 mp3 收。降级语义不变(hires→lossless→ + exhigh→higher→standard 逐档,url null/未知格式继续降)。 +- 下载限幅:Hi-Res flac 单曲可达数百 MB(192k/24bit 5min ≈345MB)→ flac 上限 1GB、 + mp3 维持 64MB(`u.size` 可信时按 size 限幅)。 + +### 19.6 缓存键 = 歌曲ID + 音质档位(用户定案 NCM_CACHE_DESIGN §2.5) + +- 新键:`song__.`(level = `ncm_api_level_str`:standard/higher/exhigh/ + lossless/hires)。**同歌同档命中不重复下载;换档=新条目;旧档留给 LRU 自然淘汰**(不主动删)。 + 键取**用户设定档**(非实际降级产物档)——保证「同设定永不重下」,降级产物归设定档键。 +- 查找顺序:新键 flac → 新键 mp3 → 旧无档位键 `song_.mp3`(存量温和兼容,命中即播)。 +- **命名正名**:`ncm_cache_path` 剥离 ext 至多一个前导点——旧版调用方传 ".mp3" 生成 + 双点名 `song_..mp3`(§256 修的既有约定),新文件一律单点;`ncm_cache_lookup` + 单点 miss 时回退历史双点名(命中照常刷 LRU,不改名不删除)。封面池(song_cov*.jpg) + 同享正名+双点回退。 +- autoplay hook(`/tmp/ncm_autoplay`)的「已缓存」判定同步三键顺序。 + +### 19.7 验证记录(0 真实 NCM 请求) + +测试样本:libsndfile(venv soundfile)自制 `out/test-vectors/sweep_44k1_16.flac` +(44.1kHz/16bit/2ch/3.000s=132300 帧)与 `sweep_96k_24.flac`(96kHz/24bit/2ch/2.000s= +192000 帧)(正弦扫频;out/ 不入库,脚本见 §19.9 可复现)。 + +| 项 | 方式 | 结果 | +|---|---|---| +| flac 44.1k/16 宿主 | `test_decode`(新:走 decoder 分发→audio_out FILE WAV),expect 132300/44100/16 | **PASS**:帧数/率/位宽精确;WAV 数据与 libsndfile 参考**逐样本零误差** | +| flac 96k/24 宿主 | 同上,expect 192000/96000/32 | **PASS**:S32 满幅输出,换算 float 与参考 max err = 0.0;173× RT | +| mp3 回归 宿主 | MIPSTest.mp3 expect 393984/48000/16 | **PASS**:与 §16 记录逐帧一致(393984 帧/8.208s),WAV 字节数精确 | +| flac+mp3 qemu-mipsel | `test_decode_mipsel`(静态交叉)同三样本 | **全 PASS**:44.1k 50.9× RT / 96k24 29.0× RT / mp3 4.8× RT(qemu 模拟保守值,真机更快);MIPS32 LE 端序/32位 long 无问题 | +| 播放状态机 | `bench/player_flow_sim.c`(stub 换 ncm_dec_*;**新增 P6**:档位键+flac ext) | **P1-P6 全 PASS**:P6 实证 cache key=`1000_lossless`、type=flac → `.flac` 落盘;P1-P5 旧用例零回归 | +| 缓存键/命名 | `test_ncm_core`(新增:ext 带点正名单点路径 + 历史双点名 lookup 命中)+ `cache_evict_sim` | 宿主 + qemu-mipsel **全 PASS**;evict 6 组 PASS(`song_*` 前缀扫描不受键变化影响) | +| 封面/滑窗回归 | cover_chain_sim / pagination_sim / window_sim(重编新 ncm_cache.c/appstate.c) | **全 PASS**(封面池同享正名+双点回退;autoplay 三键判定 gc 段不影响 sim) | +| audiod 链回归 | audiod_chain_sim(真实 audiod_host 假 socket,重编新 audio_out.c) | **14/14 PASS**(OPEN/WRITE/PAUSE/RESUME/抢占/流死重开/CLOSE) | +| mipsel 构建 | `build_ncm.sh`(自有代码 -Wall -Wextra;dr_flac_impl vendor 豁免) | **0 warning**;`text 954304 / data 1576 / bss 1113668`(text +85.5KB = dr_flac+decoder) | +| 宿主离屏渲染 | build_ncm_host.sh + 9 页 MEOW_UI_DUMP | 全 rc=0;自有代码 0 warning(SDK meow_ui_vol.c 既有告警除外) | + +### 19.8 md5(本批产物 + 改动文件) + +``` +52d20f5325ba2bb646355dcc6db54ad3 ncm # mipsel 静态 App(新;未部署,留主会话) +ff7acea1b1769fb2e67a5177dfc37d8f ncm_host # 宿主离屏调试二进制 +90c7901bff0ff6e2e579ef068ac48161 vendor/dr_flac/dr_flac.h +86e99aaad27bfc828a59694022e4a8aa app/play/decoder.c +b02e8e5f7c7194a6bf492171c137233f app/play/decoder.h +2c6d5b93cecec980a67b737329847905 app/play/dr_flac_impl.c +6b8b0d13933a547c3349e423a9516eb3 app/play/player_manager.c +6f5ea39ab6b7ef54c87c48916c8705eb app/play/audio_out.c +2ad8b12f47014d034df75f864cb2a9b9 app/ncm_app_internal.h +2ca5b164877617063a7a44964acdf3d8 core/ncm_api.c +de21f105514235594f90427beec0b10f core/ncm_api.h +b870b25c9bd9692c912170ddce2b04de core/ncm_cache.c +0cb40a5af7f1c85af79f4f4b44a9cc4a core/ncm_cache.h +811c730b5fc52256f84b8917b7657649 app/logic/appstate.c +fba1d01fe6f3cfc9bcf334481e8edb09 app/test/test_decode.c +0ed4ce768d82a9512c5d32bca1271366 test/test_ncm_core.c +c6846cb4c31161c42d81560ade628771 bench/player_flow_sim.c +791a9ddbde363348e3ef373931647aeb build_ncm.sh +f4fb97416868b9a61b6b54f8958bc6f9 build_ncm_host.sh +65e3da445996e62079bfa38a9c9699b7 VENDOR_NOTES.md +``` + +### 19.9 出入清单(只改 `patch_v2/ncm_app/` + 根 .gitignore) + +``` +新增: + vendor/dr_flac/dr_flac.h # dr_flac 0.13.4 单头(public domain/MIT-0;入库例外) + app/play/decoder.h/.c # 格式分发解码(magic:fLaC→dr_flac / 其它→minimp3;S16/S32 位宽映射) + app/play/dr_flac_impl.c # dr_flac 唯一实现 TU(DR_FLAC_NO_OGG;vendor 豁免告警) +修改: + app/play/player_manager.c # run_song 走 decoder(实际 rate/ch/bits/时长)+ 缓存键 id+档位 + + # flac 落盘(ext 按 type/url)+ flac 下载限幅 1GB + 旧无档键兼容 + app/play/audio_out.c # write 改 const void* + S32 通路(AUDIOD/ALSA/WAV)+ 流死重开按 bits 还原 + app/ncm_app_internal.h # audio_out_write 签名/注释 + core/ncm_api.c/.h # song_url_auto 接受 flac(type 权威/url 扩展名兜底),降级语义不变 + core/ncm_cache.c/.h # ext 前导点正名(单点)+ lookup 历史双点名回退 + app/logic/appstate.c # autoplay 已缓存判定三键顺序(新档键 flac/mp3 → 旧无档键) + app/test/test_decode.c # 改走 decoder 分发 + expect_frames/rate/bits 校验 + meow_ui_time_ms 桩 + test/test_ncm_core.c # 缓存命名正名 + 双点旧名兼容用例 + bench/player_flow_sim.c # stub 换 ncm_dec_* + ncm_api_level_str/ncm_streq 桩 + P6(档位键/flac ext) + build_ncm.sh / build_ncm_host.sh # +decoder.c +dr_flac_impl.c + -Ivendor/dr_flac + VENDOR_NOTES.md # dr_flac 条目(来源/版本/许可/集成方式/实测) + .gitignore(仓库根) # vendor/ → vendor/* + !vendor/dr_flac/(单头入库) + ncm / ncm_host # 重编产物 +(未动 sdk/、meow_audiod/、meow_launcherd/、其余 vendor/;未部署真机;未动设备系统/恢复区) +``` + +### 19.10 诚实出入 / 遗留 + +- **真机未部署未验**(留主会话统一)。真机验收点:①无损/Hi-Res 档位真实出 flac 流并出声 + (48k/16 与 96k/192k/24 各试一首,日志 `play: start ... fmt=flac Hz/2ch/16|32bit` + + audiod grant 跟随原生率)②换音质档后同歌重下新条目、旧档仍在(LRU 未触发时)③旧缓存 + (无档键/双点名)直接可播不重下 ④flac seek 精确帧。 +- **无损档位要会员**:song_url 的 lossless/hires 档需 CVIP/SVIP——**用户账号能否真拿到 + flac URL 待真机按账号实测**(非会员会逐级降到 exhigh mp3,行为同旧版,不算回归)。 +- 八档音质体系(NCM_CACHE_DESIGN §3 的 jyeffect/sky/jymaster 等 SVIP 档)未进 App + (设置仍 5 档,枚举只到 NCM_LEVEL_HIRES)——缓存键已按档字符串泛化,后续加档零改动。 +- dr_flac 只接原生 flac 封装(NO_OGG);song_url 若下发 ogg-flac 会被 sniff 判给 minimp3 + 报错「decode open failed」——目前未见该形态(type=flac 恒原生),真机若见再加 ogg。 +- 96k/24 → S32 满幅在 qemu 下 29× RT,真机 MIPS 预估实时余量充足;若实测吃紧可开 + `DR_FLAC_NO_CRC`(省 CRC 校验,~5-10% CPU)。 +- 测试样本(out/test-vectors/)与宿主/ffmpeg 工具链(out/tools/)在 out/ 下不入库; + 样本可用 python `soundfile` 一键重造(sweep 参数见 §19.7)。 diff --git a/patch_v2/ncm_app/VENDOR_NOTES.md b/patch_v2/ncm_app/VENDOR_NOTES.md index 4a70b95..b69ade4 100644 --- a/patch_v2/ncm_app/VENDOR_NOTES.md +++ b/patch_v2/ncm_app/VENDOR_NOTES.md @@ -15,6 +15,7 @@ | cJSON | 1.7.18 | MIT | 20.0 KB | 参考对比(未选,太大) | | qrcodegen | nayuki@993ccbb | MIT | 10.8 KB | ✅ 选(二维码) | | minimp3 | master@ea99364 | CC0 | 37.4 KB | ✅ 选(MP3 v1 解码) | +| dr_flac | 0.13.4 | public domain / MIT-0 | 见 REPORT §19(§19 补选,FLAC 解码,单头入库) | ✅ 选(无损/Hi-Res) | | dr_mp3 | 0.7.4 | MIT/public-domain | 40.7 KB | 参考对比(未选,质量更好但更大更吃内存) | ## 各库明细 @@ -63,6 +64,16 @@ - 上游:https://github.com/mackron/dr_libs(dr_mp3.h 单文件)。 - text=41679(≈40.7 KB);兼容性/音质更好,但更大、解码中间态内存更高。minimp3 更契合 14MB 限制。 +### dr_flac 0.13.4 — public domain / MIT-0(§19 选,FLAC 解码) +- 上游:https://github.com/mackron/dr_libs(`dr_flac.h` 单头文件,532768 B, + 2026-09-01 取自 master;版本宏 DRFLAC_VERSION=0.13.4)。**本文件入库** + (`.gitignore` 对 `vendor/` 开了 `!vendor/dr_flac/` 例外;单头文件可入库,网络不可达时可复现)。 +- 集成:`app/play/dr_flac_impl.c` 唯一实现 TU(`DR_FLAC_IMPLEMENTATION` + `DR_FLAC_NO_OGG` + 裁 ogg 容器——网易云 song_url 的 flac 恒原生封装),vendor 豁免告警(同 minimp3 口径)。 +- 位宽:`drflac_read_pcm_frames_s16`(≤16bit)/ `s32`(>16bit,左对齐满幅 → audiod + AUDIO_FMT_S32,AUDIOD_DESIGN.md §4 归一在 SDK/audiod 侧)。 +- 实测(REPORT §19):44.1k/16 与 96k/24 样本逐样本零误差;qemu-mipsel 96k/24 解码 29× RT。 + ## 备注(工程) - mbedtls 产物默认写在 `vendor/mbedtls/library/`(3.6 的 Makefile 不理会 BUILD 变量),脚本再拷贝到 `out/`。 - `MBEDTLS_SSL_IN_CONTENT_LEN/OUT_CONTENT_LEN` 默认 16KB;对 14MB 也不大,可再按需调小(见 REPORT 内存估)。 diff --git a/patch_v2/ncm_app/app/logic/appstate.c b/patch_v2/ncm_app/app/logic/appstate.c index 1e2a0ec..0f32c79 100644 --- a/patch_v2/ncm_app/app/logic/appstate.c +++ b/patch_v2/ncm_app/app/logic/appstate.c @@ -435,8 +435,12 @@ static int autoplay_try_playlist(int pl) for (int i = 0; i < g_st.track_ids_count; i++) { /* 滑窗模型:锁内拷贝窗内有效槽 */ ncm_song_t s; if (appstate_song_copy(i, &s) != 0) break; /* 出窗即停(首页之后未物化) */ - if (ncm_cache_lookup(&g_st.ctx.cache, s.id, ".mp3", - cpath, sizeof cpath) == NCM_OK) { + /* §19 缓存键 = id+档位:先试当前档位键(flac/mp3),再回退旧无档位键(存量 mp3) */ + char key[64]; + snprintf(key, sizeof key, "%s_%s", s.id, ncm_api_level_str(g_st.level)); + if (ncm_cache_lookup(&g_st.ctx.cache, key, "flac", cpath, sizeof cpath) == NCM_OK || + ncm_cache_lookup(&g_st.ctx.cache, key, "mp3", cpath, sizeof cpath) == NCM_OK || + ncm_cache_lookup(&g_st.ctx.cache, s.id, "mp3", cpath, sizeof cpath) == NCM_OK) { g_st.active_playlist = pl; meow_log(MEOW_LOG_INFO, "autoplay: playlist[%d] song[%d] id=%s cached -> play", pl, i, s.id); diff --git a/patch_v2/ncm_app/app/ncm_app_internal.h b/patch_v2/ncm_app/app/ncm_app_internal.h index a751c8c..d5e2fc0 100644 --- a/patch_v2/ncm_app/app/ncm_app_internal.h +++ b/patch_v2/ncm_app/app/ncm_app_internal.h @@ -315,8 +315,8 @@ void cover_cache_reset(void); /* ---- play(app/play/)---- */ /* audio_out(后端:默认 SINK_AUDIOD=meow_audiod 独占服务;env NCM_AUDIO_SINK=file/null/alsa * 或 MEOW_AUDIO_DIRECT=1 选调试后端,见 audio_out.c 文件头) */ -int audio_out_open(int sample_rate, int channels, int bits); /* 0=成功 */ -int audio_out_write(const short *samples, int frames); /* <0=错误/结束 */ +int audio_out_open(int sample_rate, int channels, int bits); /* 0=成功;bits∈{16,32}(§19 flac>16bit→32) */ +int audio_out_write(const void *samples, int frames); /* <0=错误/结束;样本位宽=open 的 bits */ int audio_out_pause(int paused); /* 1=暂停(停 PCM 时钟不丢流) 0=恢复(流死自动重开);非 AUDIOD 后端恒 0 */ void audio_out_close(void); void audio_out_set_target(int ms); /* 预留:缓冲目标 */ diff --git a/patch_v2/ncm_app/app/play/audio_out.c b/patch_v2/ncm_app/app/play/audio_out.c index 484bbbb..aa0931c 100644 --- a/patch_v2/ncm_app/app/play/audio_out.c +++ b/patch_v2/ncm_app/app/play/audio_out.c @@ -62,7 +62,7 @@ static void pivset(struct snd_interval *iv, unsigned val) } static int alsa_open(int rate, int ch, int bits) { - if (bits != 16) return -1; + if (bits != 16 && bits != 32) return -1; /* §19:S16 + S32(flac >16bit 满幅) */ int fd = open("/dev/snd/pcmC0D0p", O_RDWR); if (fd < 0) { meow_log(MEOW_LOG_ERROR, "audio: alsa open /dev/snd/pcmC0D0p failed errno=%d", errno); @@ -84,7 +84,8 @@ static int alsa_open(int rate, int ch, int bits) struct snd_mask *am = &p.masks[SNDRV_PCM_HW_PARAM_ACCESS - SNDRV_PCM_HW_PARAM_FIRST_MASK]; memset(am, 0, sizeof *am); pmask(am, SNDRV_PCM_ACCESS_RW_INTERLEAVED); struct snd_mask *fm = &p.masks[SNDRV_PCM_HW_PARAM_FORMAT - SNDRV_PCM_HW_PARAM_FIRST_MASK]; - memset(fm, 0, sizeof *fm); pmask(fm, SNDRV_PCM_FORMAT_S16_LE); + memset(fm, 0, sizeof *fm); + pmask(fm, bits == 32 ? SNDRV_PCM_FORMAT_S32_LE : SNDRV_PCM_FORMAT_S16_LE); struct snd_mask *sm = &p.masks[SNDRV_PCM_HW_PARAM_SUBFORMAT - SNDRV_PCM_HW_PARAM_FIRST_MASK]; memset(sm, 0, sizeof *sm); pmask(sm, SNDRV_PCM_SUBFORMAT_STD); pivset(&p.intervals[SNDRV_PCM_HW_PARAM_CHANNELS - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL], @@ -99,13 +100,14 @@ static int alsa_open(int rate, int ch, int bits) return -1; } ioctl(fd, SNDRV_PCM_IOCTL_PREPARE, 0); - meow_log(MEOW_LOG_INFO, "audio: alsa open ok rate=%d ch=%d (direct debug)", rate, ch); + meow_log(MEOW_LOG_INFO, "audio: alsa open ok rate=%d ch=%d bits=%d (direct debug)", rate, ch, bits); return fd; } #endif /* 写 WAV 头(44 字节标准 PCM 布局:RIFF/WAVE/fmt(16)/data)。 - * fmt(16) = format(2) ch(2) sample_rate(4) byte_rate(4) block_align(2) bits(2)。 */ + * fmt(16) = format(2) ch(2) sample_rate(4) byte_rate(4) block_align(2) bits(2)。 + * §19:bits 16/32 均合法(32=flac >16bit 的 S32 满幅样本)。 */ static void file_write_header(int fd, int rate, int ch, int bits, uint32_t data_len) { unsigned char h[44]; @@ -174,12 +176,16 @@ int audio_out_open(int sample_rate, int channels, int bits) #endif } - /* 默认:SINK_AUDIOD(meow_audiod 独占服务)。v1 SDK 声源格式 S16(minimp3 输出即 S16_LE)。 */ - if (bits != 16) { - meow_log(MEOW_LOG_ERROR, "audio: audiod open: bits=%d unsupported (v1 S16 only)", bits); + /* 默认:SINK_AUDIOD(meow_audiod 独占服务)。§19:bits 16→S16 / 32→S32 + * (flac >16bit 由 dr_flac 出 S32 满幅;格式归一/DAC 原生率跟随在 audiod 侧)。 */ + int fmt; + if (bits == 16) fmt = AUDIO_FMT_S16; + else if (bits == 32) fmt = AUDIO_FMT_S32; + else { + meow_log(MEOW_LOG_ERROR, "audio: audiod open: bits=%d unsupported (16/32)", bits); return -1; } - int sid = meow_audio_open(sample_rate, channels, AUDIO_FMT_S16); + int sid = meow_audio_open(sample_rate, channels, fmt); if (sid < 0) { meow_log(MEOW_LOG_ERROR, "audio: audiod open failed rc=%d rate=%d ch=%d (audiod 不在?)", sid, sample_rate, channels); @@ -199,7 +205,7 @@ int audio_out_open(int sample_rate, int channels, int bits) return 0; } -int audio_out_write(const short *samples, int frames) +int audio_out_write(const void *samples, int frames) { if (g_app_quit) return -1; if (g_sink == SINK_NULL || g_sink < 0) return frames; @@ -252,11 +258,11 @@ int audio_out_pause(int paused) meow_log(MEOW_LOG_WARN, "audio: audiod pause sid=%d rc=%d (stream dead?)", g_sid, rc); return 0; } - /* 恢复失败 = 流已死 → 重开 */ + /* 恢复失败 = 流已死 → 重开(格式按本次 open 的 bits 还原:16→S16 / 32→S32) */ meow_log(MEOW_LOG_WARN, "audio: audiod resume sid=%d rc=%d -> reopen", g_sid, rc); meow_audio_close(g_sid); g_sid = 0; - int sid = meow_audio_open(g_rate, g_ch, AUDIO_FMT_S16); + int sid = meow_audio_open(g_rate, g_ch, g_bits == 32 ? AUDIO_FMT_S32 : AUDIO_FMT_S16); if (sid < 0) { meow_log(MEOW_LOG_ERROR, "audio: audiod reopen failed rc=%d rate=%d ch=%d", sid, g_rate, g_ch); return -1; diff --git a/patch_v2/ncm_app/app/play/decoder.c b/patch_v2/ncm_app/app/play/decoder.c new file mode 100644 index 0000000..66b100b --- /dev/null +++ b/patch_v2/ncm_app/app/play/decoder.c @@ -0,0 +1,141 @@ +/* play/decoder.c — 格式分发解码实现(接口见 decoder.h,REPORT §19)。 + * + * mp3 细节:minimp3_ex 的 dec.info(hz/channels)在首次 mp3dec_ex_read 后才保证有效, + * 而调用方开 audio_out 前就要 rate/ch —— open 时先预读一批进 stash,read 先吐 stash。 + * seek(mp3):关+重开(MP3D_SEEK_TO_BYTE 索引在 open 时重建)再按字节近似 seek,同旧语义。 + */ +#include "decoder.h" +#include "minimp3_ex.h" +#include "dr_flac.h" + +#include +#include +#include + +#define DEC_STASH_FRAMES 4096 /* open 预读上限(帧),与播放循环单块读同量级 */ + +enum { DEC_MP3 = 0, DEC_FLAC = 1 }; + +struct ncm_decoder { + int kind; + char path[512]; + int rate, ch, bits; + int64_t total_frames; /* 0=未知 */ + /* mp3 */ + mp3dec_ex_t mp3; + int16_t *stash; /* 预读样本(交织 s16),stash_n 个样本 */ + size_t stash_n, stash_off; + /* flac */ + drflac *flac; +}; + +/* magic 探测:首 4 字节 "fLaC" → flac;其余(ID3 / 0xFF 帧同步 / 未知)→ mp3 + *(未知格式留给 minimp3 在 open 时报错,不在本层加第三种分支)。 */ +static int sniff_kind(const char *path) +{ + unsigned char m[4] = {0}; + FILE *f = fopen(path, "rb"); + if (f) { size_t n = fread(m, 1, 4, f); fclose(f); if (n < 4) return DEC_MP3; } + if (m[0] == 'f' && m[1] == 'L' && m[2] == 'a' && m[3] == 'C') return DEC_FLAC; + return DEC_MP3; +} + +int ncm_dec_open(ncm_decoder_t **out, const char *path, + int *rate, int *ch, int *bits, int64_t *total_frames) +{ + if (!out || !path) return -1; + ncm_decoder_t *d = (ncm_decoder_t *)calloc(1, sizeof *d); + if (!d) return -1; + d->kind = sniff_kind(path); + snprintf(d->path, sizeof d->path, "%s", path); + + if (d->kind == DEC_FLAC) { + d->flac = drflac_open_file(path, NULL); + if (!d->flac) { free(d); return -1; } + d->rate = (int)d->flac->sampleRate; + d->ch = (int)d->flac->channels; + /* 位宽映射(AUDIOD §4 归一交给 SDK/audiod):≤16 → S16;>16 → S32 满幅 */ + d->bits = (d->flac->bitsPerSample <= 16) ? 16 : 32; + d->total_frames = (int64_t)d->flac->totalPCMFrameCount; + } else { + if (mp3dec_ex_open(&d->mp3, path, MP3D_SEEK_TO_BYTE) != 0) { free(d); return -1; } + d->bits = 16; + d->stash = (int16_t *)malloc(DEC_STASH_FRAMES * 2 * sizeof(int16_t)); + if (!d->stash) { mp3dec_ex_close(&d->mp3); free(d); return -1; } + /* 预读首块:填 dec.info(hz/channels)+ 预热 stash */ + size_t got = mp3dec_ex_read(&d->mp3, d->stash, DEC_STASH_FRAMES * 2); + d->stash_n = got; + d->rate = d->mp3.info.hz; + d->ch = d->mp3.info.channels; + if (d->rate <= 0 || d->ch <= 0) { /* 首块即失败/空流 */ + mp3dec_ex_close(&d->mp3); free(d->stash); free(d); return -1; + } + d->total_frames = (d->ch > 0) ? (int64_t)(d->mp3.samples / (uint64_t)d->ch) : 0; + } + + if (d->ch < 1 || d->ch > 2) { ncm_dec_close(d); return -1; } /* v1 只接 单/双声道 */ + *out = d; + if (rate) *rate = d->rate; + if (ch) *ch = d->ch; + if (bits) *bits = d->bits; + if (total_frames) *total_frames = d->total_frames; + return 0; +} + +int64_t ncm_dec_read(ncm_decoder_t *d, void *buf, int64_t cap_frames) +{ + if (!d || !buf || cap_frames <= 0) return 0; + if (d->kind == DEC_FLAC) { + if (d->bits == 16) + return (int64_t)drflac_read_pcm_frames_s16(d->flac, (drflac_uint64)cap_frames, + (drflac_int16 *)buf); + return (int64_t)drflac_read_pcm_frames_s32(d->flac, (drflac_uint64)cap_frames, + (drflac_int32 *)buf); + } + /* mp3:先吐 stash,再直读 */ + int16_t *out = (int16_t *)buf; + int64_t cap_samples = cap_frames * d->ch; + int64_t done = 0; + if (d->stash_off < d->stash_n) { + size_t left = d->stash_n - d->stash_off; + size_t take = left < (size_t)cap_samples ? left : (size_t)cap_samples; + memcpy(out, d->stash + d->stash_off, take * sizeof(int16_t)); + d->stash_off += take; + done += (int64_t)take; + } + if (done < cap_samples) { + size_t got = mp3dec_ex_read(&d->mp3, out + done, (size_t)(cap_samples - done)); + done += (int64_t)got; + } + return done / d->ch; +} + +int ncm_dec_seek_ms(ncm_decoder_t *d, int64_t ms, int64_t file_bytes, int64_t dur_ms) +{ + if (!d || ms < 0) return -1; + if (d->kind == DEC_FLAC) { + drflac_uint64 frame = (drflac_uint64)(ms * d->rate / 1000); + return drflac_seek_to_pcm_frame(d->flac, frame) ? 0 : -1; + } + /* mp3:关+重开(重建字节索引)再按字节近似 */ + mp3dec_ex_close(&d->mp3); + memset(&d->mp3, 0, sizeof d->mp3); + if (mp3dec_ex_open(&d->mp3, d->path, MP3D_SEEK_TO_BYTE) != 0) return -1; + d->stash_n = d->stash_off = 0; + int64_t target = (file_bytes > 0 && dur_ms > 0) ? file_bytes * ms / dur_ms : 0; + return mp3dec_ex_seek(&d->mp3, (uint64_t)(target > 0 ? target : 0)); +} + +void ncm_dec_close(ncm_decoder_t *d) +{ + if (!d) return; + if (d->kind == DEC_FLAC) { if (d->flac) drflac_close(d->flac); } + else { mp3dec_ex_close(&d->mp3); free(d->stash); } + free(d); +} + +const char *ncm_dec_format(const ncm_decoder_t *d) +{ + if (!d) return "?"; + return d->kind == DEC_FLAC ? "flac" : "mp3"; +} diff --git a/patch_v2/ncm_app/app/play/decoder.h b/patch_v2/ncm_app/app/play/decoder.h new file mode 100644 index 0000000..ebfee4a --- /dev/null +++ b/patch_v2/ncm_app/app/play/decoder.h @@ -0,0 +1,34 @@ +/* play/decoder.h — 格式分发解码(REPORT §19):按文件 magic 选后端。 + * "fLaC" → dr_flac(无损 SQ / Hi-Res,vendor/dr_flac.h) + * 其它(ID3 / 0xFF 帧同步 / 未知)→ minimp3(既有 mp3 路径,未知格式由 minimp3 兜底报错) + * 输出约定:bits<=16 → 交织 S16;bits>16 → 交织 S32(dr_flac s32 左对齐满幅,送 audiod + * AUDIO_FMT_S32,AUDIOD_DESIGN.md §4 格式归一由 SDK/audiod 完成,本层不做 SRC/裁剪)。 + */ +#ifndef NCM_DECODER_H +#define NCM_DECODER_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ncm_decoder ncm_decoder_t; + +/* 打开并探测流参数:rate/ch/bits/total_frames 经指针回填实际值(mp3 恒 16bit; + * total_frames 0=未知)。返回 0=成功。 */ +int ncm_dec_open(ncm_decoder_t **out, const char *path, + int *rate, int *ch, int *bits, int64_t *total_frames); +/* 读最多 cap_frames 帧到 buf(交织,样本位宽=open 返回的 bits;cap 以帧计, + * buf 容量须 ≥ cap_frames*ch*(bits/8))。返回实际帧数,0=EOF。 */ +int64_t ncm_dec_read(ncm_decoder_t *d, void *buf, int64_t cap_frames); +/* seek 到 ms。flac=精确 PCM 帧;mp3=按 file_bytes*ms/dur_ms 字节近似(同旧语义)。 */ +int ncm_dec_seek_ms(ncm_decoder_t *d, int64_t ms, int64_t file_bytes, int64_t dur_ms); +void ncm_dec_close(ncm_decoder_t *d); +/* "mp3" / "flac"(日志/UI 用)。 */ +const char *ncm_dec_format(const ncm_decoder_t *d); + +#ifdef __cplusplus +} +#endif +#endif /* NCM_DECODER_H */ diff --git a/patch_v2/ncm_app/app/play/dr_flac_impl.c b/patch_v2/ncm_app/app/play/dr_flac_impl.c new file mode 100644 index 0000000..1220f24 --- /dev/null +++ b/patch_v2/ncm_app/app/play/dr_flac_impl.c @@ -0,0 +1,7 @@ +/* play/dr_flac_impl.c — dr_flac 唯一实现 TU(header-only:define 实现一次,与 + * minimp3_impl.c 同款)。编译时 -I/dr_flac;vendor 豁免告警(同 minimp3 口径)。 + * DR_FLAC_NO_OGG:ogg 封装的 flac 网易云不会下发(song_url type=flac 恒原生 flac), + * 裁掉 ogg 容器代码省 text。 */ +#define DR_FLAC_NO_OGG +#define DR_FLAC_IMPLEMENTATION +#include "dr_flac.h" diff --git a/patch_v2/ncm_app/app/play/player_manager.c b/patch_v2/ncm_app/app/play/player_manager.c index 9194470..ab3df29 100644 --- a/patch_v2/ncm_app/app/play/player_manager.c +++ b/patch_v2/ncm_app/app/play/player_manager.c @@ -3,9 +3,12 @@ * * 模型:一个持久的播放线程。外层循环取「目标曲目」,run_song() 负责一首歌的 * 「下载(缓冲) → 解码 → 输出 → 结束/被指令打断」。暂停=冻结(停读停写停推 pos,状态置 PAUSED); - * seek=重开解码器+输出并 seek 到目标 ms(字节 offset 近似);下一/上一首=打断当前 run_song 返回外层。 + * seek=seek 解码器+重开输出到目标 ms(flac 精确帧/mp3 字节 offset 近似);下一/上一首=打断当前 run_song 返回外层。 * 所有跨线程共享状态在 g_play (mu)。g_st.ctx 的 device_id/cookie/cache 在播放期间稳定(登出会先停播)。 * 返回码/错误经 g_play.err/errmsg 供 UI 提示。 + * §19:解码经 decoder.c 按 magic 分发(fLaC→dr_flac / 其它→minimp3);rate/ch/bits 按实际流 + * 给 audio_out(flac ≤16bit→S16,>16bit→S32;audiod 格式归一/DAC 原生率跟随在服务端); + * 音频缓存键 = 歌曲ID+音质档位(用户定案 NCM_CACHE_DESIGN §2.5),旧无档位键温和兼容。 */ #include "../ncm_app_internal.h" #include @@ -13,15 +16,15 @@ #include #include #include -#include "minimp3_ex.h" +#include "decoder.h" static pthread_t g_thr; static int g_thr_on; static int g_want_run = 1; /* 线程运行标志(quit=0) */ -#define PCM_CHUNK 8192 /* 每块交织样本数(双声道 → 4096 帧) */ +#define PCM_CHUNK_FRAMES 4096 /* 每块帧数(≈旧 8192 样本/双声道) */ /* ---- 线程内部一次性歌的状态 ---- */ -static char g_path[512]; /* 本地 mp3 路径(缓存) */ +static char g_path[512]; /* 本地音频路径(缓存,mp3/flac) */ static int64_t g_file_bytes; static int g_level; /* 音质档(来自设置) */ static int g_cache_gb; @@ -142,21 +145,42 @@ static int download_cb(void *ctx, const unsigned char *data, size_t len) return ncm_cache_write((ncm_cache_writer_t *)ctx, data, len); } -/* 得到本地 mp3 路径 + 文件大小。命中缓存直接返回;否则 URL 降级 + 流式落缓存。 +/* 缓存键(用户定案 NCM_CACHE_DESIGN §2.5):歌曲ID + 音质档位 → "song__."。 + * 同歌同档命中不重复下载;换档=新条目,旧档留给 LRU 自然淘汰。 */ +static void audio_cache_key(char *out, size_t sz, const char *id, int level) +{ + snprintf(out, sz, "%s_%s", id, ncm_api_level_str(level)); +} + +/* 得到本地音频路径 + 文件大小。命中缓存直接返回;否则 URL 降级 + 流式落缓存。 * 返回 NCM_OK 或负错误码。id 由调用方(run_song)从播放曲快照取,与窗口解耦(§17)。 */ static int song_local_file(const char *id, char *path, size_t psz, int64_t *bytes) { - /* 缓存命中 → 离线直接播 */ - if (ncm_cache_lookup(&g_st.ctx.cache, id, ".mp3", path, psz) == NCM_OK) { + char key[64]; + audio_cache_key(key, sizeof key, id, g_level); + + /* 缓存命中 → 离线直接播(新键两扩展名都试;档位=用户设定档,降级产物也归该档键) */ + if (ncm_cache_lookup(&g_st.ctx.cache, key, "flac", path, psz) == NCM_OK || + ncm_cache_lookup(&g_st.ctx.cache, key, "mp3", path, psz) == NCM_OK) { + struct stat st; + if (stat(path, &st) == 0) { *bytes = (int64_t)st.st_size; return NCM_OK; } + } + /* 旧键温和兼容(§19 前存量:无档位后缀的 song_[.]mp3,含历史双点名):命中即播, + * 不主动改名/删除,由 LRU 自然淘汰。 */ + if (ncm_cache_lookup(&g_st.ctx.cache, id, "mp3", path, psz) == NCM_OK) { struct stat st; if (stat(path, &st) == 0) { *bytes = (int64_t)st.st_size; return NCM_OK; } } - /* 播放地址:从 g_level 降级,只收 mp3 */ + /* 播放地址:从 g_level 降级,接受 mp3 与 flac(§19:dr_flac 落地后无损/Hi-Res 真实生效) */ ncm_play_url_t u; int rc = ncm_api_song_url_auto(g_st.ctx.device_id, g_st.ctx.cookie, id, g_level, &u); if (rc != NCM_OK) return rc; if (!u.url[0]) return NCM_ERR_NOTFOUND; + /* 落盘扩展名:type 权威;type 缺失时看 url 扩展名,默认 mp3 */ + const char *ext = "mp3"; + if (ncm_streq(u.type, "flac")) ext = "flac"; + else if (!u.type[0] && strstr(u.url, ".flac")) ext = "flac"; pthread_mutex_lock(&g_play.mu); g_play.dl_total = (u.size > 0) ? u.size : 0; /* 缓冲进度% 分母(0=未知只转菊花) */ pthread_mutex_unlock(&g_play.mu); @@ -166,7 +190,7 @@ static int song_local_file(const char *id, char *path, size_t psz, int64_t *byte /* 流式下载到缓存 temp → commit(稳妥者:先落盘再播) */ ncm_cache_writer_t *w = NULL; - rc = ncm_cache_open(&g_st.ctx.cache, id, ".mp3", &w); + rc = ncm_cache_open(&g_st.ctx.cache, key, ext, &w); if (rc != NCM_OK) return rc; ncm_http_req_t req; @@ -179,7 +203,10 @@ static int song_local_file(const char *id, char *path, size_t psz, int64_t *byte req.timeout_ms = 30000; ncm_http_resp_t resp; - size_t maxb = (u.size > 0 && u.size < (64LL << 20)) ? (size_t)u.size : (64u << 20); + /* 上限:Hi-Res flac 单曲可达数百 MB(192k/24bit 5min ≈345MB),flac 上限 1GB;mp3 维持 64MB。 + * size 可信时按 size 限幅(防超额),未知按格式默认上限。 */ + size_t cap = (ext[0] == 'f') ? (1024u << 20) : (64u << 20); + size_t maxb = (u.size > 0 && (uint64_t)u.size < cap) ? (size_t)u.size : cap; rc = ncm_http_download(&req, download_cb, w, maxb, &resp); if (rc != NCM_OK || resp.status != 200) { ncm_cache_abort(w); @@ -189,7 +216,7 @@ static int song_local_file(const char *id, char *path, size_t psz, int64_t *byte if (rc != 0) return rc; /* 写后检查:新落盘可能把池推过上限 → 再按 LRU 淘汰最旧(刚写的 mtime 最新,存活) */ ncm_cache_evict(&g_st.ctx.cache); - if (ncm_cache_lookup(&g_st.ctx.cache, id, ".mp3", path, psz) != NCM_OK) + if (ncm_cache_lookup(&g_st.ctx.cache, key, ext, path, psz) != NCM_OK) return NCM_ERR_NOENT; struct stat st; if (stat(path, &st) == 0) *bytes = (int64_t)st.st_size; @@ -247,12 +274,19 @@ static void run_song(int idx) int64_t dur = s.duration_ms > 0 ? s.duration_ms : 0; - mp3dec_ex_t dec; - memset(&dec, 0, sizeof dec); - if (mp3dec_ex_open(&dec, path, MP3D_SEEK_TO_BYTE) != 0) { set_err(NCM_ERR_IO, "decode open failed"); return; } + /* 解码分发(§19):magic 探测 fLaC→dr_flac / 其它→minimp3;rate/ch/bits 按实际流。 */ + ncm_decoder_t *dec = NULL; + int rate = 0, ch = 0, bits = 0; + int64_t total_frames = 0; + if (ncm_dec_open(&dec, path, &rate, &ch, &bits, &total_frames) != 0) { + set_err(NCM_ERR_IO, "decode open failed"); return; + } + if (dur <= 0 && total_frames > 0 && rate > 0) dur = total_frames * 1000 / rate; - /* 音频输出:解码器输出 S16_LE(minimp3 默认);用 44100/2ch 直开 */ - if (audio_out_open(44100, 2, 16) != 0) { mp3dec_ex_close(&dec); set_err(NCM_ERR_IO, "audio open failed"); return; } + /* 音频输出:按实际流参数开(flac ≤16bit→S16,>16bit→S32;audiod 侧格式归一+原生率跟随) */ + if (audio_out_open(rate, ch, bits) != 0) { + ncm_dec_close(dec); set_err(NCM_ERR_IO, "audio open failed"); return; + } /* 状态→播放 */ pthread_mutex_lock(&g_play.mu); @@ -261,9 +295,11 @@ static void run_song(int idx) g_play.dur_ms = dur; g_play.err = 0; pthread_mutex_unlock(&g_play.mu); - meow_log(MEOW_LOG_INFO, "play: start idx=%d id=%s dur=%lldms", idx, s.id, (long long)dur); + meow_log(MEOW_LOG_INFO, "play: start idx=%d id=%s fmt=%s %dHz/%dch/%dbit dur=%lldms", + idx, s.id, ncm_dec_format(dec), rate, ch, bits, (long long)dur); - mp3d_sample_t pcm[PCM_CHUNK]; + /* 单块缓冲:4096 帧 × ≤2ch × 4B(S32 上限)= 32KB,静态(播放线程单实例,省 32KB 栈)。 */ + static int32_t pcm[PCM_CHUNK_FRAMES * 2]; int64_t frames_done = 0; /* 已输出帧(每通道) */ int need_seek_ms = -1; int paused_edge = 0; /* 暂停沿:进暂停已向 audiod 发 pause */ @@ -288,7 +324,7 @@ static void run_song(int idx) if (!paused_edge) { /* 进暂停:停 PCM 时钟但不丢流(audiod MSG_AUDIO_PAUSE) */ paused_edge = 1; meow_log(MEOW_LOG_INFO, "play: paused idx=%d pos=%lldms", idx, - (long long)(frames_done * 1000 / 44100)); + rate > 0 ? (long long)(frames_done * 1000 / rate) : 0); audio_out_pause(1); } usleep(40 * 1000); @@ -301,36 +337,32 @@ static void run_song(int idx) } if (need_seek_ms >= 0) { - /* 重开并 seek:关闭后重开(字节 offset 近似) */ + /* seek:flac 精确帧 / mp3 关+重开按字节近似(decoder 内处理);输出重开 */ meow_log(MEOW_LOG_INFO, "play: seek idx=%d -> %dms", idx, need_seek_ms); audio_out_close(); - mp3dec_ex_close(&dec); - memset(&dec, 0, sizeof dec); - if (mp3dec_ex_open(&dec, path, MP3D_SEEK_TO_BYTE) != 0) { set_err(NCM_ERR_IO, "seek reopen failed"); break; } - if (audio_out_open(44100, 2, 16) != 0) { set_err(NCM_ERR_IO, "audio reopen failed"); break; } - int64_t target = (g_file_bytes > 0 && dur > 0) - ? (int64_t)g_file_bytes * need_seek_ms / dur : 0; - mp3dec_ex_seek(&dec, (uint64_t)(target > 0 ? target : 0)); - frames_done = (int64_t)need_seek_ms * 44100 / 1000; + if (ncm_dec_seek_ms(dec, need_seek_ms, g_file_bytes, dur) != 0) { + set_err(NCM_ERR_IO, "seek failed"); break; + } + if (audio_out_open(rate, ch, bits) != 0) { set_err(NCM_ERR_IO, "audio reopen failed"); break; } + frames_done = (int64_t)need_seek_ms * rate / 1000; need_seek_ms = -1; continue; } - size_t got = mp3dec_ex_read(&dec, pcm, PCM_CHUNK); - if (got == 0) { /* 播完 */ + int64_t frames = ncm_dec_read(dec, pcm, PCM_CHUNK_FRAMES); + if (frames == 0) { /* 播完 */ meow_log(MEOW_LOG_INFO, "play: done idx=%d frames=%lld", idx, (long long)frames_done); break; } - int frames = (int)(got / 2); /* 写失败(流死/audiod 断链):置错停播——旧版静默 break 会被外层当「自然播完」 * 自动顺延下一首,流死时连环跳歌并狂发 song_url 请求(§18 修)。 */ - if (audio_out_write(pcm, frames) != frames) { + if (audio_out_write(pcm, (int)frames) != (int)frames) { if (!g_app_quit) set_err(NCM_ERR_IO, "audio write failed"); break; } frames_done += frames; /* 更新进度(~200ms 节流)*/ - int64_t pos = frames_done * 1000 / 44100; + int64_t pos = rate > 0 ? frames_done * 1000 / rate : 0; pthread_mutex_lock(&g_play.mu); g_play.pos_ms = pos; if (dur > 0 && pos >= dur) g_play.pos_ms = dur; @@ -338,7 +370,7 @@ static void run_song(int idx) } audio_out_close(); - mp3dec_ex_close(&dec); + ncm_dec_close(dec); /* 若应继续播下一首且非因命令打断,由外层处理(外层见 cur==idx 且需自然结束) */ } diff --git a/patch_v2/ncm_app/app/test/test_decode.c b/patch_v2/ncm_app/app/test/test_decode.c index 26a51f6..8e1f151 100644 --- a/patch_v2/ncm_app/app/test/test_decode.c +++ b/patch_v2/ncm_app/app/test/test_decode.c @@ -1,13 +1,26 @@ -/* test/test_decode.c — 播放解码链路验证(宿主):minimp3 解码 mp3 → audio_out(FILE sink) 写 WAV。 - * 不依赖网络/登录(输入本地 mp3)。验证:解码无错、WAV 非空、时长合理、RT 因子。 - * 运行:NCM_AUDIO_SINK=file NCM_AUDIO_OUT=/tmp/ncm_decode.wav ./test_decode +/* test/test_decode.c — 播放解码链路验证(宿主/mipsel+qemu):decoder(magic 分发 + * dr_flac/minimp3,§19)→ audio_out(FILE sink) 写 WAV。不依赖网络/登录(输入本地文件)。 + * 验证:格式探测正确、rate/ch/bits 按实际流、解码无错、WAV 非空、帧数/时长对、RT 因子。 + * + * 运行:NCM_AUDIO_SINK=file NCM_AUDIO_OUT=/tmp/ncm_decode.wav \ + * ./test_decode [expect_frames] [expect_rate] [expect_bits] + * expect_* 给定时校验(不一致 exit 1);不给则只要求 frames>0。 + * + * 编译(宿主,ncm_app 目录下): + * gcc -O2 -Wall -Wextra -DJSMN_HEADER -I. -Icore -I../sdk -I../meow_launcherd \ + * -Ivendor/minimp3 -Ivendor/dr_flac \ + * app/test/test_decode.c app/play/decoder.c app/play/audio_out.c \ + * ../sdk/meow_ui_audio.c ../sdk/meow_ui_log.c -o /tmp/td.o-chain # 见下两行豁免 TU + * gcc -O2 -Ivendor/minimp3 -c app/play/minimp3_impl.c -o /tmp/td_mm.o # vendor 豁免 + * gcc -O2 -Ivendor/dr_flac -c app/play/dr_flac_impl.c -o /tmp/td_df.o # vendor 豁免 + * (首行改为 -c 逐个或把两个豁免 .o 一并链接:gcc ... -o out/test_decode /tmp/td_mm.o /tmp/td_df.o -lpthread -lm) */ #include #include #include #include -#include "../ncm_app_internal.h" /* 引 audio_out / minimp3 声明 */ -#include "minimp3_ex.h" +#include "../ncm_app_internal.h" /* audio_out 声明 + 全局态 */ +#include "../play/decoder.h" ncm_app_state_t g_st; ncm_play_run_t g_play = { .mu = PTHREAD_MUTEX_INITIALIZER }; @@ -15,6 +28,14 @@ volatile int g_app_quit = 0; volatile int g_net_ready = 0; int g_host_mock = 1; +/* SDK meow_ui_log.c 需要(本测试不链 meow_ui_sys.c,同 audiod_chain_sim 口径打桩) */ +uint64_t meow_ui_time_ms(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; +} + static double now_s(void) { struct timespec ts; @@ -25,43 +46,45 @@ static double now_s(void) int main(int argc, char **argv) { const char *path = (argc > 1) ? argv[1] : "vendor/minimp3/vectors/performance/MIPSTest.mp3"; - mp3dec_ex_t dec; - memset(&dec, 0, sizeof dec); - if (mp3dec_ex_open(&dec, path, MP3D_SEEK_TO_BYTE) != 0) { fprintf(stderr, "open failed\n"); return 1; } + int64_t exp_frames = (argc > 2) ? atoll(argv[2]) : -1; + int exp_rate = (argc > 3) ? atoi(argv[3]) : -1; + int exp_bits = (argc > 4) ? atoi(argv[4]) : -1; - static mp3d_sample_t pcm[8192 * 2]; - /* 读首帧确定采样率/声道(read 会填 dec.info)*/ - size_t got = mp3dec_ex_read(&dec, pcm, 8192 * 2); - int sr = dec.info.hz; - int ch = dec.info.channels; - if (sr <= 0 || ch <= 0) { fprintf(stderr, "bad stream\n"); return 1; } - printf("mp3: %s %dHz x%d detected_samples=%lld bitrate=%dkbps\n", - path, sr, ch, (long long)dec.samples, dec.info.bitrate_kbps); - if (audio_out_open(sr, ch, 16) != 0) { fprintf(stderr, "audio_out open failed\n"); return 1; } + ncm_decoder_t *dec = NULL; + int rate = 0, ch = 0, bits = 0; + int64_t total_frames = 0; + if (ncm_dec_open(&dec, path, &rate, &ch, &bits, &total_frames) != 0) { + fprintf(stderr, "open failed\n"); return 1; + } + printf("%s: %s %dHz x%d %dbit total_frames=%lld\n", + path, ncm_dec_format(dec), rate, ch, bits, (long long)total_frames); + if (exp_rate > 0 && rate != exp_rate) { fprintf(stderr, "rate mismatch %d != %d\n", rate, exp_rate); return 1; } + if (exp_bits > 0 && bits != exp_bits) { fprintf(stderr, "bits mismatch %d != %d\n", bits, exp_bits); return 1; } + if (audio_out_open(rate, ch, bits) != 0) { fprintf(stderr, "audio_out open failed\n"); return 1; } + + static int32_t pcm[4096 * 2]; long long frames = 0; double t0 = now_s(); - if (got > 0) { - int fr = (int)(got / (size_t)ch); - if (audio_out_write(pcm, fr) != fr) { fprintf(stderr, "write failed\n"); return 1; } - frames += fr; - } for (;;) { if (g_app_quit) break; - got = mp3dec_ex_read(&dec, pcm, 8192 * 2); + int64_t got = ncm_dec_read(dec, pcm, 4096); if (got == 0) break; - int fr = (int)(got / (size_t)ch); - if (audio_out_write(pcm, fr) != fr) { fprintf(stderr, "write failed\n"); break; } - frames += fr; + if (audio_out_write(pcm, (int)got) != (int)got) { fprintf(stderr, "write failed\n"); break; } + frames += got; } double dt = now_s() - t0; audio_out_close(); - mp3dec_ex_close(&dec); + ncm_dec_close(dec); - double secs = (double)frames / (double)sr; + double secs = rate > 0 ? (double)frames / (double)rate : 0; double rt = (dt > 0) ? secs / dt : 0; - printf("decoded %lld frames = %.2f s audio (%d Hz) in %.3f s => %.1fx RT\n", - frames, secs, sr, dt, rt); + printf("decoded %lld frames = %.3f s audio (%d Hz) in %.3f s => %.1fx RT\n", + frames, secs, rate, dt, rt); + if (exp_frames >= 0 && frames != exp_frames) { + fprintf(stderr, "frames mismatch %lld != %lld\n", frames, (long long)exp_frames); + return 1; + } printf("OK: %s\n", (frames > 0) ? "decode chain works" : "EMPTY"); return (frames > 0) ? 0 : 1; } diff --git a/patch_v2/ncm_app/bench/player_flow_sim.c b/patch_v2/ncm_app/bench/player_flow_sim.c index 0f007bd..24b2d88 100644 --- a/patch_v2/ncm_app/bench/player_flow_sim.c +++ b/patch_v2/ncm_app/bench/player_flow_sim.c @@ -14,14 +14,15 @@ * * 编译(宿主,ncm_app 目录下): * gcc -O2 -ffunction-sections -DJSMN_HEADER -I. -I../sdk -I../meow_launcherd \ - * -Icore -Ivendor/jsmn -Ivendor/minimp3 -c bench/player_flow_sim.c -o /tmp/pf.o + * -Icore -Ivendor/jsmn -c bench/player_flow_sim.c -o /tmp/pf.o * gcc -O2 -ffunction-sections -DJSMN_HEADER -I. -I../sdk -I../meow_launcherd \ - * -Icore -Ivendor/jsmn -Ivendor/minimp3 -c app/play/player_manager.c -o /tmp/pf_pm.o + * -Icore -Ivendor/jsmn -Ivendor/minimp3 -Ivendor/dr_flac -c app/play/player_manager.c -o /tmp/pf_pm.o * gcc -O2 -Wl,--gc-sections -o player_flow_sim /tmp/pf.o /tmp/pf_pm.o -lpthread -lm * 运行:./player_flow_sim (0 网络;PASS/FAIL 退出码) + * §19:P6 覆盖缓存键=歌曲ID+档位 + flac type → .flac 落盘扩展名。 */ #include "../app/ncm_app_internal.h" -#include "minimp3_ex.h" +#include "../app/play/decoder.h" #include #include #include @@ -64,6 +65,9 @@ static int g_cache_ok = 1; static int g_url_rc = NCM_OK; static int g_dl_delay_ms = 0; static int g_downloads; /* http_download 调用数(song_url 请求放大检测) */ +static const char *g_url_type = "mp3"; /* §19:song_url 注入的 type(mp3/flac) */ +static char g_last_key[80]; /* ncm_cache_open 收到的键(档位键断言用) */ +static char g_last_ext[8]; /* ncm_cache_open 收到的扩展名 */ int ncm_cache_lookup(const ncm_cache_t *c, const char *id, const char *ext, char *out, size_t out_sz) { @@ -73,7 +77,12 @@ int ncm_cache_lookup(const ncm_cache_t *c, const char *id, const char *ext, char return NCM_OK; } int ncm_cache_open(const ncm_cache_t *c, const char *id, const char *ext, ncm_cache_writer_t **w) -{ (void)c; (void)id; (void)ext; *w = (ncm_cache_writer_t *)calloc(1, 64); return NCM_OK; } +{ + (void)c; + snprintf(g_last_key, sizeof g_last_key, "%s", id); + snprintf(g_last_ext, sizeof g_last_ext, "%s", ext ? ext : ""); + *w = (ncm_cache_writer_t *)calloc(1, 64); return NCM_OK; +} int ncm_cache_write(ncm_cache_writer_t *w, const unsigned char *d, size_t l) { (void)w; (void)d; (void)l; return NCM_OK; } int ncm_cache_commit(ncm_cache_writer_t *w) { free(w); g_cache_ok = 1; return NCM_OK; } int ncm_cache_abort(ncm_cache_writer_t *w) { free(w); return NCM_OK; } @@ -85,7 +94,8 @@ int ncm_api_song_url_auto(const char *dev, const char *ck, const char *id, int l (void)dev; (void)ck; (void)id; (void)level; if (g_url_rc != NCM_OK) return g_url_rc; memset(out, 0, sizeof *out); - snprintf(out->url, sizeof out->url, "http://stub/%s.mp3", id); + snprintf(out->url, sizeof out->url, "http://stub/%s.%s", id, g_url_type); + snprintf(out->type, sizeof out->type, "%s", g_url_type); out->size = 4 * 1024 * 1024; return NCM_OK; } @@ -105,22 +115,52 @@ int ncm_http_download(const ncm_http_req_t *req, ncm_http_write_cb cb, void *ctx return NCM_OK; } -/* ---- 解码器 stub:g_eof 前恒有数据(P1 用 g_reads_left 控制播完点) ---- */ +/* ---- 解码器 stub(§19:player_manager 改走 ncm_dec_* 分发层): + * g_eof 前恒有数据(P1 用 g_reads_left 控制播完点) ---- */ static int g_eof; static int g_reads_left = -1; /* >=0: 剩余读次数后 EOF;-1: 直到 g_eof */ +static int g_dec_open_bits = 16; /* 模拟流位宽(记录用) */ -int mp3dec_ex_open(mp3dec_ex_t *dec, const char *file_name, int flags) -{ (void)dec; (void)file_name; (void)flags; return 0; } -void mp3dec_ex_close(mp3dec_ex_t *dec) { (void)dec; } -int mp3dec_ex_seek(mp3dec_ex_t *dec, uint64_t position) { (void)dec; (void)position; return 0; } -size_t mp3dec_ex_read(mp3dec_ex_t *dec, mp3d_sample_t *buf, size_t samples) +int ncm_dec_open(ncm_decoder_t **out, const char *path, int *rate, int *ch, int *bits, + int64_t *total_frames) { - (void)dec; + (void)path; + *out = (ncm_decoder_t *)calloc(1, 16); + if (rate) *rate = 44100; + if (ch) *ch = 2; + if (bits) *bits = g_dec_open_bits; + if (total_frames) *total_frames = 44100 * 180; + return *out ? 0 : -1; +} +int64_t ncm_dec_read(ncm_decoder_t *d, void *buf, int64_t cap_frames) +{ + (void)d; if (g_eof) return 0; if (g_reads_left == 0) return 0; if (g_reads_left > 0) g_reads_left--; - memset(buf, 0, samples * sizeof(mp3d_sample_t)); - return samples; + memset(buf, 0, (size_t)cap_frames * 2 * sizeof(int16_t)); + return cap_frames; +} +int ncm_dec_seek_ms(ncm_decoder_t *d, int64_t ms, int64_t fb, int64_t dur) +{ (void)d; (void)ms; (void)fb; (void)dur; return 0; } +void ncm_dec_close(ncm_decoder_t *d) { free(d); } +const char *ncm_dec_format(const ncm_decoder_t *d) { (void)d; return "stub"; } + +/* §19:song_local_file 的缓存键用 ncm_api_level_str(g_level);ext 判定用 ncm_streq */ +int ncm_streq(const char *a, const char *b) +{ + if (!a || !b) return 0; + return strcmp(a, b) == 0; +} +const char *ncm_api_level_str(int level) +{ + switch (level) { + case NCM_LEVEL_HIRES: return "hires"; + case NCM_LEVEL_LOSSLESS: return "lossless"; + case NCM_LEVEL_EXHIGH: return "exhigh"; + case NCM_LEVEL_HIGHER: return "higher"; + default: return "standard"; + } } /* ---- 音频输出 stub:g_write_fail 注入写失败 ---- */ @@ -129,7 +169,7 @@ static int g_writes; static int g_opens; /* audio_out_open 次数(每首 run_song 开一次) */ int audio_out_open(int rate, int ch, int bits) { (void)rate; (void)ch; (void)bits; g_opens++; return 0; } -int audio_out_write(const short *s, int frames) +int audio_out_write(const void *s, int frames) { (void)s; g_writes++; return g_write_fail ? -1 : frames; } int audio_out_pause(int paused) { (void)paused; return 0; } void audio_out_close(void) { } @@ -250,6 +290,21 @@ int main(void) CHECK(player_manager_error() == 0, "err cleared on retry"); g_eof = 1; + printf("== P6: cache key = id+level, flac type -> .flac ext (§19) ==\n"); + usleep(300 * 1000); /* 等 P5 曲收尾 */ + g_eof = 0; g_reads_left = -1; g_cache_ok = 0; g_dl_delay_ms = 0; + g_url_type = "flac"; + player_manager_set_quality(NCM_LEVEL_LOSSLESS, 10); /* 换档 → g_level=lossless */ + player_manager_play(0); + CHECK(wait_state(NCM_PC_PLAYING, 3000), "flac download song playing"); + CHECK(strcmp(g_last_key, "1000_lossless") == 0, + "cache key=%s (expect 1000_lossless = id+档位)", g_last_key); + CHECK(strcmp(g_last_ext, "flac") == 0, + "cache ext=%s (expect flac, type=flac → .flac 落盘)", g_last_ext); + g_url_type = "mp3"; + player_manager_set_quality(NCM_LEVEL_STANDARD, 10); /* 还原,避免影响后续(无) */ + g_eof = 1; + usleep(200 * 1000); player_manager_stop_thread(); printf(g_fail ? "== PLAYER FLOW SIM: FAIL ==\n" : "== PLAYER FLOW SIM: ALL PASS ==\n"); diff --git a/patch_v2/ncm_app/build_ncm.sh b/patch_v2/ncm_app/build_ncm.sh index d7f566c..ab57ee7 100755 --- a/patch_v2/ncm_app/build_ncm.sh +++ b/patch_v2/ncm_app/build_ncm.sh @@ -1,6 +1,6 @@ #!/bin/bash -# build_ncm.sh — 构建 dev.player.ncm(网易云 App,SDK framework=1):链 meow_ui.a + 核心库 + minimp3 + mbedtls。 -# 静态 MIPS32r2 (musl sf)。自有代码(app/ + core/)+ core 支撑 vendor 编译;vendor/minimp3/qrcodegen/jsmn 豁免告警。 +# build_ncm.sh — 构建 dev.player.ncm(网易云 App,SDK framework=1):链 meow_ui.a + 核心库 + minimp3 + dr_flac + mbedtls。 +# 静态 MIPS32r2 (musl sf)。自有代码(app/ + core/)+ core 支撑 vendor 编译;vendor/minimp3/dr_flac/qrcodegen/jsmn 豁免告警。 # 仅改本 App 目录;编译期不改 SDK(patch_v2/sdk/)、不动 meow_launcherd/。mipsel -Wall -Wextra 0 warning。 set -e cd "$(dirname "$0")" @@ -11,7 +11,7 @@ OUT="$PWD/out" mkdir -p "$OUT/app-mipsel" INC="-Icore -I../sdk -I../meow_launcherd \ - -Ivendor/mbedtls/include -Ivendor/jsmn -Ivendor/qrcodegen/c -Ivendor/minimp3" + -Ivendor/mbedtls/include -Ivendor/jsmn -Ivendor/qrcodegen/c -Ivendor/minimp3 -Ivendor/dr_flac" STRICT="-Wall -Wextra -Os -DJSMN_HEADER" CORE="core/ncm_common.c core/ncm_json.c core/ncm_store.c core/ncm_http.c \ @@ -21,7 +21,7 @@ APP="app/app.c app/ui/login.c app/ui/home.c app/ui/playlist.c app/ui/player.c \ app/ui/settings.c app/ui/search.c app/ui/ncm_colors.c app/ui/chrome.c \ app/logic/appstate.c app/logic/lyric.c app/logic/songmeta.c \ app/logic/cover.c app/play/player_manager.c app/play/audio_out.c \ - app/play/ipc_media.c app/play/minimp3_impl.c" + app/play/ipc_media.c app/play/decoder.c app/play/minimp3_impl.c" echo "==> app+core (strict)" for f in $APP $CORE; do @@ -31,6 +31,7 @@ done echo "==> vendor impl (warn-exempt)" $CC -static -c -Os -I../meow_launcherd -Ivendor/minimp3 app/play/minimp3_impl.c -o "$OUT/app-mipsel/minimp3_impl.o" +$CC -static -c -Os -Ivendor/dr_flac app/play/dr_flac_impl.c -o "$OUT/app-mipsel/dr_flac_impl.o" $CC -static -c -Os -Ivendor/jsmn core/jsmn_impl.c -o "$OUT/app-mipsel/jsmn_impl.o" $CC -static -c -Os -Ivendor/qrcodegen/c vendor/qrcodegen/c/qrcodegen.c -o "$OUT/app-mipsel/qrcodegen.o" diff --git a/patch_v2/ncm_app/build_ncm_host.sh b/patch_v2/ncm_app/build_ncm_host.sh index 96e8693..1650f4b 100755 --- a/patch_v2/ncm_app/build_ncm_host.sh +++ b/patch_v2/ncm_app/build_ncm_host.sh @@ -14,7 +14,7 @@ MBED="$OUT/mbedtls/host" INC="-I. -I../sdk -I../meow_launcherd -Icore \ -I$SDK_DIR -I$ROOT/patch_v2/meow_launcherd \ - -Ivendor/mbedtls/include -Ivendor/jsmn -Ivendor/qrcodegen/c -Ivendor/minimp3" + -Ivendor/mbedtls/include -Ivendor/jsmn -Ivendor/qrcodegen/c -Ivendor/minimp3 -Ivendor/dr_flac" echo "==> host SDK objects" SDK_SRC="meow_ui_gfx meow_ui_sys meow_ui_theme meow_ui_vol meow_ui_log meow_ui_widget \ @@ -33,11 +33,13 @@ APP_SRC="app/ui/login.c app/ui/home.c app/ui/playlist.c app/ui/player.c \ app/ui/settings.c app/ui/search.c app/ui/ncm_colors.c app/ui/chrome.c \ app/logic/appstate.c app/logic/lyric.c app/logic/songmeta.c \ app/logic/cover.c app/play/player_manager.c app/play/audio_out.c \ - app/play/ipc_media.c app/play/minimp3_impl.c" + app/play/ipc_media.c app/play/decoder.c app/play/minimp3_impl.c" for f in $APP_SRC; do b=$(basename "$f" .c) $CC_HOST -O2 -c -DMEOW_UI_HOST_TEST -DJSMN_HEADER $INC "$f" -o "$OUT/host/$b.o" || { echo "app $f FAILED"; exit 1; } done +# dr_flac 实现 TU:vendor 豁免告警(同 minimp3 口径),放 strict 循环外 +$CC_HOST -O2 -c -Ivendor/dr_flac app/play/dr_flac_impl.c -o "$OUT/host/dr_flac_impl.o" || { echo "dr_flac_impl FAILED"; exit 1; } $CC_HOST -O2 -c -DMEOW_UI_HOST_TEST -DJSMN_HEADER $INC app/test/test_ncm_app.c -o "$OUT/host/app_test.o" || exit 1 echo "==> link ncm_host" diff --git a/patch_v2/ncm_app/core/ncm_api.c b/patch_v2/ncm_app/core/ncm_api.c index 30b1e27..3002983 100644 --- a/patch_v2/ncm_app/core/ncm_api.c +++ b/patch_v2/ncm_app/core/ncm_api.c @@ -267,12 +267,19 @@ int ncm_api_song_url_auto(const char *device_id, const char *cookie, const char ncm_play_url_t p; int rc = ncm_api_song_url(device_id, cookie, id, lv, &p); if (rc != NCM_OK) continue; - /* 只接受有 url 且 type 为 mp3(v1 不解 flac) */ - if (p.url[0] && (ncm_streq(p.type, "mp3") || p.type[0] == 0)) { + /* §19:接受 mp3 与 flac(dr_flac 落地后无损/Hi-Res 真实生效)。 + * type 权威;type 缺失(旧端点兼容)时看 url 扩展名,默认当 mp3 收。 */ + int ok = ncm_streq(p.type, "mp3") || ncm_streq(p.type, "flac"); + if (!p.type[0]) { + ok = 1; + const char *dot = strrchr(p.url, '.'); + if (dot && ncm_streq(dot, ".flac")) ncm_strlcpy(p.type, "flac", sizeof p.type); + } + if (p.url[0] && ok) { *out = p; return NCM_OK; } - /* url 为 null 或 flac:继续降级 */ + /* url 为 null 或未知格式:继续降级 */ } return NCM_ERR_NOTFOUND; } diff --git a/patch_v2/ncm_app/core/ncm_api.h b/patch_v2/ncm_app/core/ncm_api.h index ac91569..6564585 100644 --- a/patch_v2/ncm_app/core/ncm_api.h +++ b/patch_v2/ncm_app/core/ncm_api.h @@ -15,7 +15,8 @@ extern "C" { #endif -/* 音质档位(song_url_v1 level)。v1 可解码 mp3:standard/higher/exhigh。 */ +/* 音质档位(song_url_v1 level)。可解码 mp3 + flac(§19 dr_flac 落地): + * standard/higher/exhigh 通常 mp3;lossless/hires 通常 flac(取决于曲库与会员)。 */ enum { NCM_LEVEL_STANDARD = 0, NCM_LEVEL_HIGHER, @@ -75,8 +76,8 @@ int ncm_api_song_detail(const char *device_id, const char *cookie, const int64_t int ncm_api_song_url(const char *device_id, const char *cookie, const char *id, int level, ncm_play_url_t *out); -/* 播放地址自动降级:从 desired 档开始,遇 url 为 null 或非 mp3(本机不可解码)则逐步降档, - * 只返回 mp3。desired 默认 hires。 */ +/* 播放地址自动降级:从 desired 档开始,遇 url 为 null 或未知格式则逐步降档。 + * §19 起接受 mp3 与 flac(type 权威;type 缺失看 url 扩展名,默认 mp3)。desired 默认 hires。 */ int ncm_api_song_url_auto(const char *device_id, const char *cookie, const char *id, int desired, ncm_play_url_t *out); diff --git a/patch_v2/ncm_app/core/ncm_cache.c b/patch_v2/ncm_app/core/ncm_cache.c index 5a88d18..733b83f 100644 --- a/patch_v2/ncm_app/core/ncm_cache.c +++ b/patch_v2/ncm_app/core/ncm_cache.c @@ -63,9 +63,12 @@ const char *ncm_cache_dir(const ncm_cache_t *c) { return c ? c->dir : ""; } +/* 路径:song_.。§19 正名:ext 剥离至多一个前导点——旧版调用方传 ".mp3" + * 会生成双点文件名 `song_..mp3`(历史存量),新版一律单点。 */ int ncm_cache_path(const ncm_cache_t *c, const char *id, const char *ext, char *out, size_t out_sz) { if (!c || !id || !out) return NCM_ERR_ARG; + if (ext && ext[0] == '.') ext++; int n = snprintf(out, out_sz, "%s/song_%s.%s", c->dir, id, ext ? ext : "bin"); return (n >= 0 && (size_t)n < out_sz) ? NCM_OK : NCM_ERR_FULL; } @@ -75,8 +78,15 @@ int ncm_cache_lookup(const ncm_cache_t *c, const char *id, const char *ext, char path[NCM_CACHE_DIR_MAX + 32]; if (ncm_cache_path(c, id, ext, path, sizeof path) != 0) return NCM_ERR_FULL; struct stat st; - if (stat(path, &st) != 0) return NCM_ERR_NOENT; - if (!S_ISREG(st.st_mode)) return NCM_ERR_NOENT; + if (stat(path, &st) != 0 || !S_ISREG(st.st_mode)) { + /* §19 温和兼容:历史双点名 `song_..`(旧版 ext 带前导点所致)。 + * 命中照常刷新 LRU;不主动改名/删除,由 LRU 自然淘汰。 */ + const char *e = ext; + if (e && e[0] == '.') e++; + int n = snprintf(path, sizeof path, "%s/song_%s..%s", c->dir, id, e ? e : "bin"); + if (n < 0 || (size_t)n >= sizeof path) return NCM_ERR_FULL; + if (stat(path, &st) != 0 || !S_ISREG(st.st_mode)) return NCM_ERR_NOENT; + } utime(path, NULL); /* 刷新最后访问(按 mtime LRU) */ ncm_strlcpy(out, path, out_sz); return NCM_OK; diff --git a/patch_v2/ncm_app/core/ncm_cache.h b/patch_v2/ncm_app/core/ncm_cache.h index 46ae336..055eebd 100644 --- a/patch_v2/ncm_app/core/ncm_cache.h +++ b/patch_v2/ncm_app/core/ncm_cache.h @@ -38,7 +38,8 @@ const char *ncm_cache_dir(const ncm_cache_t *c); int ncm_cache_path(const ncm_cache_t *c, const char *id, const char *ext, char *out, size_t out_sz); -/* 查找已缓存文件。命中:写 out 路径并刷新 mtime,返回 NCM_OK。未命中:NCM_ERR_NOENT。 */ +/* 查找已缓存文件。命中:写 out 路径并刷新 mtime,返回 NCM_OK。未命中:NCM_ERR_NOENT。 + * §19:ext 前导点被忽略(新旧调用方同路径);单点 miss 时回退历史双点名 `song_..`。 */ int ncm_cache_lookup(const ncm_cache_t *c, const char *id, const char *ext, char *out, size_t out_sz); diff --git a/patch_v2/ncm_app/ncm b/patch_v2/ncm_app/ncm index db189cc703dde13ccfd876335ed10dfdac1caedc..2c08df6a0d3ead6ad9c115f833d589bd4e91e8b2 100755 GIT binary patch delta 404254 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

sj`wv%hDtQi%kFlIFvyWoZA|Gpp>v|txYt9 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 z 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

%D^)XU{hvbs;k+8-llWU@##x2n)j^*pa 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

DoCc6fU9x5Wx}rl_dEQ1;6ZSS{}b?; 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

ohr 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

Yl`W4>Zd2kn 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..mp3(旧版 ext 带前导点所致)lookup 可命中 */ + { + char legacy[NCM_CACHE_DIR_MAX + 40]; + snprintf(legacy, sizeof legacy, "%s/song_104..mp3", dir); + FILE *lf = fopen(legacy, "wb"); + if (lf) { fputs("LEGACY", lf); fclose(lf); } + int lrc = ncm_cache_lookup(&c, "104", "mp3", path, sizeof path); + CHECK(lrc == NCM_OK && strstr(path, "song_104..mp3") != NULL, + "legacy double-dot name hit (rc=%d path=%s)", lrc, path); + } } static void test_qr(void) { diff --git a/patch_v2/ncm_app/test/test_ncm_core_host b/patch_v2/ncm_app/test/test_ncm_core_host index 89e0b611f4c1ccfc908b2e2b90a3dd4fb06371c0..86b76b44f99632ddc5a5d220eb2fc1ea5f33fb68 100755 GIT binary patch delta 152555 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 imb7M|E=>GuZz$ysHBu-^L*CD z)=^uKwkb`ab<{H2Cn_T?8^JAY8Pk+8mH)Z#odM?5@9*d1XXbs+Id?htocr#*?=k*g zGW@?}xGaiSsHxjx^3*6M|K+Lb-uL4yc-8i)Rr5Y^?8``9sqIs1=TjK_2Z1xzzAnuUJFhO88~S^9=529s5NnC?Ez;BQGKRL*!1v zk07rkJf^GBAWs;F@y|s;U6_EeYmoa1UxK`u@QujLZ-jedH}Y)4k4Y}$&qf5XW}~G= zgbzhtO87M76@)KB?k0R4@*3cJ{D)@1ttjvjgKv=^CHxd}_GWmGyLB@WeBjRutvo`c*;_*CSTgx`kTgWM4s`&B5YBL>eS_Y+=+yqWM{ zk(;-Md%~PxbRavNJJ@g(*un+uYUD+P--EoA@TZYi5WW++oA5(Ahxn@@g6Kq}r9Q$3 zAU{fY0dn?Mc#jt$w-8>5JXdlV|DhqMMZpweFl~g~S;Ujo6^*+HjBlj@;6o%Wyo4g6#GJ;86pOp~)jW z4*3+qdm=9)JO_CR;iG};=}<-lQ_!G-@N1D*5?+kFitzc!YY1PAysnlk$5)}Cff#7W z1B5>v8Un&Ak+ZkMhhQD@=vHn_2h4>6bE`lPX7&hjE8!K$vk5Opo=bQE@;t(aJ5Vr% z2tpf&BEm!ah7!U<`-U>YL;Hpb!bAH8M-kD+X=6nZs?a1 zZbp44;msaH-%Yq*av6UfBB(JyaahJa6SG*GhhJ0U1k-G>FypEn|<3|29pupQE(DToW+(&p7@&Ms3mS0Xp>aJ0EX_P7iM)*a!z2)T{$Jmdw0TaeocZ_SPnci?ioc{8R*NPxTn zxts7BwZL<1M$ zWysxx7a{i&o`>8=xCMDY=Mev)^lN?z(_>e-CmN7j39mt(OL!&n0>aCX+uL)Qe?=&8 zwif`;L+&Eng4{!R^NW}rgf}4f6J7&c&;I}sRHA|T!*EZOA-57p2wK@DBKfO$jyY8 zAPAlx zUW45HakwWckXs2aLT)2GTXGqH1w_#NoKbNp;dRKJgjXVW6JCPcLwFu?A85+*{ck~mpBNl{5C5H;R05--l*74c$5J8nLV9ZCj9l4)y3v%{ZxF>wV=zy8<3go$x%lHqapA7{z zV$l2qdV+8d@>0S}kh=)CB6qjrdj2&$ZdBlHCy@E)Lhd7c3i1Hq3_1He+!HnHjPk97 zm#)M0e=ZSZqd@`TehocAcqMWt;RVQDghwOyd`{N?-nHlnVo-+MPk1i!0O3bfqa5=W z;hu0Kw}yCV{a=IvTS$QGe>3s|!s}c{1*L>Lkvj>`L+&Qr5qQif$U_8G$bE#{k^2d^ zAZK5O_t>`vJwbSd!5u7@2yAFzBfR-hqaZus9^|Ejmmqf$Zbk0aImCY`{Td!ID)15m z7jhrrQ;-J;XUN%C;hv~jZIo|q&t?9Vq9C`u0C+a?0>b?dqbCTjMD8TK0J)3sXyAJO zdx*gM5PE{}GUR^3bCCxKKU!gwWA=r6!j0VOBkTVn6xfJ?4S50K*~smLx85TNH>19@ zmFxXyta+8uQg^FB&VP*gk$VWQL+&HogWOMeC35z4xF?(r6qt#i1bHsu1;}lL=OMQf zZbe>7crAomjPMeZZK3VDEV7jjmwd!lXqUxos!A!toYJMvt@rywsN zJQum0a0_y07?Kav$Lqw7!)CA--ml554o9e3-VmTn=#mJ?YN$Q4Jfd;6F|FIO(;7EuSD)5ybQUU z@FL`1!t)%s{`V1q1q}j(H!sEPXbAU219B_jHOO-buS8zZK-T|dD6kWQBIHiO^N_m; zw;=Zr-uwV&M~H{k{|zYchXlC(uR$Ilyb`(jhj34nA-57+=4t;=Mev)^lM&h^uR_8 z8j#xwuR&f)cqMWd;bq9(?YYdqA{2Pr3xMY#_YrPE9w5B=e$0-2;htzfZY8`1xSs#H zL{Nza1%#I&w-a83+(~#Iau?wi(2#-eYC%j>S(IDmz?^x9WTxghypbQOi37>-8Mz{sJo$#Zj=n2AW zkh>g2P=NwB;YG;3gl8l75#Br>$DZ&yS*}_Y!VF?kD`{9q0+dYjh6rXKoA+iV8Ha5?+MdMz{re z0pSg|8x`9LZ@ouIF5^Gs>Pj?l5`!Y-Zo)0dJ%l&RGb;8GUWwe_j_dhXgaXzS?ghVvriR>CdFa|v&lYgAA`cqMXsh=6Ca0~JR!W(YZ%ZK-Wh@jFCFel+f$lZinkb4Mk zC^kCaBfJv1U*{12q4X<40XrPtV+(RK;SIBm3UUdrL~bLz2)VsIm-%NwL1}vd@P=7N z1unuXk-G^mLhdEpg4{=VgFW>A4-r&?K>v3n+!IB}t%O^U=Mvs9(mlyGaT!JUNn9%XPB;f2WEggcNsJVfvc3cQ4ip+*Hh!rw*i zC;R~N0O3*CVe>D#N88r_)#xItA!tp@t;n+p{{(p+;d_uzA>5C=AdJKKpFx2=Ou$%V zXb1@JioA^QzQ`*G&qH2Gc)sK^{@g?`0}VWc&qMAd{BGoRgg=VBf$(RM9|f+*e`p4* zLP3BSc#*SX;aTuCax>u}S6c`Vc{;m|8~OJ=7L?Z}(DUzSUI2f00*JJ_x)!=NNwz}`iJGQz#c zorKpTuONI?u2H^=@V&Y|#Gji8_G3X+g#U)zL-=XrHH0@KuOs{%a-ZZf{zI;g9&5C; zff(#dF}R=bSkw;?9*4Y{@P5eIuWf0p=idWZL3BHT%)gOnU?F@Aax3B2BF`q=jy#v} z;<32?w-Lb|XfTEF`;iwA9?~x&{2|mYA^cI~rN5H(zZ(T*#6UytB>XkxF2dhLUP<_F zE@L z@Ob3WzqJLOjICsY!~1_k&=(CXgbzh-C42<(T*5~q&m(*aa+}T}{zK_E5d~9-!BxnM z2)`P+o$&d{O9;Ond1-qt^RFBQ&h`S}704?HUx(a9_!{Jugg=SAituNF>-p~?0uLJ0 z5dJ)JFX3Mx_YwXz@&>{WAou@9*8kt5;3zRTj=Y)h)5zKH;lXttc{Jfc;UR(>QQ#$f7Ve}FFHm3$6EN0@ynyg?$nAtPyswuKo{GGT@WGPH_^Tj-VQAnY{0ii5!sj6O z5PmE28p2m14*=KWKQsg0_9xzT0^vjOQ)q2S`0vQggfGN$tb}*YGlDd`jT`yb0|mKl z0zLi4BDWEK5%MX7UxU1W@M7e4!f%H+5cG;lh+sJyloGxUxs&i`kXI1yLGB{_edKNj z5qyk-D#Cw2?jigzaxdWll69c(rVioyl#7UU&_--*1G@CT4P34a8+i}1BNhxn@`f+x|yNBD2U4G;MVZ~aAs z|G}FH_oAnx{{&CV_z$ID=%*CSQt&U_O89APP%h!2-*(9RAACwXuIJxwY*A4=fowqN zM~h49eteH0L$ ziTZZJ9Yau1N(7-F8Yv@uEb4m*{{egECHyDkb^p%c@BfM5AQ~Jc{3!Ck|KQoD!iQiI z>gN%D338jxA^t+?cLfRxh`}|;?S#)nUPAco$jb=74|zpJAit5qQ9KgQ;wft&CJ$g2o1#&T*1UyS;7 zgg+QM|MwBW6IhU+@W-&A0O9MAHxvE|mJ@wCe8@JTzQaNUn^9mTd>isy!gnCI5&jwS zDTIHIyvX2f>;D5NC?N*Nk(UyF2Dy`PjzQ`oyc6=uFb?CNjDo5#0b?1+YY6X;+)MZ< zzZ`jG8#nTA1`4X$1bX@vBli$~Cvq?0i;?>Xe-L>C;cJKD`u`{q zxY3}Q@M`3&IeaX)BR3QN5ppZxUm?$S5W$Zq$Rqq1@+pL$LS8^P$Lz2Z-Zhj>$XnO{ z78H~bgFeV>2>*S&G4*;0H#Zr-16W6R1oDP(4nN0<0)M!GokAWUyzGckK{Mft4jP;V z!-u96^(};-);j?4XC;Dn8;ydp32#Q8OL!hukVkkf@&dwpAup0##(yaN0*8%??Zn_) zJK@Z6N%ER6PIp z6G5n@M+tug8yX-yGz86rhlap>HasRm9kZMz>;F*Cti&MHvuwgcJ z1%s4|soI+h2Bli&a(x1KwS+sqWR7-r!HcQ6FB#oCO2nS2+S_;CG_~jxLu_TydMTj< zaU#zq+>Jb!@VZa5*$Z!S^u;HD6+~PVdNN4(L&z%$e;c`*@Z-p<2=8v(ui;M|h+xAY zWA3aWyb-yV@T|dxejVXABli*h0`dl(cW#?u4iDb)>7pm2mFJ_j-15Mt$P90)dfvp; z428L@3iA}(O=^aBqRQNn>c%iTP|Xz;YDpqn*SM>n+A8-d>bVOoqG{gL z+Qtp~Wxj!Izb zyz|(IZ%oW(7(}R}p>jXy&Vxb{&Q1Ep4-N6c_rFZ6T7G{IzBj{nra0^0hVLIJ?8F(k zPKaPvMx@!!+Sjw`w)JeQULN>@MfA6A_D8YJ36Ha_Pe-wFiS?TDB*{z10x zET|taB}04Csui=dumzY~dvs;rv3n}my3v!FI@8qsIB#j0E;agtl$jD%v%t(e9>K1f zIF2n?w$^t4XC-XUV7CX}$@Fi1JA zgTSIxD{$FI4u15Tx>wi9>-(|a&JODBAvyS5%B2t45|n$R)tliu+P$*AUyX->n#D%wPPN6TSA(%^K zehZu4+CYCNwHahqhz9#%R@(t8@fY`9&6sVp_a-*n7@W@PWGE-<;)m-`757;!nL~yh zb9Ye{h>}xKsr?45)Z0bPlRc1O<&RZI!1omR-UvO*SkYBYhVL@6{2RNfeZfwKw7ixw z$ufcIAr1P2WaEoM<$^3!uC3e6YC2qS$PYPi<9bV@M17bi_mSU|^zXLT?}^oEpzpmp zR9H8)t1KLBCWSoXV<*^+?L6a-*N#-A|2F{=p}hX4z7QIPXzfo>gJ5+aS!QH+J=jfb zd41<>w$6WLsD?x}ApHsnf8jCT`1B<^v@0J&j{Q>Q^E+*3nUC##=>p5a}K`U!lO-i2yh%o?LcK!hGB?zK8{N=3cW*|s^e zGuwQixc6#iw$)l0t39AMH|>_{eVy1kli68+7{CFOsrnFnMnFO3))X}#VnHTwCKN6| zm%wKx%rH&xU3xp>BBwEvxKq^sc9uiPa?*3z5bL$=yyr|+uh14eoajhV`Q$VR?6m6J zLD!#;9kHjWPssAS+JZ6`Gr6-q!`5Bh06Jb9>NvZrkD|^UUBLenL$*Cs8PBpkvR$F_ zWxFz@{W#RK^;92lfTFBGb|k}^u6_;I*6EmC_H^}bSphU|6I76HWheTLVbgW*TCM7x zAnPqVzJjTZrpW44y_~e_Nm&^xyw@7clO2k;1v4QGWgQvbKI#Hwi=n*64z{2}wo)2| zJQoDdhdgGxqMgV58R~^|ZJFqXLYrXf(t9WicV?>orr4k?CskGg(Wijd^ore?>NI3o zP_fj}8)8axR7=;TC$JL|W)Ef4Z8n}a@fOW_tS|_5M)h z*1_s$+KDxZ4!D!*aWPo!-Gi-@-%mlZ$l=eh=Bm>Bw}Q>Oo<=9+og>3<@M7S@p~55J z(L*pA(yLK0La-z#++~s@l~g?f8ntof1XX%}QzTm_9cLslhj?W<4%l}rI0s+Kz3ZNA z^U_fDGAJBouAJvgY{72>+l_#AxcVQEg@#y;)bfGNqgrkK!`1O1Ke#Jel@(_|1GAt( zvN7*;2=8DM=#0*=j?{aZ3r33=8{ywIWwdQ98zBqSd+Rmi*&u&%7~XE|qt!BPyvs6& zjZsa|e{J2RRsa1LP8Gr%3vr5QG^b_H2$FCbI= z70c^qGIrb!y=~Ql6;$Lo?QK_9=NvZOs!yRN^>XbOS6VFGISc|f?aAk~I5pE@>lMla zSP!);-d-H3ukFT`?--xTyyIu2kG*roOK;yf$#l!J8#sGQR%eOujvrmIW4tAO^qrQM zYVPD9+rijdvlmaQ&Di~5;iN9F-8GZ(dCnnNhb>C&*{+TQ@mFfw)kFu&K)Jnx8rM!P z{b_HCRWtk@)CAz}s8Gs9tI=?MAnm4F_Rv#>cILioB4hKGF*eZ&W-=|6W41_|21{L$*S?f9oHEy*$( zWgGS3u`;!+o!ky`1%?geK3(n}qL#LkccOCEPc4yh2N=mU%NG|~l3R`aebrg*j5mM` zD>n-F_ffBFCs#rKgE1q^RK*5lsRiwH?gSm^n2))w>a*>*1J)vsodK` z9n(%8N#*|T>d&rbTfyZ`D0=8VJDwJ}iMDD^|o zFl>ZzYjqRLQSSq}Vs+LVtIfpf1u1ex(OuWcu;-{fpvQ9I471eMRy%i&IuGm)!hNnu zzu(E_e3GL&(g`~oSPK=U!paV&wZ@OHuf2H~Q=4{OU)yHfU%dg08-ZnZ)Tcflvkg#R z1~vv}3E7E#(9p1H#yLv866B$d^bU2<8m&Il${nnBurc6}{z<9;!7jMA|DAtd`qO;D ztS@m${E?~)WQ*Fn-`Zat)mjj%mGhvHtR2+{+wpWLFKmkP4pjSrydLzsIP^{JKz&mi zw@j{K+BUP_!Sz9iay=$&9o14WvLCk9I=^fgp-U9oUZG~%b^HWN9&AQ&K+13xRJP>RV<3Pi0g4wX)lAw*Tt-a2+ zBx|<)-8J|6r=UW%GPnmo^BR|KkI7%+eo8L&x;MkxQeg{V4Le<~zGYWu?8;Fs z&KT{uyT`4&!QR_}ZH1+rULJHikPkD<7O3k0+;bY^87#cxtA7PO=L`k*Kkf9qG3sWb z*C_RFB6|K9^*L?921^9%q*iK=Zs^CtCx$qR0!Dk>Q&m;8( z$cA-fTN`023st&AJHH|AzjuSJGrD<{v{~LLxBT(drq0g#CD;`?a?&Cn<{K%y74-cK z^=C&K`jA|u+N_Q9_;~G$jmar*f{y!Ci(IGqGMzE1EL+-+)6Q>9=99I=O=J1<+EttG zH#$jyG((;OPcf-RF-@Dpv|^T|EZ&Oit$EC>ZudponO#hG#?2_ZL` zt8Q)9^OL)oKtrDJ+#SV&-qTCJY0=(#esIPp*tH*o#iBj3dDP9ROb@NbCOGr5cT(-k znJTo%7cO<&0Jd;&5wu6yg4fCKP=-Cm7Q9A&k72>}5O8+I7A!=)$MHIWJL4`#=4!{L zAd}_&M}Eih^5u6Z??KS*0N-VqEBsr?aCMLRP3F#4_+M6ZQ5y=_0lWqWeod^nfjO( z`BE>%)(|p)2MDFh#3$zIDsx&1Krwyt~a-4zUZ80(m zKCA|=fgA>r7K5ipHy{EvB#=ALK1mWBTIqZ>nHKrg{q6=Wih?FCZE=}ZO-RswczGOiZ@o9U!BqI_P^SV0n8s&+J@?0 zinXiuarJBqjKOcv=#w%zVvG(s!2won(#zcym{4ZE+*9#)(Ht+QTAW?g1Zb_yaWCec zRE^Nyco~-RUDasqirT|7zH`MBvjkM*hqbuhzZrdc7toU zX&H%`P(4Sx{FStBPe5zs0mwS}3B6yd-S_L@}_>|gUCB;+}ctn8UnuquI1IRhwgF15G=Q_WFq-3LnAakpIf z11|!d^miwmc<8)5`ZV-p+-ETOEmY7w1Pr#4zH+NsOM5M)+X~QcAKV{k|9Q=-*v;D9 z*JeksZfd0V#cNsJPJx!}$e;2PhB2V=*9Y@gv>~t0<+o|;U+*;uQf)V+)o!!%$wSaY zql#{N0G?VQ{bQ<@U13=ja13c(o!Guw(7)=GcH#AmiN1V)Hx*WUawf{Lc3~sr;K=67 z^W_YCoLU9`KMgW>7h{}daQa~$%Xh}92hG||o}?MaVMv^i8|7eX#C%dtzB>+*DxwNC^AR3PEQYiocgYI z-jjUANs!tzBjA42P6~@o4^*lr4^$?tevx`fN>DoWCUoiz@-xjAoB^LF(`E%vrE6Eb zl&URxV_+0aR^VOj^*4sbvd-##F#Scr`QvVPC+&|n5(f;%0tR9M{aXu|75o}>Po`x+ zVHv^SPPPbPo*23S6I1OcwLx36B3OdDU%Ps1 z-)^sfTn>=5^>?xbtF%YA7DYG{V88my*6w|63F>RdL{def_Wmr?_ zBv!M&wPS!cLH(d4D^E^wp`>CHjcDBbXLu_PX2f*Qu}n<75q~zWxFG#Hz>-bvA)im3^NWS zg9#>=&$TzU$Hz{C2EZ+(+P-w@HwAxc_1gzct%!x`xl{8fnfQgYtyFA$NFT5+z#LCKpiI8xZS#0O7&cn&wV2(|Cop?49miycQLF0^1pwGf!yM?+oG(Yd^fxpRdv)-z|^!Thykmu&B}0cgHC# zOZ)2G9{;hK*!1&@-`@O^~N)wp!LXAuio&Td)BV z8&)y(e$ZI}I&yz^0KUV1OsVdsUH*Pr^emaNyJA$~{D~(dEQAsG6C5=SJ_GRC0gN>7 z`+59FE%<)=m`bQu&eVQ|jldg=ryL$0n5MSnm|f|pE)B@FT1PpPdosK!>cau8@Pnbl zyU1ovo3!~flq~&zHH>RCvJ=3hYy>cw(ygiN`Cz!x>4bLpgTjpSi{IY70o;=T?vZY5 znH>9dCb*~ZV;)qXo3OC;COgbfIizT{EuL+)D(?EfPx9a;!2XuZ%(f;%qh!Fo)tI85 zY2v}=BRpsU>)>%7Oo1#t`v(ug7R58el&anVcFst)bz%o_Cfso^fyqwV&IRs`U|Zua zleap#!Huup2xa^y(4w93X2eE=9HtF$w4y!`(E98cH1s+ScZ9)kfC=&Fk1}tzm>6sZ z6RIbJs{d@uTe8CwVVx-1$qvt@UKP;R>_}2p1+*7;-ht;Z`6` z7Q!{GMTXmfxzD$3oe$T?L4P(3zhkNb8xWW{O-gkmocmg!N;!GjIU6DM;kL5181$u{ ztWt(*GU&)ug?`1sXNP2&$JYe3W4kgFuR>iJT2rOlz~-oy@!_&^m;~SVfT!dbOD9VQ-wXO)(?7@W>OZviKkO5m3}R#W;;SF|L;Lf?%(&|T zxz8EHBukk0ht}t#*~&G4Xb*ohl6$osA0-Tw6+YKip;YSwW=`dw6-E4^DZ4X!e*C-a z1yer)HK{K90XNyV9DYID{PFdCpB7m+jc?ShtGiUW_IK^Yx@(mCe%CJ4@isUX)-jla!_kAjq(%-bW z&nEDL+Et$=D9#jZ?q>^>p1*C```J>i%>GTA@x@Xl|2J*#7c=9WDQboj7EIkQ`X-}f zc3v?kU;3r0@ZYrkUw$A>pZjV~^7da_#10s>PR{LX_ifs(-(26Z1tjuW#(C|FZzlKn z6|auT60W~`GlSUr4PxxC>k~J>stx?MKyjvOj&I*k*l}&>cP}dW$F;rR&F=Ekv5=D! zs`qOD-IJB}1`wD-VMUObV}}Y)z%_&LVqS~3YR{aQ5m?c%{v*}81L2ntR=H*rA;+;aF5n|2VEyiG9H zjU3KvIxerzcSmZ|8tzjbJf?lwuu!q5YmzG!!cToHy)NP8--z@d>?N&|Od$ls-7wy>Iu^s(Z{ps<8zi5N@ zjqT{Qs)y29u=6qPu6<@I)j zt)6(e2wV$tsd)m0h&CRWs?0j7{eED-5_wenvhmVLdxpB; zsMfP-WZbYLG6LeO4@5c(pSx{TUf-kIElqut-bb`GO+EQ{+N({MD9J~((@hJN%nWVb z!6y^F8Tv*xv{v++Ca5t-wA4daz|Qp6L$C57TapiV;Dz;AAQ%7=Q;MDaw zcs7?Imk39OcJybcN5N579NrRhbUv3-2TE7`GAP=brAr&N+F!DjoxQZCU)C$P9@3T` zOY6dVsc>R3+TYg}eC)9H;;~_oV7u(Fw*Oe4*h>z9J0qNh=_OIrJjYC1P;K_&jE;x3^*4)07pRS!`Xre%hdb*X4oSF=TMeBw!IQcKAxGB1m(fw zHkfi#t0#4E7S5cPnb#4jf^xea+LH8Zx}x}dX`_DMAIGxfMz{JYID6E~hhFym<0`&a zyYG)J%7X{BL4hIMquB$)744w*L?8n$Y65x6^n==;f!-*Yb5OhD#E@v%(V40(S-rJY zC;CBNzj5LcW%)tv?1@3j!%bSwpJQU@H_18I0#h2i^>a|W>(3{7sn+FWa*t%03*f~r zaDXBgAL%T0-YcD;XE1RUYm-hUD>28k87F%xYnrtCPwwV^ZPKZQ%IYR<+o_fOBW?U& z_bT_o#a|nhyBf6_r>{_Ao3!fFdlYMvw){+v(xY+9YiDA)@=&Ape)Ar_Y0Klm$y`wy zwY_IA@SR(J_Op5$?X~+uC&(UX3(CT19A`T4pEO?!;+@Gz&x!w5<;ys0rQ*8aj-wMCw-ROT-SlW+^uE5aVMAs!7Fq8Z;=?yujRjqJEHl$e4jWJ&9CPlib);$mCE$}Vr@r$ zixRhAobAZ(QttRk+!@2KQ9A4wyJPr{c$f6c3-GMI+&UIs5OS`)?I-bMC%!AbslR&4 z#MN}>9Pck4xcV9cwLc=+u0XnDO{>OY@3LcG(NrzEEVjDefDgmI6q ztUp{lbhQ*72cgpSClS?!59#ERb4K1gv67TaU_IEyR8J6QemH<%xHT~(`C;qeaCnBgBRI(6j(Kx)fX z4^XK+S6tbZ=YrHeLj8(L-6MoBY`r7Y_o)=xzppFQ&qj()W}a`gjZ~keI?j1MeoIbwC#QJW0eplINV{AvS&hYma$#HyAs-7ckfZRn2!Sua~3#A>3!>>uyKjEzffM0R7JGFCMa54(*zKA|{?+tGEY<;&?uq zZx+wQ^Rh_iKy~Uqk($8M756|fHi2jG^Ww$?K0xsg6sr>;zK@F+5_pkf9VA*3c)nuO zKNCe!A|EJ66JVlvTE7@|l(P^pr*|T?Cbg$ZuAyrWqxrdFbrK&EvjdDX z+_~ziePVYKpQ=>s6>-UYP|}jUEn>ZrvifJG`*B!R!`Wi@>WO>BHOc&XIU8(A=Dm9w zK3ER#o+Ve$iDKa5QLQVOX?w-#WIj9fBPd_$=_$sB=|doWG<>hP%fd$~-u~ic3-2k* z{LI21=qPo|{g4UbsubQgLz*9$H#?XLzWOKeMG8;utrxX$b}%Xd_GPfCcmaZei>YDc-2n|xU<_{*2!P7yDs@*#z-=FZ`|xs14VKfv7@mTdA)km;Uw zHvd;Rn1xe6se1schdoyy(mgE#vC^4x>OLXayf z28)+^!1T09eAI(yr|ulAs}G~7iK$-AfO-+%gzgtG+KsBczF5r%kBV$0`u*%u^)-mT$c4CA0-3rrzPna|Kz`nNe zdSI5bRAVNBh0eL}p%3tR7D|(~&w>ZH;^qvvHBW00Ph{w}H5t5rL;%iX#E}f%quW<# zqU6F-WePM{Bxdr#1I9uL5Su4D>+eb@=JbVYS#m9Wp3IsAkAj_Xr}|C`>NS*R^4wGp z6lB-eI*B>mKucexfyFfq;_XbhJM#vyKa=N=xeWBu;pN+9uxU92TLDwPvwkgs0dre!i1U9Ny#~ul|)~Qr`rb97k&>wiTk%w+H^8X&kTa znLR<3M+l++GGvm!7k&Eh8C^VJW4x}MSpA-Ov=2{CdL63s{@nscE2-60AeNoIWsi8f z4WoC71j zn@v<-fLIK9RC?N&?c{@_#Ogcth&6rr^#fu3E>(83^>82wVdtNq$|uyJhci<3a=l%N z)m`_9q-?%cN!lZ-v-v34(6pNBX7Ffg7vv_yUYy*&mF*EqKYn?pk69wiSPRJdm?13#FYbhKjn(=#Qg*Kwl42}3xBt8+weSD!Ui#ZAfK$bz7xv_LZuIW zCte!}Isc#U#Fqp4Ym>rTFM=R_5L1T}c)x8mW!e5tbS zTlqI2!kWuJj({m4RUFUdy}HY95L`?>zj#L#{7`L8+oX{y`VZmOLPG;y&uOo*3#JQs zzmeft3?=A)YyumNoepQ=Ptc)u@<6NH28~?mEc{M9GlbuksdIT&isb}~;YC2b9QfRr z>@0j!^c%|Elc03a@EA3rhEq`+bDV`MjGFWo{8PuIHuiTG-v6zL8OARO{e?`c8oZdP zS7wb+ciQ14zi-7|!}!8~s6kC3wZ>V_!m;0qsNsC|Kh*rFW{*^r8O}oUx8lv=e2W#@ zjy*KmPfFV-9vs1ED#_n$KRkl3QTjYpuX`@MKg1^K8}Vcw%pf~cx9`g1ck&x|w(}3X zNvgLNUKLXEorRmByr%YY8_Mlb>c*R#g&Y2t+#03M2KoB>?Q6#HpSh#`7=+3|oz#D8 zv$f4@(z)IKO(#?iwj~;LLX(&LJiqt@{Q<H_qug=bL7GCj%c>7BJq+`?PFe`)H)Lz%$+0cdO#*IbJ!k%CJKRUKJbtC8`f(~S$ zM`j)be0ZJiXf;38S=jlXI*zu6!3%1cpk(^D%2+3Cd>3`+1MpDd-x?j#@pe`lmpBVg zfKI3(n>M1o+pOjfbQT_KwRf~@Z74c0$_}(D{fiDpP{Y6Jz>5HSfVjJ+EL`=kO5s!U($B@&LjETILcBVS+vOD9S{xa;q5sybkPZ%9zt6=L)A_K_q}p1P zwTs~@h=GkWorMXXi;dG^@7ecradrB)a>J+M&1-o7 zus+&R)0(KxzSCK_^s|3+J?gj<)W$oUg?E1@dR_}#qY0mGpK&eB3XY;rTf}l$-ycr5 zZEpOlWyC+m4uVK;4m=1~7CH-?L4P6q|A!vAYySRkI-#;yk~+K8S$OEvmW%&cP)Ny} zsP3HaEd25RD+nHarLdC%2|HiwWg%|&SI&%0I$?Xx} zEFWv1DK>2m&WqUm_rl1{d1#jzmOi1v!EGDCP%00CzTLpD;eqYy4g3sOl0Mn~@J)Oz z?;jeMVs}?{WEA1JR`9W0J++q1$!pBd03>_YEOsnEi7th@%W^t zKn#WF*v_{McSFGoqn&Zr)QKl&@yns~qqBH6_lRz@`NUr9KvTZ+dgSyrw z!Sfbq*0NYzaCw}q_Eyl7?SUb58JL9^dU+5Xm<=WDzF;pA@}|xll&biT8^k zVV?Y0oGpee^OBFn(3^Q5epp<0Gw-kTuM;cbvfHCz?a!KYADrA4PJ*T%67Sv2(-J4h zLSbX*ghCHYhQ$HAXYz~q?PmT|%4;A}$`ayWmy>f6I=Kw2+9THA!mm$U z2$u3yPk6<7y1%()l+=D(bes!yY!SWZaxF3+G;E^VMj$)I4|93{r2as>ym_P@n%xcl zc$C503}ZePsU>`4%q*xvmT~EBvAcv%?eZ&JTTL+Mfqqc*xRno6Zr&{lZ-sO2nIH-k z^8%b+%VNG1pWMplD!IGG(A)T!m@cw3s3m>3xaT%rs9f`r`1CfuDz+*|odsRo2+^B= zDo4zm$M1^m4mSq4mRz!*=fRd_dVkR}k7xEdoul3}jIERBY=^)-v*B9q-Bx77K>+AK z4|e4r_7|7j&ikaGY!lq{GeWX+{neX>iQkv=RN=mz4~)Bg0Gw^J>c6htM0(PCg`F0@#V>l*8d|@oJ-n z^!ac$3?*GTpZ~Xm-j&i^@!Wjg+qif)S9~^~XBZa=L&VAXypQt85Rq2OujyGfRGnN2 zOK?bnm9U?b*0TQc=Ao)={9~m&w{xI8VX!*+Nu#pQN_o#X-9-u2QhRa@oWy@SQv6-Y zr$+~hpM@)E%C!r4e&$8P)D!UFYq{KmL)qy}Ild82o1|6N21D?^-)lv@0rvrsvcBX%v~7eyO#mM6O2%`XD^(|KysM}~an-7vyLm78mOEOQ?&0=m-=;61CDTWXdH28}hItpf3<8sof2=JC zXO+jjhJSp}RPoL|JUiOg6uC?`TpYiLkBozc%CMCk$odY7`F6Azb}!F{;u}VYnfJmI zFWnI@-^*{x2i-ZcWYFLAv$Ie})JG6Wy0aR_s4?Kcl`!ocf}<5^x?XM*>ghV2$BIkK zc%SxlZt_E&wy|PG8P7I@gS+RHzXH#EnhYnrQ^svQeTU)LqC7BGZ8``Ge26M}q9b3r zb~ehrf69IQ;sIa@e~3AJgxd5g+?zpXHhN$tc)*Pw*!7z}VB1&U#~G%eZ^gt70OL+d0?C>Z>{p4 zCU38Q!7DhB!oEpH#)-!s;8wG*e86~h7g(H1UlS+u;DZPFlpB1-u~6c>B6317;#-XaS7+k>%N4DwvnwEh6 zhp;^WXPlbf znM#aK&V85<>S>Kri*H+2DBpSv*-0DIJg~8M6z}MA^xt1S0*fyev@T8-o!0Qwc4c{*CPP?&Cr7P;dwIrt;-)pcXYw8I zwum_p|FZG7+ynQ}UI{8VL}+WE(U)}>->l&yW7Z|8n`T0e0gr!-4~jjNpss`t7k`IQ z^BBKoLTQp(ynk8YQE;d%>yRlqr#u1JkGhT?L^2Q_$$`If2OawiIg49h_OS(JxlND3 zdK5m>T|9RGz!h&{Elx!*DN% zgkO~@->U0~VwDew_RVRu)t2{46+#WIEQ}d%*9EAxCRKc_@}=#QAxi=0n|rnosCF;{~`eaR|TY49#d&v!(%#{0MPl&9$k*feB{BN`tX1FxfH{b2YgYaL&% zSklEy>tG=RpMR|5Q}r^-(#6Ebq0Dg^V&>z#k4%PgvsK--Yk8r3iT5CkP}V0#8P7e= z$F#4jxC!d=Wr*XChX<$WAn=TefxfPCE)bLz`iPV3d1m3! zKB{$VU;U5I{(^qPNr#6$-$#{`ivImvZ}pGR_W^xW`P@_IVDn4pdtP7laOitUUorPd zez$UCt=Ru0Pm24w)_CK^*+ssnn^rxoRzy7oeOq2Da-IVJ-(M@HKE9yXH{P%4 zy29_~7UljLan{XyM|xlj<`ca(!21eNzFyx&ux;AF@0zT)FR40f?TXM=$W!jjQJ;k0 z+L3x2WqS_Fd`_yK3_3DfF2K)*z|^SzvI73_O&08(3v~^w5ra1J&l6>TJ5~ow(eQg$ z>3d)n3q%je5nVUIUD;|D{WtMy1zt<~eiKCAss5tt^Wc3~e=+!ZkY}33rEnc}#Q@bZ zZ-AKpJfGijpb9(mK!$6eIPyFU=&bGAZ+d}`=K(XBe zZ$q_$B?HAt55Fq)xvg-lFcNw_lm%HfJVlqUm&5h?t>UIP;DOzmt>WP~Agb@#DvrGY zudFQIB1XQ+b5bI}&OQcidCeSdJz2e7mQm_GWfm-*rGRW!Eb@drmTBYKiGk1wh7f& zu4U__Ut}FkwafKLEr*{P3zYi?ioV-;KX`_E)i$0jqipduKD29Kpt`M#Gj14^2~q44 zo=21f;oHU|l1+fzpDJoy5F824bHY;g|0p~AxSH?(|G(d__q(K0NmnX$x{y?oq$|-; zhGC?&t&cS##%QiLjp(F5#PcxrsVraG<8#}q!G|U<{jb>(MQO3rmS>~eh{ykpr zQ{waa{l2&F?~il4zt8LX^?Y4l3l))c{ZrA;&)8e5a(IE*4}E^P?xC4UQPjgCMs^N# zQTV>F056D)Z02tI^dMIKwo~`dkRuXz(~8f; zwG-ieA#$@eL_v`1w(;R)v~tT2LBhdg(M^Bv3nuL4`aBW2(?@o~OjciOV_&e^^(xGE z#8i6Ysg z-#-__Jb&N@SHPfPHMp&3@o8>2{E#?-b=pm<4~ZYjTHerCitB=#`zkphMd@6eJoUN% z0f-&-Ah&HE^AFC846{T}|PC%TvFWm2@BYZAI z#MT{tX2>YSQSwn#i|}LNQ8C!XjJ#kDzztJIJ(eVDW9g%#7|c~K;eIE@(GN$(tp(^X z`h*!n6O^J@V|p_N)LfVQ!)4bMmqGE+Xp;%^Fz8-dlpYM3pw2hf_CKV#&v_?ZNLOns!X=)*6+HI9hW|^hkj#K{JZduLOy08LyfP z%XlqLnFQB(K-De5pT6Zg>9@&R2ISP70fGhGdwYD;eHv+Y4PD^Ak2=4(-q7H zJ~YGku)s`sA&)dKShLV&CJ}1}a_0uOXt6}}ODT!7-_V36E>sSeaY)rx+ z+ZrtO1TP+%{l+BfaZ=3lH4DhvIv2Fm5GwD?i7}Y9LsSKQG97>kM>Ee?e5lR~Wb!xS z7}pF0j~}Wx40l#USPT7twtRz8rfC;l{ziO>&x^s|;DMTr=f1_b0#%h3@zSDnQLY?Y zxTV8uf*oeVj01_j71MmJHnt8_0*4}xZz)RuQOifT(Qjx^l1_;+c4n@_g_(RxjM7z? znTxFRX?DpE=W6&o%{qj23rf+NQ{uQsMK0}u$d4wIdP-at{YX-z?t^-gi&l~D!NoSX zJ=Tqf)R>j5NV}~S5_iv1jgeCp>{p9{);=}zET$)5wjt=r`3og*2w!BGjk_%U9{q~7^e*dA{c#j8Z#N~{#0xJY+|II79;I%Fa>V# zoKA6PFw+8a#u$kT&S2|ss~z5+7P&oAv~wkDI)m(jnV9}H82H7=R8WH+M7~V#*I-Zt zw@%eyVy)G!4&RHB+BXJ_{l6Cze4dAhvoUJ-&%~W+m@eY!wS^l#D$|z>7w;M zvdEZzlsZ2r2a)NV_#JDsrJNrz9fUkiKZ?^r)^t$5Wct^-VvH{)E#J0{yApWL zhbMJ}u;$rOkMj^3>`Xr|PPFBEf*qYXFOFr+cGUYPj3N+^(Lad;qpeM|d7GVs*5Ds` z$EY><+mIPrI|C2(QlYm5_743dj&ge39{F6rmcIW`8+`#AbEkGxir%%_+kQd(&~`^h zCE#R7dj4ne)3)Y6=WB$yp(FWU6w|dt#1WGD7sY80_0K?ms{`G-WqTa{6g?r}ZuNAE$SBkWSxUnAmPGb7jOUCxV z%jjVB-a#Rk#e}Ga0LUi5#IL6jl!=1j^e_as7Dr^;IvJX4C?u)hqxjc2(VEL*ukb-I zw0Uudotu~7lAad~r**J+ZM)W=FNbB`aWrWb(I32exvgY5Q|~&l5A)hV6YInt_A$;% z-O(Z~qpz()20#MdtV0HtUC5zc9N>Bp4!+8J)w0!tW!q_Nz33l1%v#}%$4y7?v^FtE zjv;Vx?-2f9auO829E5|Gyl|Owsx&?Ns9yBoeinUg_48CcD#aLQ^1LEWd_?BvoYOF0 z;!G>Ai0j!_7Yh1ST;dVtqx@a)2Ie%~$|vzk^Ahg{VVUVyF~lBv+#lmSAG-dlxXj7y z!~2a@AOA93@I8A6`0 zSbs0sMfj`AT7z*v=#$?u90t|jae@PW@>6K%nAggU@W&UI$BYg4r_}3Mn1){JFl%_0 zUq>W=^`{e@u&dIeMeKatrgeTe=P6J&WCZYe3fBkDZg zb{E{x0GlmvQd`Z$x6u$x4mVLN^4j|*YWH)&H2x+k>2twK>L#qABdDL;#CS5PJN9|h1s4UJ=2^V7HH#PV!65Yc zD$>UFxMgqpf_My!c;#+3ZtbDuY_|s0@|T#2`XeG#3Bu5j2hZo07@gRf)~V&z1^u({ zpl`!%9t>5k;3g8D4}L|)-{E&XTCHfZ(DYG{D z$X_PpFNNF5`2gneU*zW!P=JKeV8ytrCoib8d9Qh!VA#n0`4Il`nQ(50|33nIT%X%D z`i3d*L7&Ht>v8qg@R;hj`xRlzJDmlcbv$gRzo!#$T{W5`%`(IzePoUF_P@nxS_gP zBy+1f+)UBe2vl<)I@5^$0ur;!ZEHy$eOvU_GVVM~)7?f}dn1D0zK!Wi*hMnZSGPsK zSpE$+f)2usyj}{AtcY-AW2`Sk=@ay5yDwOi*ko+(rPO7$#^oRQg|IyTj~Egb-&?tY zEWxu?0JpCb628QLE;KGc?!NQ|+;8Yj@Bbr4CPGHIXx&rv6cl7FtrpLj2K~EH%9F6y z9f@}cSG`U}q1Uo1>~pt_rYP!iN7Vb8a!$Z>RT`@D%RCgctC&g$T+DW+Pg}cs|Oxi-5+5uJ3(SEf2u9#(K zDiZOpCWfxx6@w#8K@9(}FwSGzn7qa{4)*y1Iq!s|zNU?oO{sP;1K;}JLs>?d9)C~s zKPi@0-V^mYQ%+y#5AKgg1cc7n_QJkNt??+sa<=hcEM32cA&BXii}0OsYJci-UyKPh z8S~?mpzC~QhTj%%9hqNqw)!V^hCR4G{XVxBge7~JrnUFQ2A!!cP}5UvA@O9LF#Dyu zYQ`kqv~!7~Z7FLKR2Ewo0ZL4G9Wu zZ5DgyT7z4f@GvMvzhawQn=m}A5q=*RNAh64fYbQ;Kh+o>tVe@> z<1<4r4clw_; zebo}FqCfqj^0j%bi|pmU&XWbQ;G}i^S#&^fl2VP!GI=}8#gsD!A=#AlFk|g&q1CGB zvu-B~?}A3h#2X!MPHTAV2CTcv7O?yQlq0ebc3}Xm6yb970QyK|vECS();(L8{tTSw zDaJ*kS;KHt6%e&1!NOCaBZVuAT5{J6U==x zeJinKrW43nX8+Rc1{o0Y_+*+ZvuD~JL)gy9Y=F-rt}8*y3e(phGf%Q+BMP@+I6TfJ zIogIL`I=MLz$J{tdAn>xT#Z`=B}lPKb-NAo)2cr&kxtmKKJ7lC{_J4O{G5tKMS81H zn~LFy-`AFn4T0KKt%P?e{{!PpJ$jxzVIG!&jquQs(I>V{TYAM%s3J}|f^8k#g`2i) zBiq1eWd}CR1B2+Yt%d0aTZ0y~4K~j)i-R3=6`h7j%0!515Q+=$(1mwoflkF%HD1|p zwdXssiS{S)+R2W>^uwcM`l=%v&Q40y#h!%>9K~PkaM!BavYl{v15PWz-cVe%{|h`c zph|}wWgFy%7w%RXaQ2AHwY6x`e0x^z1bwKPrO7B8kZ5lQ)-&kxzgthD!!aIbo>jR+ zT)6Mq@{MRREp%XE_Va9%pckBOQv zHg!^Rs;p*s*tr`iupj5lzSeSP&PPb4hQ}TEbU~l7LBK@r0wvSl=_LLM=LwC zuGX+vppfD8SVRwWW)p(BOP6p_tv0u8cEZew8&1>MC`Wwxa<%);wa_QME9=f6#wo6- zKq`G{CD@vm8iM9Pl#Nbwz!hS{E{8hof1U_Yzl7w=7_YzgD(tDQ%#Z0k$-fKpW+R=c ze;53(a;E3Iut*dtTFJQsizu8hf1T?O>r4)A`0vGV&b-yU8;fQoZnVaYP2={PxPEbG z3U{~akKpujrRnZ4x5Je-yR#uIsta9h)$ibe>{{K0dV8=G7V1WGJ)pnIjShIQSo;+{#^H{kM@#MQW_~A(2ujO_A zB$T-#z6Uecoj&qp(SESUyGz{6QpV?3t!7gB{>yrI!rEydk4umj8}16Te9r;D<_T~7 zteg*76nHW3z>ywW6MDl=C{crieOlkw3-{RJLMnV$3)y|>fEOFpmL^4q;I^ALd3Hs1 zHG9+Ou8=$YnBEof2iJCGud+rja`3jwE!>-V%ey?3Kj;r{=1JM!EP$a`S>(+^>~BQi z7CEa}KJjLA*e*}%;bXNn)Q3d}BFMj>x=xM5Y+Tf!dzDyXYi?g9DoV##F(N2{g7 zh*wrLZSKY%uyfwD*^hYy?(k8tUg^0FRTVck2vYJtUAvIyNGZV!uzZd}a<`o{QfN*(O{jWo$|F4Xkf{Lt)`_|bfS7C0RC zzI4?mXlgg$mTO@;cb}Vm6MpdV<7*o*zm5^x7ZZgFw4~+SFRovN?iV+!*){r8oxe5S zdI;1Oa~4pqmb#+!Vnmm!V@t!&61JtgT9?~v%S2@?9BzwHTf~ESPt#6Ef9qI3=C^^u z0@$d6a#+;&<%=_Jn(t-)4}Grg>WGRSBQ@@jCqir;skuK4<&j6sV#KDD!Au3NR^XwW zj1ck>8uz>o=6Hx(M`-3pMrd>=fF+J?jr9>-yWd6(j{d-lA>4272A4dSh7^EE?9ypD z{|fZ=(+6p9LlZ>beUs(GWn%K`ip2 z8g|+m&4IKqhz)5|%lQ*(#X)o`h(+6CIEK(rhhR3=eps+l7pA2@O%G-RT(DbbY}wxx^>sGwG$!*I|#CS7{((? z(T2kGA?S|{f&k{sK!h=YW?hNZ+%T6t2RA0gP*Zo79cnJh#J?KrC}$8{`T?1ghrpQM zT`AJ~IGQ-AD1?o(&kRvgXILX}Jp>g_W>0eN!G^e+LzJAEh3R|~TP-g3;}M?HgM}8D zd6qO@7@&Lym!Ci)^Mv6-KQgQEVXvQu-H2X))qj|&<7QfW{hAr{`VY05;s3c?#^wQ< zd)o}y%Q)Mb89s%X%HjG1e;0DX9s%dUydFVU@5oYX$dg0a#7AXXhK-&^mmc&X9Lfy(&=CByXFR}M7msUKI zBMqUH9L8{a5%1Zr3}a)NV^6vo#$M!Iz0u(iU?cVqg3NJHHep+61X>{%+!7PPw%B?`DA|ZgTrU=@ zb*MIk)7)P0e^>;a>cw7Xb4qAzBun;gO%8siYt9zy9%t^R@n8gff;Q9};o*9z=#J*J zhKc_-hV~+#-pCNJubD6DMMb?KJ`7_I^+qQOotx{uAx5x66nfs(IhZ^Qk7A)o)keEW z<;wWgt~saLYr+7;s}fg`roj)MfpDv>wu4@CdtRg>Ra=v8O%#jfLyn;D3e))xF`lJh z#-wEh3^{&^f-F&L9r`dF70}9X4Q&5Zn9g4+7;Mdel-dVb7As^$*oV325%stGu=r4` zElgJMotuO2wuc9k5E(o?(l1Dpd6CrAhxxXSUob@Rk7iig)qITaO(UXN+v=jZH!X}t zdkHgT(U1&uPx1eDk#r{-Z4_Mc?2DWL{r-Ke`cptxguCo^VS4l<;VbKlb{OV<>dS(& zP~0(uaEVf+yM^id?pS*UgAu->W^3-`GJO>{ZLY>+26_kmK7`#|*8;t*xGe}%3VH`& zU&q#b#pTEK%lM8=uRipA3=6h5OA`JS_fZy+62ZFArWodIXD*X9MfxNLfktxw5W`~9 ztYy(LTB)Hw8&!UON!)*zfND6id_h}*$l{i$%JvSCd zE0V(!-aOLt{a6zG>css*L*0*g1)GmJ;oq#j+SWil-1qlwcfSlk!MjJ3uB4nyj$)ABV#zb|&p#b0W=+Wq}^8drI9AXdVcO?-jk#*YZAYmJ?embaQGb z6o*N4B#s3>QgfJddP2QeqC0VHQwOs#D@F->6Q||b2phEC9&gg`@hseasHDtYk-B!_ zO+WHaV7=JnH)&J?ixwNGFoE?Df3@sPV53FxJ-V03o)hb7On>$s9IK8|#whflKZ~_{ zU%`tJsdftKE-(*DPhv}dNR zT*<57-jDnTFfZA>_k2IP13Wz@n%67yw6{7pFRRtD51A$7QAB7OJe1?4G$AV!aW1Zu`tq|Urw6N z2Yi~DRk3tRk5NMx6aAxS3w@GeQ6G8m&3a+{pxIn353j|Iv6?rl2BDKb+C=XSLh)L+ zhQ1xd`m*h@B&D#P;+NDbg)PR+N(E+CQrKWjmC13+V3e+KAJ?Wz-SVE6KS6lmLg>Opx zkjJcZ!iV`i(Or3?ZqC85(}+z)&O=yq7}SkGx$iTT2`_Yb@zX{fD8M;NPL%G=CVIrhQ|>_SIpmn|Ow7oV8eflXx|N;6>M>` znyKo{x4BxsvpZ{JJjtPMO$-bCbZpQ0RTnLB7*9R*6kVJv@Cnm_cP{0jk1ZgXGntE=K!e^+o z?}{LWUyZDN%fSlY(@4f1WVA3O8&PBKrjx{vXmg8LUZ1b7VtzJUi9uAhx>SZ~M**QFu1e%-ju8 zcy`mi^Ll8kt5s1QykeY9RXKZwFP2BZ{>@&?~zf;=WXA1eUt-j z-{w9_Mca2~w6eGD+qbXsaocxsUnS_Hwm*2ZaaY?nT0(xRRf~O0cY1mZ3k-ys&JHCP z_sjF0R+?U3zjo2r<4D#R%;N5eRdi{wbO7J6nw|LeWYEPa{DgvLcU7ErLct#^fIO4) zQm=>k03!~Grn3mSK{w2klGB+^kFRcRZZrrbzHM$a2)i6LH{f2iaLq?M<)D2xce75e zadoqwWpg^4E%E~a8SHmklMt1lY_*8bu(=G^b-wZ(x&S*Z-#o`8G%qXYbSC?jrLC}R z`4=0<#0nC#SQ(r9I=z?0!f>_McUkNsmiam@d4ZKPo7X9F9DBmi#H&gnGeI#-ai-4g;Phem9?SUIOZ0{!X#=cEA0}4Kc$iDdz4RJ zPK$F`i1(@G{IOjg93EtB0fspqg=d!I8UU6U{RIARgPj)<>>>C*hVSLJ`h8aa+{^iz z5VzOn-;m`LHi;!_;n7Z~;!4Ffy-SExpXHXtlbEf@o?A}KCbJ>pZTe<1RyX=BC#M(j z_Y6JrB1>hi+Fu{q`yv}J;+ncCtPB_Y?3==#7sHM$wO)AVgDKI=*zh@CC;Sy~A1Q<5 z=6VECFeNIN9E6?gmeIhMFvc9c%<|q#nBnAkEtkz?`Aca@E<4R~meR8?v&D8}VFy?7 zH_(NbSy%go$qF8a#XV&GNqw13KxUgTgZX#h@ik`jr{yzP&*(w;!-Wx0lc*fqlc;db zV>kxEr-FngM63+njtW6q81?SOW7m(y>{ruNMv$ z^G>r1?BwwZ23t`tJ&kKGsq<{6^TkDX|1Wv9&{MP7Ft!6*IcKBiRY!YgvnY0MAYGl! z7Ks*`JcosgyGWUX`Gb+}6h4=Jl3^a&VJl- z3M^N)rqk>99<|(N*Q?zw*61GfxG(J1-m!YT6IE2Z$E|h?M3;8U)sI^ahGpR&tL3k6 z|6eSNcI|c>AGhlcySmog@Y~=2ZFdhY>)?|1&_u1{d(7L@#ayg zH^B1$I^}}-YlQ7FejRrIr<7}KO*uR~hBh+oamx!}S%1r#Wjfyaza@KKdzLXhZg=_; zT0fs17Qdx``C$XHppeEc zWI^urRwaF1exBo`EKE zrC|GqrY0EZ^8(f_pc)OCIWNUt*@hW}v3C-bgzd4)9keg8kk#|3%&575#Sc$4Ao=mK zl!|KnH(a9cg{G66I*TfD@^rk>jRoU7KS?{Ym!#~gwDF3)RFt~&VFZlr-u5xjVgvK= znUC%Ze6G%f?{k-QRPKy&R}$d67p5IPGO$6T+~A=e4@mw34?E&Mqq(@K1D>7O3lE=z zhil>CKR-x2c`u54mV$|+0?d&;^wh3B`l5jb7P5iz7ko~|P>7Lkx`8$pvc#wMKn0i5 zmzPX**B(&1jfnz0q7=q&oI=nV?m*A$Z+m4K7Po#yUkrQ4Vz>`lCdZa$-k)k~I;tpO z2}|b9{}OhPF`PaxVqKYsff9=_pX+R(XN%ZC4`bdHuSvK(K< zrr0s;!s)w?6|(sY>C<(XMGjg>zpi8Nu+)XLY(3V2V;9o?_1G5BYauxi`=!${2Xqqn zb4PCFi3{mIA)>o2-8L{icEvc-__r|0K5zm3{uUb>x%oA%zq02Ub1yBHKQ^+T7#s2$9sf7x!`xo8-1;|m)nM8&zLeEr|F-YD zn0BnD+;>qORa4Xg+09Fbxq)GM2neQ&r!2v94oH$CJh#=ni!9M#aofT&W!7!JWyX7K zn#|a%mhse&7FNQ02&t4y3r_xG~i zzSw}AGtyTHfN~CAO~hHDuz-wi3eQAM^u(tuI6fsDV>_mduM+!o6}qm>b{Mo^Lb#9t zhfG3NoHB5(N?sj=&i+1lXB1tIdDwuc7jb}(-u;wC{HOZ?N3CvO#*FuA`t4H|mCoHa zNSgcJg7-=T+!uScyYKpl`-2{Fe;(8m5o&$1uhJiUI9EB^m!?~=D(K~>#bWCmm9D0Q z3mCr>rEaaD!?KI~RHWp%4R+^R#MM(krtaZ&Ym`&iu2iBP+T zIe3G+&=2d&F`B&{-IPqIw+Z+QbgkM1ydUbQPR)6#cnF$@`)@Dh&Ol!py`KeowJ{yy?so}J8KU?SL3(NdfXuQJPujUcYc)E0+Ljw<>@|Zn`#vNdBcEwnD zg7Q83_W{<|`6!%u=dRUuEu!$t0X8V;0u*cU^jpjs^=mC+VG#3x zF@X?}86EOH?H1_FK{nZcJq+lY)qZ=9N zV(9v3tQWt0^>g&m+4NbKA&1z9qUVX3D*cMG?k5YQF~+Q}$9GDDY;pL4?G(kEmc57B zOi}#E()}oNhP9a#`z3pi4Vr1W_$6B)@@GE2VixfRb*^GQGM2m=D5{Eih{-gx3Z;47 z3|d{q&a&|{=*6$uMb={m4LQyt?Vp~37<=gNjhR7MET1Fg$FufA zPjJ)UdpVb!PBTB(&alJlM*V$t50AlwT+6`ItW0*z(g8=if1hPN zx19en1W?s1jT+k`|;K*E9e)B3mtiQ~%nafnmmdgzH8Q4rAr+QS}MN=%X_3TrT4VXfIUcpXGzbQ2BSGGmG zZRvECbzp4ni{$Ye)?O+tV}4_sMZcQKyqs9K|4xW4OyBS#`ssMMkEi>X$>emMjT3*i zynLPY7MU{H^3Dx5RAQm2ma8{eJVRBkyTyjmnJZ}Yy(U?f++zDhyxK9K5zXx49Ls`6 zY?%?y(`$ENI4i*N$sJ4;h+mQWJ+_?%Or+26v2b^Eg1BcJCa825Ny(>4)=i)X_t2^? znn;oNS=fNUi8$Mb?N4>c7S_E99{d#X>0GG$3vSnS57dmC$Rc&H%NLx*wiMhNt6ZgZ z_t`>+MmQga1Rq}5!Q#`zp28g;6D-r3(G6ho1k33MY#Ec0h9*mvDCNs6WxVCQjWkgd zf3pneAeD*CFwSz>PWnk?r2%xvUfRgE2GR2lk~iDYo#s18kpU4sltFj2#}dN~*h29M z@&|%Ztz{%!Tln@1bj(5O>CCt2h6M=GT7CD%3-rK2O0kI_hXS}xVV>RbY;s2F3tAp+ z;Cb^)eDj5XwQczowQVI8I!Y0I@%|%61fVpWPJlMPy_ED9=yyjc+y;g=zChlcq~6Tf zi$-*UF6LmPU!ZB7BpQDJfuV7dzPJ^((@u4J(g^{N<+lG^i)^LU;Kbx?kcTeum8*P zpsTb@bpPmIST}?FydPD`yjP|)EILzedCNz7o3ZeJSz`U9aiaLXWu3o-bxE^cH*_D; zGbS75n`#53aCc1C4!t)4e*>zA-s3NF@^8`wO35gd*?~xzCo(Oo10_tseq;F~SlTYK zoM&l$2o@I8pQZC5(wnT;vz8e>q&&%{w~~^LLjYk?&tx1qY6!q{Jt>$9VA{+gT<-K0g3=!Aw zxc8QxWA4w;jNX!mcz~AnmWJXHoo{+eo_KfUN^fbr_>1Ln&sYN=HOC;%SRV zKWU@HR;61$j+a6t=gR^H0r;ih(tv;)v2?Y+w1{mULoX&t$GUTkfJt%6nK7ukP_6Sh zEr|FuA6+bg8Xq;((3k;I7rUl3)Y@y7xe{)u@FL>?$>rslFoBKqT0;C?*N?1MlV}$Yon8QQeCr2yxe_}EF2W3VgV!eiio(_|nEw%K1={lk$V@zh zv*Hv?j1QEiB=Wyn=`4*?Zo(M9uw$Y>wz#3x2AJ)YM76cHXF|+66hAZ@CSD}t$IzC6 zQkbg^y#F5WJ)1*>G0pOMio_Tz9&I^1SQ^E| zMoZ_RQh$kcA7vReT#6OtAD+VIunX5EUz$2xa-)h7QUhE46qS#Zma*KYDEcWWnx#Hv zdGRSEKO6IuW$`Gft0Y!iHjI(*%IJy_mIcos-?PLKmh;a_VK!)~Y_g;rk&S!OGVKMa z6O2+`wiEC!@( zIXyuuW=fx-tr#{-ngW<-NnUK(V9W7Y5}v9wQ}t{(=rEW*og?iM9Vut7^leX65@%9X z;#Yp)ZiKMgkU!s|@CDLLt3aFMv?}APQR~rMOx>>GH6a?lp)OFOtH1m5WdItmKL50$>sA_&> zbv!TK0x}stzKS90l>+_8GB#ZXA%aWrd#+ud;+9CgWIcCs>Jlm2{n=#HU4FtCt?s&v zhbmEb{YXDAkiDTpVvyWSgA9O zE|EMtiAwfx;hvVaagog266syfx&4tBQL6|pv5#qnuaj1G3V2NE2v@RuOzHXcP>Om? z>F@PYu}ig3Iq)&nl_ZrwRsXnZ?+u!2^?=9Bp4lL+=NH{ff6Gc#OWOapH%cVhP~W$u z8C<*UZE2PaCzHu@lk_WBQ8!6j*aRC(*}tVHMLx`ZM|xV+8RAt>es@;OLbkJ|NWiIl zNxK*n@A6{PDr)oWQYj8u9rs(g*$U1=#;SPwxKw%_?+eX&dGF}xf`1pYcbu9^P28Fd7VAuuKZC2TYF zxcUjGV|W&G6za(QI1&5bfx(S2(H}@-qYJqm+?aj|(>eUs4t}XxKGgJ3<8HnEAAZd4 zN1uNndAdIuKa(|nuKnou52W8;=nd z1-sRcO6v2G^ppFg7+9%)+=~koV3xXcY!k+JG{7vqQ-Ei;d;Hf{5Uq+&>#42Vw|xs( z*Wep~9{$Ht#ob5$8w73L{-J)UU_I8$n+v!lR0`Tc??e4s0n7G-9&u0*wS6KF4e*tL zM?KJs+Pb}fD&u^+I=#JH8Y!DoTteykZmBDq8Dp{iSXv|cW{3V)yhI1<@pLoo{zMAu zw!JU9p|-dd36Fbq#A#{11);FjNGbjGiR8oH>Pt?0(CK`$FNJ}AD_gDT(c&ME6-szt zwa|l~@id$^_N9q?q*P`OwQS!beJnBok6(T&on~o0skcQM#2ow59E-Ht`(55JqwC-Y z$9Q)EVc5gF4&Kq^T_Fv0Ivb7D!<|mNp-=5gFIJ%3^ogd`oGYX0(+cUnM=;D7Fj7Kz z)0vw-fp-G@qv_Z_X$cF7whZ6TJM-UIJ~$v@SoT^UdTkXTUi8j4k|!m6 zBjvC~+Mfk%TrcweR$9Q4H3nKLzLoIs#5MZsloW#M%&S^@nnr&s+0!f4Qh&5bT-~lZ zM<1-@;2A;xYH1|bcA(hrq(rg!QEdZec3ZXW>GpT9oyoO>sPY@B8_hlqg#@k;K|h{` zBs*F)O=qN1HaMK3Yor-Lq2Vg=?L81ywFSR>*v-eMp&Ri#JGO&zC%pq5sgd4b!@?>3 zd+9iPDV+SyN-F|yg;{TBFyJ}x_WSod%Qr!tPZSIcr{ibQJ~vrzpOxMhnJJ96oRj9@ zO)K{wC361;#&~zq(2dVE_@Kt}F0Z05ew4bf%{?(JmtvXHlbp^=W1Opbt_d*pQx2mF zdNPb=oR@|aIKX}$QtU0s>qK&#@YhrBLI!dy%zBjv+<;lpa5@rZ3~oZdZfJBOj_8t?D|c3y-STTGhR|x~tIdu3)hA{YmO1vQ<4TDHo*GBFpb-IsLQr zhK-DkVR4q6I%$K5(mpkg)Ov|Ocx#BGpeqvY?Mcx~im)NhGX9FBh@E13U}F_J89J1! zpQ!~m;)_36+^=F#z}AJ(jNc>=)<1-n{f4fbcL*)`UHTmZg2~s>3^JuVhW%1^(ZL*G zXFbh3ySwGvKO|8S&6es0$%l91Zv2H#U0krm_Lj6!L_7KJ-%@{uX*bKo+tNMJ(S(?r zQbOaEfYNwN-5trTO-Yxa1eD;8^n225_Ix0{dQTeAYS<-F3CK&_e(0XmX7(CXvij4B z`_gRjHyY3+rMDVA*Ix-pN}{)$q~8h(TPu^60OStTN<8U#WpYoaQrnn>C-Y9O4>my^ z$8X9pRlXa6#37F^<$+x9&~jHNwA`$99K+Q&L47@rIDUcbzy+C&|E2hkDjJnjmvT4! zms+HNC(7_qh}wwXbig&x$Yj{Is+ICuN)Sr;oR$bRUTeL}%}&+DLtPu9a5ER_r55Qc z`v@4}b0W)hl=wjUT)a>B9ze9C11MINVr|?5a4{OqR;9jPBM=hfC7D0-rlP*M?@!}ClcLw<%E2|D=MBk2gSX#lQOoovRtB7mR+^V5^pO+ddq%nj5m$)mLr|Idbib<-sJyh6|=d!s1>8}|C)B8kEPaI_7eHils@ux_FPx`)mQez6q8LiIf%{ZN@3mP zbj(OC>L&MQ|MsE}yCG&_T`k^zvN!G$we<6s``WW{9+qi6<@cmc^W3dtKEBE5BJCb2 z`BPFa*^VWS>Y@_8lwrq~8WkI}rUKE??nMApOJ>A)IHW5K!j-4&H`pX!Tz1rDgKR{kAvKL(} zD+bELnb#R-mChk|@n%mn7*4Oo^T^22Cc2@A)AL;{wu9ucVuVD3a`%lQrMDd)ZaH!lQv$r}~7LSyViw+Z!XE8sPo?QTb#BtZ%Iq!$f^p^)RyD7~ll^FV3H z=2-@v-7lc_&~m=L@{%L1PLq4aYpv{VX!0rGN-R=n=VY%weohuU&NB=!!}l2T+q1b( zH`C;9P7hr?XRi!#B=0eDPbba0)iBN5^F|soMjnE7v<+kA&<@;qK$-)6HAW7mkG_)J z*Qd)ei*vNtrpuQZTkK%@Jp;Lfb#Sm8dsaSN(!LKGvsir0Vp%%HMkTsU?!}6Mt{tdhj*^tcWu|L zxtDE~v7VpYLR|TfTuyba=EX4}!ciM_yeQMgS#ltoAk*iw>jgkFAd5gG>K3FJ!!tz9#m@hxi>g?%Iz8v5_Nz^>ty8(egfXzalqf$n<^HE34 z5y^Xz9M|!JHTtn4ja?+a%6vsSy-1E7G7&b>Ck@NC5&Ci4h<*dlPMJ`ji|7_0niH^N zEUz`1`=MUg2?r@Kn-p8it8VY|7epGhSRTPc^Y&sn%m&#$QnVajjEah%fhdp{O7jJk zrWoXI;#JF1gFHf%5A%XvQz-9dqPu1J61k_uMymAjQh5nm_<&-UAy3SBK+~4VAM(Py zTt2|wen4lJ%h(I*j&}qQ=i&zsxRBf8Y~peLiY6B$&g&o0isJS-k9|PLi)AcyKA0GEkjPpP3asC$Sq7Q$8NKl6VY>o5m2lU`|c_k0c$`#f)M?bLa zUm;_1^<(O~N{@H)Z9QmerouI{KhrhSmNoJ?W@@%Dll%|s zdb;TW)j-~ZkQRKFI3S{vmUXMB^IADn&hMmrMg!K$gY7D;>gDwMTDiCLaacnEZ1}}V zm>p0VMqjO!1H|9yx3#j~1xfNfw6)BQ)ICiJCCEmLn&{6Gc@08J1?%L*PHs-hRwsii zucLgL=-4`W2%FGEPU~f#F2zn-5Ck}a1$)<0Od|3*KzAFgz6UkYv+LzJ`GS*jjg{ZYjD;XG`TpP|J8%p2@X3 zVopPceFB5-S}wjTqet264$UY-v$*k&<$Rfpxr@bjEWdA+ZAIpGhi+{{%^i7%!rntW z`T;F^Pqv^J(QmuFoxSys<>Gc33qD)ut)22D_b6wj^q&XF@xmTHisSu&O}ELlTn=-8 z4eI`a{MQ+X=5J}Ow>D)+LFo>4y)5iq+j>W|@()G6kIJL)HjR2;jr5{ny)*%h{vlw($`0ivpj1wf$&|PwfjBIg~X77@R@?qC5Sr>`C zu@jb%^QyI$YKOBjhP#V!?S%s$x2TkSUAk8m$Q15KhY!$YT5+4EeIN%p!frmy^2+cs zz4ZZd_VC-5{U6AFPL}M?!3|s;+y&NyCqdy41c%Kax2SWTe90DuBgP`N>`>Jm!Ec|m{%>zrpO`z@$ zJmBi!4X_q;>j{tUB8H&dz58l5XabF3?R`iH)HfmK;Na%_YGVP{z=v-bV%CC~aXz@O z=7N=ADOjw+BXE__q}FnEP!5MftVtaPnx!UnE0}Eq^$56U3w5v_%mUNwn$!xe-myvb z?FD=GO{yLo>CmJW%)`f4M>qgBfK{NmQF zwMoqbU8XguW-vRqNo@cNN?%3*`Xfe5khWk{5e$NpzztwESOEqbArWvYcn!P;`X)i- zOPkaruyk3IItdJY9Wm$XE1OiW0f_PHCN&eRS<|EzgE|ue07igE2cZ0qR1gv2Ot0et~-BR=w>pxcB@!VQ!mKw#}Ih3(f;4eS-jkv%o!I zK3D}df(>BBDM)lEBwdZX1{PPN{LjNj^>+{{SPxc$cflHP*lDEoFhSS^dVvSQ2=E*@ z61)rMf)!_wS;4d#*aP#xYv2vg?n#LHdjuG426I9ESwxttpGEoKijPbvRDkv11@H#g z05*d1a99MrK=}s*0CWWPpc|M0`hruzP%s~i0!^SE+zO5aE5Ho!B$x%(f|CmH(TI;+ z&~60M2J{72fl=Tla4@(7%mnvg+BViu&1?|qm9nb(~fQ~;Q z6N4sj4_L4PA657$1uuX*zy{C^%1=SGpcj~X0l6BS2WEi=a2B`lUcD=-h%fVpWX|20=(0SfwS5FuC$Hh{Z8 zc?>LoUSJ~_0s8)ivwZSxo~Ye4Eu0@MO1U^(0sy->mMyxWh4_Sv|;^*sL~yBSAS6d1*kiIt-MPo7H*X zhC$701z0?#xj>!uFT`LNeKQDY&>>CNg?Flz>44z2=^ zg2gkNRpEI^1at#4=QOLCU@15YYydZazH^(^U7#7P2G7kcKuGb?3^I=ycoavh9S#FG zyotO4URaB?27^nQ)mpF^Yy@@d5U^|%b1(@kh*{sPX5-@=Xar3J55R*P;Q?3!-T-qq zAtn-9NVITAbx9&hp`Tw2GY95$Y-mI2_gLfl9VDQHX zNDj*XRD49_APK-MFzXYD7~HfEX$$TG&w)q58{h>{n1s>*x`8G8AzJ?b80>*}!4j|; z+yOd%g-prSt6+XIB=I$34xT)YfK4tCFp@zMKw;`P5E(cRtO1SSHE=6v_aZESp`fuE zr3K794UfPo@FW<221zjmlKBB1fQ}cC+rh2iF0lG%Bmr1k3-zhUl$YR70X}Lk!{SR2 zRUIsXH|mkrpztRG1a1XuxH@KYo&?>dBgw&nP<+(mBMF>!8xDcjKqDA&2e}-~1FwNQK*wC$I|-~3 zThvmp0o(%`Sc_T%x=Af+BRExVQQc;towvnH<6v5c7Ii9E3Fd=a?ON0w;2!WGco(b% zO&wuxHfm7&7IiS_>(HX+fyD***ou#-j_`mR=+vTy&VfY0B(Msc1U7pAIn+u76Y2Yq!5?Bf5fuSylAeaSKf(6&`QG<^?omH^7t!`xcbT(AM$0Nw?6fr2|60Q13Gt_}*XAn80|4~+1FhoH_I0R^*t5J0dbphb;( z6-g3^0KSUye-t12P&nEh0Rb~Y5D>6Fv_*}Wj~Im^2A~k$q8dRLa03_&?gHy05CBl$ zt3`FmLky$fFjxhaf^M-bYCYHpy1a(gGZE)iz>x#t&TAbrs z8v_TyO`s910yluc=`HF}5HHTF=fD#126z{Af#h?aZYfat5Uk;8h!R|t(V`ZEJHSog zInWH|WnE{D#7?q7Y0ak!_!Qg@kh*=RF0wcg0P!A59h>8W2bKnq|23CSzlMpj-6{s`9Lof#1 z1P%jB!7Naij3fc)fjhvw7m<`;1t>3tJ5yi}EU3muK0fNFp`3yZU^QsUMOrUISLtPx zXE1*T0t6bte6SJR16IyNjKC`JE?5IPE=L4r!2@symFT&=)KQ zqreJqFle_FX%9w#1~3!c3Yx(x@B(-Pyaozy!2U8w20RF67U08fIdVPd0&W7cz$$R$ z3K&?8w0#3H1S`RFpv!7Fv<9LCqreMmQ0&0!H{lWJwify(lo~J?tN{munI#A)Xa-k- z&FfMA58|VOkcM1iGs?9BNxX|p1ZHnRIR>YK|A(;ifs3k2|NjM<%byTO#T?OWGBh$G zG%_->(a6YHqaquPij0bk42_J88Z0t0GE($RMMf=K)KXEoHnpr#OD?&rQBh4rMlEa9 zQcEq>WCXv@bI)^_ne*LVzx#T@^PKndod4&Zd+*FWXPP0)A=@A;A-f@C8qp%#a6Uuk zK^FZ11%a%9^g?z)c0i^)i6(~(JcR;p$CzkBS3{;gjq|@AO7_#}bI8VLPy@(TNZN3; z9WoIz^N*+jWa+bLDM&A5J!Il@hzA+-JX!{_?1f)P9Xl|1AyXk+AYG7Mkok~BFQI^t zsk;#mviMc>eIJyn*AQ_hn&=HgfUNi{E;^7you~<9&p*%tkd<%4AJPjMfb>B+1PTh7 z3Yq*aS`M=5J)E|XecfmQ$j%Q?AuqblkG_YD`UqVC+3A7O0L2fv8#1>Sjt?QB&rx&8 zbjTFQUdVjNwl8q{K}PkV29S-A?T{(|LJL5)Kn_4w9zr?~V`73#glvLLf%HLUK}LOv z0zi5)pj1L}LDoT5_M^m*d0%6qfh>izKZ5YT(K3)NkmZm~11JDw8)Q3V7o;DuA2I;x z_y(t8JqF=Vn3y070w_3S=Fd30AO|43>T&+Z{DKS~MUz7&Lk>b_LgozrI$8+X4%qPgDix!j~f|nfGmj`8SR1GjbACSKaLqM2CIZ1yCI7qQ^t>s zHba&`c0sm44ng`LW1hh22AK+(n=mr!f^3GY@IXnKFf!Ug2FP~EF315$Kcw+{jB5MH zXbPkkG6%8^vH-FlvJ^6R;>c(fWC^4fvUU|G@{QZkBlZl7A2x$kY$jb zGAPYZsv%n;>mfTJTOj)(+aUvxe#odPND$HvY5W261f&yk2(lQ`jh7C+kY$iQ$V$jg z$lZ{GkZq7rPhxOS#mkA1^;1VYqs35M4m2HPCu9#~H{>AXAf){%M3{yMkm-;)keQGL zkfo3nkmZoI6iyl$?V#}VksE}6HbHtiFF{j7NnANH zn*2O!2AL1pT7WSD*#TJ(nSL1(g3N^UL%JXbAafw`{sX?az~F-HhIB!uUx6Az`XC!1 z6ARHbkj^VnV91PXM@F+=!1~6bnV9ZUjii` zV8*S82$@=e!2wx$J2Hd}RHAABgi&9Gu>o0gH_i^o-J8(@ke&CUPxm0h`%q)ZA;>Do zs2ZFNkTW2CkZ#CM$d-DHrI#@{9~~LZ^FV2bQc7|cN(@=`7@8U~<8e$JJ~TDt49Gml zbjV`JJV@sgn9(2ypGHQI1J7VgKt?sAB_Ye7LleJ(0zQvH3fT==3E2bbh3tp)G(!nM zX@j)4VDLfaynvYtGW$=+_*G0WdobD|%U(v!Ad6o`0U@(m;Rl%w8S`iOK{_D=d(pIz zQLmw8Arm2sAyXl%AzLAvATwUa`QHmA{S7opD=wGVLNpt4cRNNqWX3*>cF3Z?jg0m~ z#&;ltzo1DWGa&o+!w)j%@2C-EO(*&qvITOO><3Vgy=WQ8e8{>k_(A$0eUQWNcu)f< zQSYJ#uc3({Ga>UKb0G^M3n4oot0CjxLxCV&kX?|akVBBh`zTNw;(dUcLJmMSLJmRt zAiF-qS@Jq29LPk-UdR;4{sJgjP|`m_O(3%%YanwV8z7w@W6(h6mkqERLROhe*Yr>lu8xP7DVz7yb&s zvLNY5#$P`Es-6)^-`nQQY=JF?418om*5NNuhcDq1#pU1Il5;kVi%Te6dhpXvdOrI2 zL;w39yw{yzEIxu#@4;UwQpmMI!9i>ge@)LH9wnU)DpgbjG5mm*EiJPDd2#rA+lI)> z7sdMj+7=w?-+g$r$nxZz;hTY7S9v+PsZ~b69#G*TQ zrwl$F1QsWxKWgr>E!h#dGh%5%uWfr&-MA~_64J8|eyV!M1-BZ+iRr*g7c!3P(U@Jr z6R^!QyI^ST5PJf)g|YT%v?N{)X%jyOY;&>ANAl0MO0yl*{&(@r&$d}}2cUQ1rI1`o zW{E7`lI@YXs(1y!c8sCnzl$G#wyiQtq4#%+6^Csr=5|7F`^Vu?@);{O755^<#xSC$ z8>G1Z5FZ@2&7I?n#bk2;Z%s&l`=gP&BF;Yesnrb0U@prp=KNxtWfntkKOmNqUJE_z zZSn9gwj@#ei!I9B4bWhLnWi6lRF~NMi)~I)R2**0-r)ivK`MX)tn3{z@{4V*nFBrN zU6D47L`$K!zAIJ?+h&?rRBkxl6B~zZb7I?|571jM;(`U{WYIcobC^S9?-n1!p5#0N z6|GU#OpKS^=r)|@zYM`L^B<1U{D+xXcUmjTF4`RVMbLnaI&v6>3j z@Uxf{g(k^|?*CaVB)tN9?P0N+^hW48zlbeSD1Qg^>R-fjQRaNpn2d?_S8*uHTxAwQ zFBuU_ZRVorM(F8yHT*uCdD_xG1aijVyG&$82in32fMtd->dbijO9^4*TY|r2i;FnZ zTw~Tj_eY71rn%JYg}&P+_L=4ZbN3Wf(jgv>HdmW7jzl9(6Ol1!;9TfcNx{5RkX|8J zS&~>9W6m*ap!X(;^)coOvmbiZ=4|(#3Ijn=&eVIJ7dj7 zW-s(Xr`Q*3-eDG@MN4OiWpRjG2igryh^DU5LAbJQKVgyqWlwL7oRbypad&;vg>uPsR&R9pqmuc@ES{@b0<4 zh->4`v&~Kf8cq~1#-pL4rX#m2v30yT z)6)sP6!**~HJ6JRNElcsY0_@x=+^gamW;oKnDcz;1%vipvs=PY)tUEnW+I#kpcb z0!{-T^o(U;Yd7altbpE-k1yRL;j}oRa-5iVvY9A0+0E&5 zTVbnQ5o|QN3ZJz-GDltJoQTp3pV}2-pB<-b)X_+5h4|Wz5ts>m_!2R5B09wly}&IN zO+?;R(3{<2%|vu!EA*z7#An4(TKxzIR*C}?Y3c%qStY)QEhz(f$|}5>03SM>_{+h+ z)KwyF5~i9G=x*4l;puSVuM+>tR*7q1HyfchuM%4(A^$Gu{j0>DNoX_U7@YN&ibIny zShAtFtQK=8L$8M3c)eIV*<6s+4!z(8ybXag>7ah{gO%MN_D)7W8M81j)`~-uk#;Kd zlC@$|BFdZ(z30YYJStl;*wBq)d7_!NydHYqI_yb{&bKm0P}*WF+!{q ztTu$v$x;PYyo=Z*+-ulg%mO)hT9D(h#My0dIrBmkw&D7&MZ1gZOp| z+Bg$>>MdgCk+@uyLys>H=9vZG8nCExu^x7_6M9{_c=1T|fqgdWcDwlTNQ{#l=>3%< zZ7SNh40;bXX`E`#Poh^}op%M(b0WPqFvnfu$*JbdRejL2VOM2?*{b_6xC@-l3p%Lo z_Bl8wz|t)uSu$8DSR*qRB)v{+REe1m+#Xaw&&0ccD7JM_I<;UqA7X z-d-)XlHLJ5{$BCiG;@9$o%}Pl1lxehn5Z%8vlNSo1pGp+#|=FTaq_|Gpg1L96<|&R zIB4uuf>nc&t|m=&Yf7vE_9_*J$Fs7-WVErp4LahdFQp0Q;yCegk~zhs*Nh$aiFcFC z1!trjkHL(WEGZHllsLV1Tn$!605keoG^4xaj82_c0DBMYh4PlvJ>7JewO}zdV#9O{ z%r=T&Bc7a&t3x03rke1M2!J(&FelQCpNoMFRs)^#`#_0X+VvQAm6?g#EIZ7Fq5(En^bro1XSZD#gV0oHf zGgyws+Q3|3q0Qe7mI0QI{OBftmVO%jR)XTdQJ8d`I4e@`7dT}Xq|uw@wOXH+f>nVP zQe+%X{8fQ<-7nV6M64$0$y>!%{JyE_hhDi=?1k=$IT5!scu_dCF!ZK+hsM&uS~Zpp z)}k>tSYrr7Rz?Y!7i>3lj8l5djXrC;S!dgUUkf|hoZ_j6!;A;Q3(*2*2aBgjIH;xD z!D2M#2Q##|17JfTg|K=l4GpTXM6jN%coR0X_9=i}nqwANJ6H;p1P3LU2j&N}rWYyfm^PopPC>9)p>k_R6D1A_@KE|ATBCQ7)co1(+B3j7D1GtpSPcNttUGRz7hC63D zJ#`*q+Rb6GqHW>}N-rfH*MV&!VU{^FHWzx#cDnAqbDcR&ET3f_X;y(%)`>N;EtPgC!EA}6Yb1QK^#{VPY@UiBsMOn~$>-oYJoS*YlMJc^P_}Cu}4t=U5t(%B? zRIExyW7e}h8=Q`G{I!6&9u+&2abw#Dy=j-&pNu(T#>p7Y4I*;3xhSa+`cM;hI^xji zD+6;rEmqBjZ!`4jKZG#BaDLofW7xN|P*+yTA%ka&)G{As9vzxaNx`QrR` z==KD>d`AiJLH*qWZh)(4jrw&EEHGYtaDurcDRUv_?Fm6UHG3{t#RM@w74@ltzS}O= zklqTtaH4o374f1@$GDq}cl6*-2a07lz}hB@kyNxPEikD}#LI)0Ro1B(%$q2dpJ* z_$G_-Y3B6EzNumv@QNzn0pNU!ii4WO3zmxan^m_EYX)-OyA|oubm3BH<06V-Ehp=q0+*x>EGK9IoI*-MxjWVhgw*+h$tT2RC zg5@ORUCIzv2bPySe4M-wgMkX$1lR#bRVixARBQo|z(+rekb1LQkJ7wxnasbwRIA6?;e@h8};S_#z$WQ|g%*8z+iM^T6HE z^V7tlc{E<3r_UF6l1}S#qD~h3=Ha|gbYYxlh{N;n;FJM9D+BL>qMUR%@t5Pml`2D| z%{OPxErD*Ff_FqAa1GB}OgEeOkomIrnfAWOGsM zAoO7u#=01vVIH?L10VGzFF`*q5pfxK4x^Pnsb>er7@b0;U?pdZ6|kF4&~uiGtr;jz zCv^Kc;>8SfiM0^u9Px1mvd%aQ_k7Dm(kbTrqe`GhogW+P`Mdc~D zUbcXF&lfvSLAu@0yU!P|o?hIxr`6_2{CW#mHX3cI))vdjw^tsjUKbTC(7awBpNeTejoJ*E7x8rVmEP z8nG)A=R`mB*6YQAOu81FgKHw|Zs@5cV$o^fwa^Pn#Rk$lpx2g(=SZgyr3cHzq0`JI zW)Af3n?>3}bEDY-y{KF~w-BHGrksm&=vI+%I`VQu@4i(mI-Sylp1ViX<-}ze(^bP`5AjZvKLxC#N+e{NGZ*GUAAo%j+}I#L!8tbIGcCY8LAjo5zl)p36h99WK>k-EsILE7xT@ zE~x@@)CTV?s90XGcrew2#G1jDAB&c8Il0@HIm#^j<8i zDW%+TPyxEYvV_>P#GI2f41GuhE8v9PegQg4h#!}rqcWh|y&~x>TqkLXS(#TXKMUu$ z7y7VQ+yNfj3BCRytbY&@m*OJOd6pS(2EckA5(m#Rmzg;i;-d4gNXs_Uj;es}z>bQE z$cGN=9AQ=>uH1y)t;sgykMe;Pz>j){4w9WM{v7)77kcv(;>B}t&tzYLvNehy&%s#8hF<&! zF*gT3RmA@&*5n|aM(DmjiY+xW+UQgEPB;|_q8f+a$yBc1-aiHSq! zqL3NThj)vlW$5T4=qY~^%a)md0QBZ|t)W+8k_XGA{Bcm(62aQRGAtrl3RoW)`pP=UFAFUBO`JR- zEDx*#3^yp&L4HMG&2J7*9xas2IwQ&f18<7Ub5X%2=z06ZR?_{@efz}TT=Yl)diLMM z!CZ5WC;3v0-oIfbBBwzKXM*KnWm861*_RY3tA2425X3r zj_DBfV14_C#a+KMPfVg^k11I3rdozttq&~c?_&S&aJ%m;K&AdJ%;jkLBIp?h#Ioh6 zR2}q^17hQH_;f+bt~Yq`f=?`Y`NHa5^ZR9I%*og85OL0%q3KvP|AK6!9$*O;fa3bN4%9bsnav zM(D10#g;srN$t@6STUFjA3ChEgW2B;PPbHt0kD+!#JhR;PQ-BqIu&*_yLC{URImoH zL}pG%m&L@K3vlTug5LX{Saty(aq6HacVkT-`%-%}fz@@3try^StOxoq?5e#f{Xwv( z_k(SR6V-?+#M%13`1%5TTVDv>?H5ZgH0Lk$Lht_wOYY!92c^?oh#;j<1FP$jI$n*a1q)q4|-pZSa1>QQwH7rsaOSli5GhD zr{T{N&6Yi!wSncp&w;GypmKGC<$fw&y$EA-$g*2$COKA9`oS5Fd{e>l**6z@p3L7< z3cXOvzsjP0~*#vM<-gRI#U}XgG zjs9I1o72ozK>tDU#Kq{@e(1%Yi36n5V%_S`#NmrEgXBR^>=g@Em@`+FK`-hJ-Y`(1 ztHBDuq9|b;#OlFvHP!-_1y)E-IOwcy2df4vlQ$}DE6f?O!(i(1i~;~PDe8S3c=dI%H-$e1uJpuR}B{bl~}tHwW3wWIbVrwD{(dM zg>L^^>|2SRh%d%%?APM^mFS5a=!yRpX{+!#ejW6(e~XQ)aPGB2ANaR;VikR?cOAY! z7zoZ;PUP(XYZ(wDtB?;ZT5h-Wq_|Wn7sCDlvGh{hLe)Yq`3B2)#kz93y}Z=Si0uU% z0IQIa z%>eY~fH+7xt*`F2c+yPD&xLS5;>JU#gYw9iJ`1lvJJNFN+@HnTD-gFCdcn_P+Z7nE zJ~=Rx)L3p4?PCIZFVJ2zbfddqhigK=JIGi^gQEN@!FNU|b?6WIkB@II(awN?#7$HBMZ<8Z)~Wdi6MQ$7*xdoHpovlE6U5G|%mqsZptsqv zK9JJJVW)rV>BDg>J|Z0l$waW05I?E|E%R=)i-aP~Go{e`CW;kBNWT$!!z8f<`gA{Z z|0Jw2ql9o!c?ZCHCjBZ-ztWs-oo+L30-Y=(uQun}bD^h9#tNtiu*C^3@yZYP@McI4^j@qAr;$Vl#UBJ40;{lyoYkUk z#weU7zP<*1kP0392T!^dpDdO@&!2%6hwMx7E6Eqk8N%woibEKcsR^uXhS+*7%H)Uc zKT7Pq7Na<71Ncnw^|fgCOz0KKVrDV)66i(8iwlcUhC1l>RI#xbW6Vc7Hb;j~(g5`Q z1z4QQd1sKk1?4?e94a>FFVBQtml@mb=)btvzQa*VMvMC2N9+B&p-kyy9}yc&ADhM*@e#tJ-A`}F6de3iapnxX`ZN!sP{4~;)5$4l$Ha`4_0Ln$x^{`u(Z88gt@?4 z!MZ{it+_AH#j?f_R{TF$g=CY*PDE0_(yaA1v2R--v;NYY5i@@CHi)A;Uv+AJ7+mBbT{oIhHrf(khInBtoN)*09uh7?xK4&^OYuqDZiKt8z;3`O zS1A05Mn)pDT-Et;R?Oa}|oq*Wt#i2zmwVYU0nLvVt|U-3Ps2vv-0y zu9WfPD{-P;86MvWR%O{2Sd}pg0opi11N31n!fvqC)s!G2tjE2=5J2&2TJHP!Vob5$ ztv8Q0(>I~DuM$VzgkC6uUVpV%b`u_wo1m9m8yrdUYaR0az25)f&MU7tRa)KA*NA=zvci{OO?4Lfa8U;pY;| z=m8#jN{QH0hEW`K7u}R#jjZJ4FYoEno#2YX>U@E3&+#pC7CZ%*iYrasaFoEI9%JJac?< zvpIV?ZH3T^9SNwSSQ}$~h>vA1WAmyD_HNjnWXC~;$Or2Mn_&?-2Nr|%uNBKTm`gpo zp%32}JS8bk2Uq~i%7@eG0h>`8?l%bL08`Tl#f`cf`GPs2(?QGurpHYML)_!SBD*-U zN{|Yj4;E7@7T$szo-*k1rDD}BxS61B9I8si6StUiPalBpL#9?G`GTXq!lDAiZ^j4< zDX0_73D%5d1(#lA9+i}hKx>EtO>%B4l2}xZNv;}tf2mkojv?O)J$0RUq8wk38uwuG zScj$ABBB!S#g3GllcuMG^@FLQM1{%*>sj}!`13{PwCExP{0LCatE<^tRhf!g57w)t z&;r&CX7vf*--W#)4EsPx9J)^TS?P%Vw_<9ZQH}ep^&)a3p1g9Qm*2#Lm75F8#jJ5e z>6gG>342`>0*ey{$BBmP@Y(838}V{x6Kwul#MX^C!TO*_Z4~=ScixLWt`O#JXrX-Q zUAK#cx8bDsLa)XzdEbUIbU`n^Q|!47Eoy8**WM)#5zmAkk2h;8Fl81&uc{KuDlkb@ zL$9gAuaV(R?`G(=RoK=8MWVxrzc#SSD)A)jX?@TKV0Vxa2el(@fH4S0Ivvy#@%NFR zyxgQh?}I(dvSKQRq&+g??-p}zN7<{O7d#@C-D{q1BU~?@xgDdh54ycx?7tmXoA??O zqh5S)FP^vUchI+50PaUc(jE8=xD0ycF0twkM5=?Hx=U=l0}oi8(32m-4g~V#E)-q! z%qdf@k;@6`!=q#>(ES+G4dT!p$R!1OM}tW4piy$6_cn<69&_P|HPADjz}5!j&mD=! zzXCN&rUJLXrxrd=vG`ZpWYO#~6U|<*%HNB99yGpVD;lOzjCjzA`Ow=M#llK_FxmvY z`$@4Cx_uaW-%}WTvcP%byJ9@$j#lCe;OqzB)+FX`Lcf8I=rzxZjd$WHy&bv_n`u<@XC`;zd0`05{ybga@Gv}GK50CN6ZUx#c^9gY3*Ffw z=HG?kPz!zVPh!JeXq`Uj^)KT$*v)I~v?)ld4=qfslbui~7XNHJQmm-LC2==Q<*#5j z3|Q!J;g9wT@xCISgWZhZjx*)Y;`=Id;p$xIyZ?d>Fvu|{!MRks#FW6^4|_b>aoF)! z3Dyf{4H#y1V1r=P`E;b?uL&$>uh@Dw^#*juYr!(n=pO{jd`*0CH*Q4I>yY;A!T2;I z(6%HguZy{x@q|ni}Z7zl-(vpnbZa*Wfewdyq!dPK>m-#n<;>pwjLoZCzqc zHJzo<>)sP0~19eVB|@yxv#WrNV2U(z%%%XD~A{x7kQKb{5)peKJ7Y!@m+ zDcB6K(DGD)IlhwRX@qWv-A9GRL2c;++x?Z;wFT`k06p(J@$MG118tgO|6U~AhkWy( z8~+sx?n60ip=bOcHr!{e?N(NYHd1Ph3>>&{xv9XGxUL9#I_o=nIC%pu-IFJ@;V;D z=`<=vYRtJO=RkKwV5K@03I~<904yVf5vP7E15b_^5trU?PV>|u(1LADLJQvn)&v$> z_*Sq+FbAc=mr`{bMTz#nUJrXM*?DD`TKkv*Gz@z@wn-`H+3?Z0U9n5H$B6&lZypny zQIDG2urOa-a2D%K*Ea+u%*jPYLVVMt@Gm^@{`oL5jU5HW*)*C0*K431I(+Rz3 zJT|_dwD4VU=)EiX4!~YKUc5`b>ATQg31hxt_qpVo2YYjZSWt_}tqyvgt64Rkx~QQ&k? zT^l%#>TjywZm_^4Y)>HDr{zI2{)8T|OvKHmh^Rj;7tf}3*Yq^OACejkI7udth_@%2 z({^sdbvzlMc(RDwhD&Y^^s>n!Z5u{vHT3pGv348!vK4wCK3CdiE;uRx-F0NJ0+d<& zti#KsyP-R=p$vb@+){_d zGyPzNShHG(`>^=mV`hYX2GXV@9e+-+n(4yaLFq#GO@Dde4s);L<Z%r?O0Cc?!!jSzg2PE|!n5+}R`Jza+yR;|(_agJmzvFIkST zJn}~waTd!3Eb~~dVtF0QO)R&ue43??Z9~HB*h2!(oSP7{krs=^S3o;i(*6 z&*39ET*2Wa4sYi06b|p?FioAtQv5YAn9L5(aCj1jcXRkC4)5jgOb)*}6t#U~t}?KVvkH{R{7aP(^W&JuO;81r{wFa{XPyu%c?$Ct%%kIod&Z4RXF~-W?3Q8N zIGT{?cw&r4S_Q&HXdU~;GLZaQ=3g_n#Y%oX^8~vrXf*SaiDNt&^Vwjt$q1)$go{)J z=9t;7ql~#dF2X7hEJX^91H|nAfX>;-r5X^S?5;GjB5F z@%30bHmg8SGmrC3mL;;sNyBq&n9JN2EBW)xmoblK{~G3Nl)p{-;P%S|$1;8#>rvkCXgG<^w7N_J4`FJ&~J~{cD+LFt^!cI(Wpgj*FGQ7_*5%u?V)Dc&sdGB!@5Lu)Llb z#wHHOuzeqg>F&cil4X1+2j_Fx#o@C#T#2xi|78peF2S8D%q3`1VJ^Wz73LEBtioJ^ z*|TK<45!R-r3$-b_#PFmw7$i`{gMJ)0^1x;z>p=lWGpO8P&F2oC3tg=jjm`fH|;U= zB4$0ADr1)x$$9KW6~0Q&%zIPuo66?WGm=jnXO&0E!BiRUX1Sl^)i#}HW%GdwH!h1Y z#4%+tQ@3|T&hWIdyN~5=mX$0UIGZn2^!)Kww%@AoMe$bnunJ#zgcUYVl+~!sKGzCQ zQsJ|5tnf@3_TWcl&#}N<<&Y6)g-=uAlVh!LjtbA0t#*kDCr4ZMt5o<{(+c0H!n0&S zZsV{$QTD<;Rv075K3O*0cI7ZhcAFZ&_1pqpmUS#^S=O+$a>c)D4p*_vW0}E{iZjiK zjkNB>XarMza61;MZpEm44x=(c-HK8DrX#Fw#i+Qr9g9%6V$=b+9g9%6VpMxU zE|N_gVaTR!(!#D6lwG!TiWc_fE4w^}?V3H%qU<^7l(zdStzVTMqZc$p82$}o`F-d$7o^QfAIN`7NPw8p+I>C9 zR3zuuyEpeuX9TEqg(bIn2N?XHT zVc~KOyTvi>=J6hGe$DuQn*V7nD=n;#2cKs5YT+?|@ld-tkqhDeEhqNQ)a(u|JeDXc z0on%Q%V()Uz?$*L%iL#QZ*&SMV%wMd0bF3x&PlcC!%!w7B zX7_4g-M?J3yS4C`zj!5B2*+eJRQZ8|hh8+_3H-vlpM8sQE zZVh9OBAlY(fVh%y$7A7%cqJ~@Fxs2EV>FERCfu|uJQ1`v;T#R4y@5UbkA{2uwD8zC zW2IWNyS1?HpQ70V^J+Y#<%p)=1=wSe>l7VJ}n#;0fB1G?$*M(zkSRuABQ>~Qu)Oiv&mUM?JGkZ z$et-4|2sy|pf?zgaFdAW1TNGtuD67{M7VdgxRS6-!vXO+;g+4@-o+9-HH;xn-nBcz zy>lcsH0%=>`~%*lb>ZGA68CNo$6oOQdFN?3M&h<@;ojw9;sJQ4Yq(#mBi!&{xVKwk zyM{Z&NBiZ^AAOqrC~Y+#l|Z_9pDqFxs1N zZB4j0+8fwoXxMjOxEl=;I@Fm_s@YStu=Ec4_ihPK&l?{8zjH@kxPuX+h4l>D?hVhN zTnp>|>0x%{-(MY`fF7Yiv%9sh?(Z72^W&}-4m(q+{&vkFaE~g`|9+C_)$AQwST9hE zX7`4KgYA!4s*fu}94N73Ev#pdr`a>LuIlM*uT3AI={%xAQ zNec)4x&F19L%9|XMvz*eX3x>Wx_`Q6cc?JFLQuYzR5dV^1Ka!W4sQV!N%?nacApm3 z{TtZs!IvbKt@{5Hp;WWGwXmK+=9rzIx3n;y1xXlmvJQbNRl~98-48Hr`84bmn+TU{ z826HdGd1jxIB=Jq_TmpIZ4KjjmvFg;@w`hoQ^R=PB^wubS%OSoLaZVNBY)UZPfhs{Um#z3W>>86jULK;R#5H8m+I)ZSf zhS3p(10Fr?#UE4J8b(JDF4r(Rf^epW(Gi3Lcj#$Hd_rk!7#%^lT*K%H!kHRIM-UF& zuBZLFm9~b_5mwq7#s?2Q!4DoZx6VcfM6Zn`BrlX8i3H0+SLe?z#pPi*=OiBxMC za}?ne4da6c!W}nG>i`(2zRUxPXr%45H8j*+M95UhSA=Ho7ROVg7zkyqhYi+@Ok~E;od$i zJT}f)sn+c7U|8Ju1)fHDWZf8^te#AVX7_4g-M?6~XKLXw|5>cXXb%3hV+9h^|2bC9 z@*q}8SW?}T0`b$)XGOS;V zyqew3Vd4L$>6qxytbQ@C4`ao9eR!g7i5(jDiw7<5HM+Nj9U8{)w7jp=y)Ep}uwPv8 zFDgl~?rmX*hW+9N%llg0+rkbF`^CgVl=d~cw}l-V#&lqLU#)vv*r8#+c*pWC(!DM0 z&@kHjODf4#y0?WL8b*6t-m7(Q3p+H7_O`sQ)V&FN92)i)hP&zG&a2toT3GjYXm6u_R88*N21=G;Zeb{Vb_b$ZwbC*TmsA zmeg3}_YQ|;i=q2|t0o_^qkN~uFh1k(e?k(V9vb)55og|jT$uBh|jG%D}g=zSl z!v?A`Ij+)}*8C1~_#2i#vJ6NW{NQDn4Kb(7gg%)jWdes)#*;XF zJj>hJZ-M5wki(a-EM$2VOW7pogc}%aWU0dUa#&@2KZhGwZfE(N=Jz6p_p$V`d|&hX zh{7}ozGlN`EPvD-4|6ysOSXuesW4O`LO1DEv$9FjVIm-`O{+p$m4S(eDuPlFNX*)x< zl=8E4_*j-1EKfb-80n~*@N_m@$a3)+Hu1t9+lij^)50AyID8&UYkomfUZ(k7$>9fB z(n(22speP4;ms_q*U{kjkPHV;lSkR%MV3xV4aZ+Otj_d*aQF+Bat6d&B@U|^8+_U& zsnbs;XPm@g>36zeoXlW3OZ8&j)nSf?aUF*@vy7kyJjt`>ds%fgRes7d(YGvb((Lh> zvcZpHc{)oKKbylVSYD;sOE`R|lm*z6L?);bc$C8}Eca^mzj62@mWNoX1|H;a^l7&3 zuSd?F-uD-ozUtu)uGqV$TJ{^3X;;yF4zFfO7brTe;jp^)tmW|SELFSLa9HMQ7~44f zFiCNxdb9MKjPPo!w+oe2*|u@tQIf8WbQ}zG#9kY`#6?N@MlCM#Tw~So>V?i& zZgBaqjF&|@to*DOMbnYdEH$bvCTa9BhFYg>8Bi4Qf1Vq z`So*H$?@_GT+CQC=s6r-&hi+mRSaVVht-L41&2#m&St+`Ijo9t7l*g9RQWt4!%N0) z_kPa~&#_bu_zH(rf`8@k0hZCS9;fgvwkqEu4(qq#XERsjIFG~M&67m&iFt+Kxz$y# z{gcB3T5tTM`5FBDas*2i-=T$%;czNT)dr`@ut!}`jV0{xJC>?9R&iKma21EwvQ)is z8;4Z}cXN0fOV!8?VSebfXBfQ9Qnm7%VUC9JHivsysz&}=^BdxD1oxU+$~S?-sv-^w z)7Y7Fve+2FZo=Q5K_PtM{ZBcwM6t9W{$+4@NaN*SO8>GxDN8x5;;CWyBd6c`h4c%s z%#{97M*5fIXsN~N$(+F8A?eu7vV$W?ihC9)2-Xc!V#o_vY$&x3tY~u#o&9aiEn`N1dFCI8-o)#I?^78(}=95vg zs+Y-9tLAM9$P0+$T3L?btHriabLph?r&PmB&z5E4>rrg$;C@T;N|p^QJKowcKYID9 z9AO<_(>AfP$D=s;g9^AB|ppPC5mGw{>V_1 zE+Z6M)G(f6Zp@Rsnz@g8^*r&lEqbZPHDB60*gnkmn3E+>WX; zZx)fw=PZ?z{0kRKN41xPYLJ!>tOk*fkCgXW@Qc9kVgve29;=vl$OuSM9;=!AHNJ*< zzsA=y4}@{#zmW|wAIdIL)9{1Loy^rz>?Y=!%vC{OW1gq+511D-S4+abA?`tqtJz?! z?MCIsp$Vxa8knmK(h6;SEqjYIyFP&yk_A79H6a+s@xZf9P|9P7obV>|P5=BkgM zX6|LKx<(FSyWxz87SF_Deo1K&ACnw>U&O^lFCFLl)+Ua)HF~yi+M;9U@iq&bnejPN zwa!J2)8(Fco>#mWhs0{U;)}TG%OiWeV#yJhy!_vYEszn0cp)x&N|fEG{#JZ_1ZJ~B zwVa)Es6;baCol6-=3^)Ce%X$yKo78g7yCz{Aap#=oVKx`qZa*1hpK+dx7MXW-NE4& zOT2JI^wG--Uy*+5{~lEy=4zJ(Ri5;H;pI{3yZ$TU#-o0&c9oKpDqgh~kJdEOa46(C zLY><0{03L)D1Vg;MW=KsWjf;J@zIMT%YPJyt-^FEH!1%EXKHL0^HR(Ubg0A|v_k&E z{w?oFzh?HIfVQ+c?LEoMv~<#CVbt`dGO!ytKZ{orqSKb8cOd1EL*5{xVEzyYRTa$3 zt)#4y+YQ$*V*UiQdhaL7A|-vcM+H<|A60s9EMfn=9vNTxpUb?Bc^zkyuNvS}3rsew z?XIEIcSw|RUa$CmLiE;&&S8L%W3yO1A^K>KYcPaCeUPKo{8#b@Ht%BIG$esnYv`uG zhPUHbyNrZq`x1gt#&@HftT<_6^u%TTe3QqJpSf{k@rxo-s!nM5jZVlj#FmNCX)6tE z(-3;R#f4WqG3=B~Fxs?1pbFm=5q`J!k=15N&Kcp!t74_UEtXA+UOKUGTzItatZ4JQ zFAI-0%B4~~my4`&uRcP2KM6z1u6~M;?M|dlJ*&8y7*1xM!v1;ezk+!=^K>nr-tpnZ zy#v9}E}AeodZK4=XL#YOIZ?$^IMGL$q|h+(1*Sv@lm0&t%@qyoxiP&%EdnSy0*PhVeV*rC}VG%wjfFu%Vn2 zx|jJ7^LB2irGW%7K}>e|sd@$cX+kG%-LhnGjn}XtizAdV_b~qxbCukq%wJ`$?sQ&Z z-oYF_YaQLpyUvy=plhuBjsLQthYc!1JZ5bw=@-n^9mgEzLz@3Q=7*WfNgsR0F^^g* zGj8GnogeFz88owDCL309g#Am!{v)HGjBJ`L)=$ML+xbuKJof8{A9ac1Da?nN53zqI z^J%y{Apf>LnNBq)H;;MFAqn_V9G-L}7=yBWCvY-`p$cd}N7hIcTt=`P{$s^52MXM0 z@?hYYs=$h?08thK}J3&)WL?R@iL)0 z&PUZSoh!oWbIt8W(`>PD8m{NHr*H&z=;!nlm+9d1apv{x-_7~Y#3yFd@-8x&LUYM)o~rzdp7jw6^p0iCelmKIU&cFTph)0*!DB?Z)age1z$c0(YIu#1}KrUoq)o?olYX@sRYBUU=n&<11dwW);6nYv<2lpng=`#R&~D zx1T5bMe!&+2a(@mA(-%xkTTvEMgwdc@B=UnV4*7(a%@ z5ek^A2;VRtU|z@xjWEy63$K73*AHsyW{uBc9)E$&csc**=-i0N+LOf-&git$jMnhc za1UH*7%Q&sMjqiLvXBHFapFN|^wA>am}uw9;n%{`c#hLhTwMkCG0%Qo`Uki=vKj0~ zd1m;T`>}Wdc`WPe2v7bHCsY5HJiTO&r?@)f z7c(DZf7L4m%qzQOI(3{+IXJccQf?v_^J?asC7*1p)C$&chS*O9%X>e(V2^V~imM7e z&wR#5(!Ye$>tLSqh2%}lyP3DECm_Dm1em)5mcPen;|O-UY)RKIGNFDc#-^0K|M`@W zVDxg$IT_;^q(d#D_)~0{&%F9VIhc|yj$xoiLh&LInT)wVH=c{i5tnhnI;Tip8CEd6 z;XNmO1l=SiCgV}AeR_B@6`YLXiJbfc%>C@IMnVH~V}?v8o&8^Bp3Xdjc{lSS$vs9T z8xFCdk0Usl|G+%zD4BsOP&7VrpdsyG-pT$B=6%d}GoR1gJ5#3Pv$)tgJ9=Sc>3L%R zY>YCs2Ng##R&gA~RV7N8tG%nDI6@V3wYQbx^~}}YSL)&GdFH%@mdD!Hm(prwgW6+D zWxSuc+Jg&iV;$MJd8NisTRzQTemVP(Z3)G^l)2h6N){CJe>EG_o>Hm?2brtArxgE= zx!Rjb@hC2k+Pg~eB<5;wE5%PFeiUk;HosB^7e{C~@#SsDMQ@Ibbe=Dg=HlL{lXth` z8jYPFU3p?P?4ItE!Uy(2e4Il~q<9%e{FZr6y7X^lKEga|p5(dACnU;r@|brpKbpB? zzU6;{p)xoX2J6bhXSDiwLY>gA3&g?`P@#&f@B%A)alW_{c2D|Q;r0T~P;phjHOwp6 zKa&es&V0AVH!~k#-p>9HGjGYZ^7R;9Y1e z%=?*VvHy?Elh2j@sTRlJjKPP_)P;G=q+vHtaYr+c`kmxuoWaS=%bBYdy6`vnI_B-{ zpUUYxK%5??2icI#hL<=(#&VglYN5T%qt2IHU0nXbyx`(+{t5G3x8!+J7{4<2T|G`d z%<}i5#xeLfom!&h2I*PFO}B)3WvS%q5m1h$1f%I9c~#-^8}GxP#-`#b$$4SxtIObU`fP=a#VxF3YpFjr*jPR82SPM zM+x`wJmzH{iwCDl7aMA&!Ejp9uz5N27L8xdyo-4qH{JEji#ExO)p=dcJoQe=v#iS~ zM&sRVD6W=<8Qiqnm{;8|c{kVKG3M@C$&)!_)i?cG-!#LY`X+`xt;G?;6?=g=-74EP z!yb;{(Dd7H+kG4Bm>D}Q4)8;px(6RCveGk0qIOy(|)pU1pVHW+zHU1EDH*-~> zKQJ#OPUBx0USLD9me60AS8IGf^Cpdd$h<@2Uor0w;nw;03malqh1YC6Z3c=yPSN<$ z%yTq8pLwyy&t_iDT%8@4B%%J4flo7B#}WE9ej9VgrLv$Zq5GNVXuN@WxyD~&-gK!) zCgkEl^d=knIfCLJGEXT8_y3A{vBrN<8E8BKUz1aX`xTe-pJ5!shLp=>26isc0_K^_ z)dRt~%++cyRnS7_UiMe~7Uq79d$zJcEjv>Y{-83TuM%-6-l{Ut_bYD15B^gSlJdeJcGTUQDAh{zYY=MVN$dE~ubt z)vNM9p1J$#@Qhu|y&AuSxqpoF`L|YOz>9EI26w9rG+wVV(D+L#1C8%j>GP6cmHy`* zm4Rjms0=hd;b_?sevQvzu2v|k49;Ng=9SBeU&P#_Ryr%gbt(fbf=6Y*3#OI-4wZq% z|H#~{@z+)Ql6%HZzYkRgynb6{@QunqZe+(7jb>@zB;Tijxt8F%v|9_a5 zYyRf3vchV&4v&g(6dU|ngbe0t*AL}?9`nrg;RRaFyjbJ6GWUjaY~#;{j&OtV6!U<_ z_cB*|nWzH2&)j`ec!36(t1VHK|F~po3EcntvHbF~eQD$ru)?hWAux`esfO-K3PFk9XKYZ30^2>lv=h`HmI@C=@3t~U2k z8NA87T=V~gdDAU?|F0r^#|FO^A$pE%3ANXd@;{1sX1UFpP!vCzx!STw@pGAbmA{<- z4C4wmbSQ(B9QF@j9?3<{#{b0JZ*jE0D$(EB z5YQrg&RlH@ru=_mo_Sk%1;(eymT+tQSmx!SocjMXHh4n~;O8^6gT5Uh!#s%JGu>EBO9jWqbk~ z0$PN{%pJFf7w8h^nHs-=xm)9RFfSkDeEvPa2Je^w?T@2@xliLSF!yWx4dwxjzsKBh zM|cJLJZwkT& zCshr8X6_D)U>LC{a2IHN8gsA4k7w@F_-VxH{@`w&7F-y^gusu2b<_ znY%ZI*4Qw%FfRwU#=na22phawgl6VGjsJzYU*iXu2Q>Z}bH|-y1(N6AARE+Xrm8>@ z_~wo#5O*+wLB}NKYNuDH zMe*GdbGPQdgL%0}GyH)KUXA~WxliM7GWTozedYm;|BJb!N>;$5O8NsE)IPY1+fL*z z;0TIOVXn5*ReUycujYRWb6+_37-zG=A8s%%W**S^)yy4tYhA!xZ6B-(bT@Og?Xda+ zW2eP&|F8BZR)(iIg4)+uaUXNF0kYz6G52wS6#tmH+F)7ne>1l>W~TA448v?tJ2)#o zK23Ik+WJ}XnatG|(TbnMTx~6_xQn^kf||H>{$0QZwRg3Oa3yoK$F<_?n5)gP72m|X zZL{ne#UEtu*ZAXUeE&bF8D8KBYIkpy(Cf_AHsFfC!(442uK4H7)i&dbf5*J|9==E@ zL&Qn4sntH_ice&&Hb7VW80KoDbj9Z}R~xJ=zLP^hmR`SaKLFQ@;`W%_O;dz1$YOi`_c!{~%<6iN0=4vy1#ouSHHqlr7 z5OcNJzT!Vgj!h1>$Qmd^3?5}@N>;o1D?W|6`WXPl=Q3A67ohm*%+=2fD4xq){u}|? zUl}fAgZdo<#n&=dzjvTGeRM(v&8Z2mKrM6ivkA)oapwL|f9n4i*`R)YK}Gm0^Wyu% zGw5cne#Jrg|BHD*^Z${#`Y{OQA3cxn|Esr#XW)Q=YNmcvLPa>9x#NLw|AoxeZ&N7$ z^O!ej{sqkO6Bly)s|Yu+A+t6-gFBe3pUP1F4>0f0{2Q37U))gsFEDpMsM6>2?+rGn zU+z#5-ecZB7D1jjeazJlfGGbTn3r!;8AyL~zHCwTJ0i+|s)r3R+ruNIFjv1vq9UBe z+^hL7W3GPIMEPIJJf$u?{SxLL_46ny!tHGEX%X&cu6|`j`9I1$XGeGj&oWm()}s9X z!rU+YJ!7ZeKiHst^hHJZlzH*a@C?3Tu6{d4`Txp1p!ttKS$2W?2^#5-{y&Nh|F5p| zkE^Q68uw8tsHmZ0ij?wZyhVw{7#f*Plw@Sopiz=yk>Ny2iAF{Zb#F$6Mhz8p$gr+P zg^7iVNlJxpU)L?0m@y<|Dz5AT?ES!5j-|zWDK0fQmUTg1t_Sxsh-MiEd zEno~>x3bX!E`-NahU#Al*BxkdH5-+((i2f6*G?Qh29_Ukle=o>c#4xb6<6yeP?(?~HW1jg$(OV4&MiDPIO} zsR|8fHN4-$8{xVSmipNN&+;!1b@Ukm-Dpbl> z4Da{wHn?uOrv5*5xtafG1w$gTzQaH_Z&QQc;SC=BsPQy`ho1_MSrO`gEZp5n&guVJ zz$64k9)nD{Zb_&5bKspG{Y7xy*-rHzf+w#$6p(xVRU*(G^3-4zyz;*coPpwXc#DT` zhxdEyR$LsJG z58n>gy&cuhM{wN(Qn`O00^K~)=ejqmK*Nh(lt`5yl`Ku5J5nl-g*SNg$G|&1{LjMu zR=-E^7YuYuO)Ve?p8Qg1KnviyPp9fHh8KDCpMY1o+|<7sR3m8c7;J!ddiYj&zlVPS z*WF9i|5tF`<<#X)`~NS3teViw4m)3}y2!)-2(R?;|A9An_&9i{hhJ*A`~1J(Be(_w z-85D+m;=|%WtHCn&sr6lzyt6i4}TI~xytkW{{;jM9)k_=P7mJ-@AvQz;4v?U2J{s? zd60Ad{V#&7L4j!(a~wW_Ch+hR;gud94{z}B^WmKyKE;oq-y@g_k69g>K|Wl!Irh0> zTGl=AERX)9@FEX?4(_k?2LH#j#s{V zqAA~fhVyD@#*G;0=JaZ?1FpN;EB_Q;?(uT~UgP1v!khda!O<5=K%E|bGQ8Kr$G{`% zLKCcH^kr@bN>2md>_k%rQTS>RUF9jxT@aJ|jPIQr?4f z)t`m$c}DcBhlpSuJg{82R`F(dCESOfe;V#|!mN#Mh>?h_6o;GROn3oYXOR=&L3op^ZT5Z>*_#9IeH3$MY3SbcbdZ?occnVw{y$COWs~@R3^CRk9d+yDqsncHxZECIA zUhF8|YQSISCMiDx!FG7Ihj+nqJ^Ua%U-+RVeh*KPCMxt842Ktc_}TCh55ELn=HXfJ ziV$u_q1zBtg$OLG1YYgo%iy(}>|J?g$qnmfd-yG;CTlkRziYA!dy8W;_R7y2DuNdH ziEl^^7oh(EycC`c*Osii<#31C+inRzb4tYa&>+4w#?Frul^0?>053*g`S6QHzjyn_ z33HtxA!?qzaGv>*etk!%<1bNE9=fJjlod7Kjf&zd>qq;(dEq0+=6@3ErXM%TQ!&uw z+UMJ2^G)UIYQ5?&`Vxs#c@%ng&kKOU~D3`@D@yoIx>@u5lD)d&7!Xebb;qw(YIE^bzS0E z`0H?8_*n~XgX?<6=CPW4d;-_?j#dAAhdVzR)&-HZV6$qG+qHDT?@^kT`Jq?|G_m}hM?$Q_BXegwKj7W+Qa9Y&RNhSj$I}5&qj3skKk&vRqgkQemn*p z@F2V*Oa$HVr0+yu7w!2OUe)XJ(FpVV=`71c9yVjJ|W-R-S@j9z5|)8OlnD?_PLAlgme2 zK@7?fWNi@xb)*587ui2M0q4YoVIhBNjh!>RDUU|l3NJ)IkrvnuuRclqw7?I-^G68R zVdE#&7w)&r^};=lxl{`7!a#p}eImT@WN{Qg{~UN9+(*GDWQw1paiVXsaSu)0clUn} zqxR_w!$%G8zY1M^t8ViB_UwhGlJ;B|D!-Ak>*fmgwrT^FjytQ^=sT^dTytIu??Znz z29@yO+lM)1lxLO}WfheCcM@hR1be|kvtUco{Lnbp89z>AhTSc^Fr+R_JmO!&wB{JO z8>e#WbQke7yyM1Wi5K^pJ_PaH-9+n$@ zr$OO|ZUa^zXu&}9dKKOU*K6Oq@Bz4w>^_CZz9$7I!u#Oq@D!Jui_TG((E|`fVGzbF zHVD^C%1P+gz;zr+fOmxyU^elB``RR+9Q;pn_{pX!0tf;Kw8eZ&?AAqQUB28WL!0PU zW9T%I@*0m_&rW$4gAD3NmzLTe&hc?Tq`i8 z+QCj?WA>4E8F{p4$AVPjcZj)!Mn7gxyUUsV@3fa0y`fFDcB}b2cF)UF z6WSGDGy2Dw21#<(%QnXV@wLJmU$D=*+pNi-6fc+JI^-8#E_SK+i=ECPu7(dh2S>jE zzGs`9lsafX0#AQc;z~jPMVIp*bNBH5-DZ{B=o=-7Ecgc)mpiMwnlXL@Or5MwV(ubqn>gY8oxE)6a;K57m3B}=O&kl3eX*Wj> z@(Zqz8p+%#JQaV}!6UDe0JPa}gZDfnycYcu<(uqQQ;t8L`zZCd33+;n)Ok*GSQEtoB?>u5^>@H93|>2$dXcP)a1RB@prQ!6}}X%D~Gxj5e_HEGT_ z_ZWVqWRmx>@Gkghc+|zxQnm0@cn($349|u~hl#%WxdYyt;`$$LC1CI*0$tTR7ycqV zX}*2X1U$4VXpi!nz$>1W#NyC9`zoo?pr=OD4R=PEuC1aNM1KZ6=O+O%@H}`E&nvWL z?t%|o>;``P;K}$Bg4m1gy-r~LWfE8<4nIU5u}wfJya!&!`hMC%NBxC>TSPG%{o(NL zpQUA#kA=sb>UNo#RtW}^5#%%GM!;vnJ717MmEQxeTQ5!4j(#b;>LL4^fVsx#1X^pX z33<%!rCguPW?^F;AEO62C4X)4o`SQ;x32JgX`^@ z`dJK5zDx3PHve#rN_d$pTJ9gb*uIV+@+m1GO7yLr@X{RuI5(}m@UQ{lJ_`5|9|9xDa07D!ds-nefPW1jxc^mX&L`Gpgt|OHt@Q zfPU(g;zw`CsvLf$IXT+eB+_&YHe=9F2Kn$#c=o%ZzX$#;Jm9lu+;5sRlRlk{{ETUm zdBIs?*9o5pPivK?4pM`&;6=sK5;}j%hxb*BzINTe!&^qW{wG;_a=eP5B2FA7(+A&% z*Q}6$bV<5Sc<)|&N=f+Sv4MJ#M-%Yqt0j?a&!zoRc-c<-?GjS~`CG+KoBnR(J=_av z%RCD2D3-tyDCZS;rl*`XxOI={YmfK=o^YpI?xA~wV=^V+h>N5Gq|ccRtKrS95@<06 zUki^7>7$l47rvjhay7BV@D`q>#Jhg%?;Z#r<Jf}?*wK7kK_a?i3W?DfCo`|67egW;$2-Y?5(xJljfo4A3^7PLD zyk?XA%@Q+biay#NzSQ*loHNC~m-711>!H8qlF*UYNkW0m0$SiB;9bm__Q1!$i#UM` z;TiC{tKCHXgOj~m5KKH)YO)lA#c45SZP z*7NXY?pKpUi_H7sVsc*l=j;t7}G)AV-51IYWaVah^=?vVKc;^Cbb*h`>H+V5z_<9 zC)jtJzq7kN7w*(-iL--;_m#vm7oIX&{6-MReek?zq;fT{$Km^n>?0pFb3V8xxagk$dia`74me(%@XXk!Bba@ zVm$mixIP2bc!ypu#4QhswH%R7P9TJhW zulaNUUOQa;BoOfB@JJa|{ZZ&z4$TntgD&9Z6XDolp~opvBZ5h{2X}VY4%=Y z=MS)%lGfxRMd6O=Py&}62=Ge?O30{kz6w}0n?(N+PD$`Lg4GEQrA z6}6y0|d8%KUuZx0yheu^g09uKc1mg-I}fuGrO4&M(MY z&XR7J2S5HMNhFzjI*lt4UfCvo1`~m&{aFId!OskM={Q&4{=LF{KoR&!qDBHbp1T|6Yx6e@`pa{T8$uS zgE)%Bpcx)NT@qnFX?+f_xk&<&*08K!;IZ?BmmDUJPB9TUbHR%5h0B%LZ&_mzv`u&W zlNBX$>k4@4QYlz7&V`q8=Nd(z0eGn`4pPO;s)8r;>_NLggTv>Th|+Nsfur3Rbo@tZ zB8Gqt!ZUa!uCvVWTO_lnfRtEH!9IAx_4cx5rm1UqPogK%4al>q#XxKDes~8@X*8}X zc)>doP!aKNga=NL3T%RJhsSJo^YB}lM~dWY1WEspf&&=*ajqoNnJWb}z!TxUXGj4I z-PUAy&H+(W{ps+E8RDnS6`Q8cSAznnSTyna3l~{%5r)YLwB_*c9e}fmVwx=yOohZ6aB9+s}ybd!V zIHy(0Rxwb2Q{WYzM~BzL>v@``8UGEQ79su{j~9PSTuw0NlJom=bDvkkMS1}K8pcic ziLv(ZPIwgeBT4A@!gDv;GoB4!G_>y$d)KojxpPCH%eus z!Eb^$W=hcM@IrY1Q*O(fr6v)SBj_0|29@wSxPF=w32%m{GoC2_0N#GSbgeS^V;z83 zF{hPUF;-#oCF6)|>}5f7``X67fYB6m1@ho3dvDOZUXMP*K5K<(zJkvr<802ZZRlBC zv$Wd3h3DTWiRIz2R^Q8bS5C(Ec$8UP=>a zf4mpo$o+o|1+Rcd{Uilz1vJ7tdAKPxZC|_6%tT_w*>|sWHf?@Y%C5uL$OV#IPQL&> zcg}^!^WI8hx(uGV%|2-S4ej1!k9yuzauOdNCQ4mfHR$;m0AeX`9lX0zDl-ng72d>5 zMl1g#c;6?IYZ>|nRDZ1t{8k|a|AJsY-7Nxx6BbIMwR@xjis9$LyTinRo-dcegRcm$ zML)-I=QWbAPBi6Ta}}A7K|fc8LJUga#oTgaz^mYK=xeuXgx7yA8Ec^J@CXL;Ui|EH zxN{XrmDd}C-w%Y{E*U4U5J!2Wb}BrKDODnl#=$FjEEWZy4v%P+nn-~!g4dhtwaMSI z_8@oyL7HDm75YEJBVU%p%m{RmD~d98?p$^H zc(0x!O>LbHFMm)n;9_M>fj3@fANitrpp}2R80b@!YUI{SVizQU&G0?5L|;GB`v@L0 zRRYty+X2-laXB$9>-ak)-WGYa=eG(d;A{lG0;$3Fa1mSu4|3(nKz}~Go55XqB|LDZ z1lo)KT6hj0KuAF5-?tGYY_(^+WKQekHzkuCsQ~NfMG|plseoo2j)m9oyr~m@1-y^% zN~7Sj;4MB$kP*&W2roI^^*`DQlk%;H5tMHe52*xH1+RX?9$RAq&Ujri&7q)u$g4WV zpaHw1?vzC8W{ZA0<;20uyM!m>XB<46aVQ@?8Qwn5)%RP`VrN~CAetBQF&Hd>xABm+ zfr3ln5j7HF5&EydBe#g62J{X*o$)Nk)i>v12ZCIBe=Uyo!%Le4^uT|GceM)8@g~wl z;G9g|ypYs^^i=qM-e=_CC)MH3IMl&3N1jPq)+`KaIE&QaK6pBBY$j3@HoUxDYC@m+ ztb^AwF^HkyR(RBl!^|5zbMztTMqvFm%)b5Q@G<_BgCa>l;q<#C#jF%5It`uzuPK)Z zCeo%;;f+DzvFI1Tn|>CcXT|;SYPp?1^y2w>1Z8|#SBj%XcsfIHI{ZU;&U*kU-}(~X z`v-}z9`Ud6rZxdB?jO@RBJY-r2jsz=m4iVdJevp1@$l*Jx;g>+&goWo0wbE%XbC+2 zH>uGeer$(3og>ZjN_`^+ofMpiK|8!XM>0!=e+$oNV2t6J&kR6)=kp+I5(^scuKEpZYr4oHzG)wB4d0eowfyTF@4p5 z_P_(LOCVYS-@;4f`$4Nx#8%inl2`?gBjuzt<)4J0pC=VMP@E0l&y$sC0-6MGVQkmV zJYD&EQPe&)AKuG-rTTx^;Z7&7W^C89D2PEn<3L#qYsfTwYb6-57l>W575 zO@-epHQ}2SX4&1Zh9~&zxD57Vc?B9R7lxi5vy|T~DW;)+8@z-}eDM3>O?<A{b%9v%sJIh9Xxn}>%edAi583Z5$G=UwM^A|;WhH* zp_NO)5dldg@-zWF>9tOQ_unA_)e%qN>CGj=D^9t;x>%&j+XVL&4!Q;-6eDcvh2+wF2 zo(hj#EO93>70iH-gJ-S^b4i3$t2Gr~dyM!Yo};X}2m+hzvGt})_Vb}hV2F6EL0-a@ zK?8UTUhb*T-S7eWw2q5E!1Hzubsab1Km2}4B<_HVCk_6<;xq&u8$?rU#eb#HHC*|?&Yk)YOLS8{jo9l&pyaLY{E&jUTTj9;~?3Ko! zzo~ARE76|&EAn#Z$5rM?5V3XY0}@}(OyS(SSmWWnAG_*Sll-x!z>9Ae2Rc|@56=~T zXj-@kK_hQ1^^|=G9^i|e6bi86K`ul-_-pV|Uic-zcf#X4B!PIhUQ8+fLJ+yj{&=G~ zmy5V_O~LT22PN~!7wl0Drp7wVY|1&brt^>o=Y_dE&i&WO;f0X+^GUSc-JNz@{j~vlP67|jiVFc#eb0+&;rhbH(eLn_0rW36LM)0 zGqle~5H(FQ)|-?k;N>4m0Sy#f2QRr*^tl{b+u&WE@68V=50ikz%Cd%)n#7zrMsBt= zL6OL_yAsbu0%{m)&Y1N^FSTfeuY>5!TxxYnb2C;72+>viDa73yu!++>4qqw(?N63A?}ncO z&nva}ZZ>CC!Z#9FkS4ngdHyc@tVVNIMJyIUE%r6Ydw8>^ox2qt_nRo{#QHOM*Q-*| zUHJJPUfn41rNNJRSmF+ou5sw4>*)yU_=QiB*jbms3$}=dbR12Gr>qw+K!Wq&yJ7t|h04fu3$-FzDmE<2@9d3h&=51#2J7f~PJO56Tz7OLy86-ZV{J#ek^t z?Z{J@HjiS}E85*PG#I`iq#Ds8S(H zVZ5IRV*DVyn3-gOlxaN+um7_otJk*%c(6b!Cz0;c0q>U}4qf+p5tLH<BOHO@1G&~eTRz38W- zKL=jkB6Y9&i{W|ZmE#GHu3n!i5k&2_M{O}3w32U+H1q!;FKCd0x+v%v(^gKvMVClH z@$j+mf#)UjRQQ$f79J4kEAJcOzPYZxS=lyREbc;(yi^=%XI%+z<_4;e0ye;PrGprW z*ZK#%e4=#LI6CEz%DH`zKuzB`;xWmrbGH<%o$m~Iq37~*F+BKhiA0<38hG?bDY%0` z^WbqoiLgY9vHs?8r*G`x3alAFhC$OB@z6^KE8)HxDIf_)TeSfCm^S6-@K`=eo=8AH z!n1-yDQNkB8xJ|Hym`5B?xZctS?1K~)hVSC zX*7;beL{G(j9`QJ&X>VU@o9M5|44#q)YLk7BEMYK zF7O__ph*&}BCam@MA3J8j~xF&uqQl zyh1jcV`FeSf?R4pAD#@aVepKCr@^hw0*c|&;q5sRxsMZYuHnur;kuAt*P0<@DF$t0 zq}FnAR0Z$hMz#aq2+w4;p&5S&FZxPKtVjP_cxRvZA0Qy>DN_@NnNHw~wWn<}Q|SFa zi9#$@p6w_Yc?M4cN^p1wJc5_r8oh3on9KD?2)c6xX96}*XnRlgrz?)`2t##EhqU6dLaT&Db7c-_Sks9rBK;W_`2 z2nPr>58lGWFaiDmy!TEyQAOYMxn~e$Pm}@@F<1{zYZRb0^tKl8hHyp}YZpA0JLMew z?1y(Va%hbXd)g#C&NM}v=lj4|M__nTwDiFu9Q_F%9BVIYHFrlT{}w?u^7+W~H`#lQ zd`btO=ApH<1dUUdLHrr4S6js7Yn!H0e)(g3a^J371&eSOjnNfOm4qH9(R)j zpr^pFXC&@KMmOcL@Hl2>nUpgLUVV`y*aXjpSH8tLn~UIf1nr(j6wkr4c!i#Y{$_aR zOZJ2vCXskgB4Je$aPyDSL(8#?f$zCOcpepfF1(a$QX%^3@V=>%h@O)-!QxfcR&oJoh|DTc*6=Q(e!Zlco{y?EPS)mBvQ!BkSOF|Bk$&QjGhX=XgLR^oE{Q6 zVYwupLWO8tI~Z!=2%)Rt$|8V=pdtotalPCMFrameCount * pFlac->channels * sizeof(drflac_int32)); + drflac_uint64 numberOfInterleavedSamplesActuallyRead = drflac_read_pcm_frames_s32(pFlac, pFlac->totalPCMFrameCount, pSamples); + ``` + +The drflac object represents the decoder. It is a transparent type so all the information you need, such as the number of channels and the bits per sample, +should be directly accessible - just make sure you don't change their values. Samples are always output as interleaved signed 32-bit PCM. In the example above +a native FLAC stream was opened, however dr_flac has seamless support for Ogg encapsulated FLAC streams as well. + +You do not need to decode the entire stream in one go - you just specify how many samples you'd like at any given time and the decoder will give you as many +samples as it can, up to the amount requested. Later on when you need the next batch of samples, just call it again. Example: + + ```c + while (drflac_read_pcm_frames_s32(pFlac, chunkSizeInPCMFrames, pChunkSamples) > 0) { + do_something(); + } + ``` + +You can seek to a specific PCM frame with `drflac_seek_to_pcm_frame()`. + +If you just want to quickly decode an entire FLAC file in one go you can do something like this: + + ```c + unsigned int channels; + unsigned int sampleRate; + drflac_uint64 totalPCMFrameCount; + drflac_int32* pSampleData = drflac_open_file_and_read_pcm_frames_s32("MySong.flac", &channels, &sampleRate, &totalPCMFrameCount, NULL); + if (pSampleData == NULL) { + // Failed to open and decode FLAC file. + } + + ... + + drflac_free(pSampleData, NULL); + ``` + +You can read samples as signed 16-bit integer and 32-bit floating-point PCM with the *_s16() and *_f32() family of APIs respectively, but note that these +should be considered lossy. + + +If you need access to metadata (album art, etc.), use `drflac_open_with_metadata()`, `drflac_open_file_with_metdata()` or `drflac_open_memory_with_metadata()`. +The rationale for keeping these APIs separate is that they're slightly slower than the normal versions and also just a little bit harder to use. dr_flac +reports metadata to the application through the use of a callback, and every metadata block is reported before `drflac_open_with_metdata()` returns. + +The main opening APIs (`drflac_open()`, etc.) will fail if the header is not present. The presents a problem in certain scenarios such as broadcast style +streams or internet radio where the header may not be present because the user has started playback mid-stream. To handle this, use the relaxed APIs: + + `drflac_open_relaxed()` + `drflac_open_with_metadata_relaxed()` + +It is not recommended to use these APIs for file based streams because a missing header would usually indicate a corrupt or perverse file. In addition, these +APIs can take a long time to initialize because they may need to spend a lot of time finding the first frame. + + + +Build Options +============= +#define these options before including this file. + +#define DR_FLAC_NO_STDIO + Disable `drflac_open_file()` and family. + +#define DR_FLAC_NO_OGG + Disables support for Ogg/FLAC streams. + +#define DR_FLAC_BUFFER_SIZE + Defines the size of the internal buffer to store data from onRead(). This buffer is used to reduce the number of calls back to the client for more data. + Larger values means more memory, but better performance. My tests show diminishing returns after about 4KB (which is the default). Consider reducing this if + you have a very efficient implementation of onRead(), or increase it if it's very inefficient. Must be a multiple of 8. + +#define DR_FLAC_NO_CRC + Disables CRC checks. This will offer a performance boost when CRC is unnecessary. This will disable binary search seeking. When seeking, the seek table will + be used if available. Otherwise the seek will be performed using brute force. + +#define DR_FLAC_NO_SIMD + Disables SIMD optimizations (SSE on x86/x64 architectures, NEON on ARM architectures). Use this if you are having compatibility issues with your compiler. + +#define DR_FLAC_NO_WCHAR + Disables all functions ending with `_w`. Use this if your compiler does not provide wchar.h. Not required if DR_FLAC_NO_STDIO is also defined. + + + +Notes +===== +- dr_flac does not support changing the sample rate nor channel count mid stream. +- dr_flac is not thread-safe, but its APIs can be called from any thread so long as you do your own synchronization. +- When using Ogg encapsulation, a corrupted metadata block will result in `drflac_open_with_metadata()` and `drflac_open()` returning inconsistent samples due + to differences in corrupted stream recorvery logic between the two APIs. +*/ + +#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 13 +#define DRFLAC_VERSION_REVISION 4 +#define DRFLAC_VERSION_STRING DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MAJOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_MINOR) "." DRFLAC_XSTRINGIFY(DRFLAC_VERSION_REVISION) + +#include /* For size_t. */ + +/* Sized Types */ +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 +/* End Sized Types */ + +/* Decorations */ +#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 +/* End Decorations */ + +#if defined(_MSC_VER) && _MSC_VER >= 1700 /* Visual Studio 2012 */ + #define DRFLAC_DEPRECATED __declspec(deprecated) +#elif (defined(__GNUC__) && __GNUC__ >= 4) /* GCC 4 */ + #define DRFLAC_DEPRECATED __attribute__((deprecated)) +#elif defined(__has_feature) /* Clang */ + #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); + +/* Allocation Callbacks */ +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; +/* End Allocation Callbacks */ + +/* +As data is read from the client it is placed into an internal buffer for fast access. This controls the size of that buffer. Larger values means more speed, +but also more memory. In my testing there is diminishing returns after about 4KB, but you can fiddle with this to suit your own needs. Must be a multiple of 8. +*/ +#ifndef DR_FLAC_BUFFER_SIZE +#define DR_FLAC_BUFFER_SIZE 4096 +#endif + + +/* Architecture Detection */ +#if defined(_WIN64) || defined(_LP64) || defined(__LP64__) +#define DRFLAC_64BIT +#endif + +#if defined(__x86_64__) || (defined(_M_X64) && !defined(_M_ARM64EC)) + #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) || defined(_M_ARM64EC) + #define DRFLAC_ARM +#endif +/* End Architecture Detection */ + + +#ifdef DRFLAC_64BIT +typedef drflac_uint64 drflac_cache_t; +#else +typedef drflac_uint32 drflac_cache_t; +#endif + +/* The various metadata block types. */ +#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 + +/* The various picture types specified in the PICTURE block. */ +#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_SET, + DRFLAC_SEEK_CUR, + DRFLAC_SEEK_END +} drflac_seek_origin; + +/* The order of members in this structure is important because we map this directly to the raw data within the SEEKTABLE metadata block. */ +typedef struct +{ + drflac_uint64 firstPCMFrame; + drflac_uint64 flacFrameOffset; /* The offset from the first byte of the header of the first frame. */ + drflac_uint16 pcmFrameCount; +} drflac_seekpoint; + +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 +{ + /* + The metadata type. Use this to know how to interpret the data below. Will be set to one of the + DRFLAC_METADATA_BLOCK_TYPE_* tokens. + */ + drflac_uint32 type; + + /* The size in bytes of the block and the buffer pointed to by pRawData if it's non-NULL. */ + drflac_uint32 rawDataSize; + + /* The offset in the stream of the raw data. */ + drflac_uint64 rawDataOffset; + + /* + A pointer to the raw data. This points to a temporary buffer so don't hold on to it. It's best to + not modify the contents of this buffer. Use the structures below for more meaningful and structured + information about the metadata. It's possible for this to be null. + */ + const void* pRawData; + + 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; + drflac_uint64 pictureDataOffset; /* Offset from the start of the stream. */ + const drflac_uint8* pPictureData; + } picture; + } data; +} drflac_metadata; + + +/* +Callback for when data needs to be read from the client. + + +Parameters +---------- +pUserData (in) + The user data that was passed to drflac_open() and family. + +pBufferOut (out) + The output buffer. + +bytesToRead (in) + The number of bytes to read. + + +Return Value +------------ +The number of bytes actually read. + + +Remarks +------- +A return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until either the entire bytesToRead is filled or +you have reached the end of the stream. +*/ +typedef size_t (* drflac_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); + +/* +Callback for when data needs to be seeked. + + +Parameters +---------- +pUserData (in) + The user data that was passed to drflac_open() and family. + +offset (in) + The number of bytes to move, relative to the origin. Will never be negative. + +origin (in) + The origin of the seek - the current position, the start of the stream, or the end of the stream. + + +Return Value +------------ +Whether or not the seek was successful. + + +Remarks +------- +Seeking relative to the start and the current position must always be supported. If seeking from the end of the stream is not supported, return DRFLAC_FALSE. + +When seeking to a PCM frame using drflac_seek_to_pcm_frame(), dr_flac may call this with an offset beyond the end of the FLAC stream. This needs to be detected +and handled by returning DRFLAC_FALSE. +*/ +typedef drflac_bool32 (* drflac_seek_proc)(void* pUserData, int offset, drflac_seek_origin origin); + +/* +Callback for when the current position in the stream needs to be retrieved. + + +Parameters +---------- +pUserData (in) + The user data that was passed to drflac_open() and family. + +pCursor (out) + A pointer to a variable to receive the current position in the stream. + + +Return Value +------------ +Whether or not the operation was successful. +*/ +typedef drflac_bool32 (* drflac_tell_proc)(void* pUserData, drflac_int64* pCursor); + +/* +Callback for when a metadata block is read. + + +Parameters +---------- +pUserData (in) + The user data that was passed to drflac_open() and family. + +pMetadata (in) + A pointer to a structure containing the data of the metadata block. + + +Remarks +------- +Use pMetadata->type to determine which metadata block is being handled and how to read the data. This +will be set to one of the DRFLAC_METADATA_BLOCK_TYPE_* tokens. +*/ +typedef void (* drflac_meta_proc)(void* pUserData, drflac_metadata* pMetadata); + + +/* Structure for internal use. Only used for decoders opened with drflac_open_memory. */ +typedef struct +{ + const drflac_uint8* data; + size_t dataSize; + size_t currentReadPos; +} drflac__memory_stream; + +/* Structure for internal use. Used for bit streaming. */ +typedef struct +{ + /* The function to call when more data needs to be read. */ + drflac_read_proc onRead; + + /* The function to call when the current read position needs to be moved. */ + drflac_seek_proc onSeek; + + /* The function to call when the current read position needs to be retrieved. */ + drflac_tell_proc onTell; + + /* The user data to pass around to onRead and onSeek. */ + void* pUserData; + + + /* + The number of unaligned bytes in the L2 cache. This will always be 0 until the end of the stream is hit. At the end of the + stream there will be a number of bytes that don't cleanly fit in an L1 cache line, so we use this variable to know whether + or not the bistreamer needs to run on a slower path to read those last bytes. This will never be more than sizeof(drflac_cache_t). + */ + size_t unalignedByteCount; + + /* The content of the unaligned bytes. */ + drflac_cache_t unalignedCache; + + /* The index of the next valid cache line in the "L2" cache. */ + drflac_uint32 nextL2Line; + + /* The number of bits that have been consumed by the cache. This is used to determine how many valid bits are remaining. */ + drflac_uint32 consumedBits; + + /* + The cached data which was most recently read from the client. There are two levels of cache. Data flows as such: + Client -> L2 -> L1. The L2 -> L1 movement is aligned and runs on a fast path in just a few instructions. + */ + drflac_cache_t cacheL2[DR_FLAC_BUFFER_SIZE/sizeof(drflac_cache_t)]; + drflac_cache_t cache; + + /* + CRC-16. This is updated whenever bits are read from the bit stream. Manually set this to 0 to reset the CRC. For FLAC, this + is reset to 0 at the beginning of each frame. + */ + drflac_uint16 crc16; + drflac_cache_t crc16Cache; /* A cache for optimizing CRC calculations. This is filled when when the L1 cache is reloaded. */ + drflac_uint32 crc16CacheIgnoredBytes; /* The number of bytes to ignore when updating the CRC-16 from the CRC-16 cache. */ +} drflac_bs; + +typedef struct +{ + /* The type of the subframe: SUBFRAME_CONSTANT, SUBFRAME_VERBATIM, SUBFRAME_FIXED or SUBFRAME_LPC. */ + drflac_uint8 subframeType; + + /* The number of wasted bits per sample as specified by the sub-frame header. */ + drflac_uint8 wastedBitsPerSample; + + /* The order to use for the prediction stage for SUBFRAME_FIXED and SUBFRAME_LPC. */ + drflac_uint8 lpcOrder; + + /* A pointer to the buffer containing the decoded samples in the subframe. This pointer is an offset from drflac::pExtraData. */ + drflac_int32* pSamplesS32; +} drflac_subframe; + +typedef struct +{ + /* + If the stream uses variable block sizes, this will be set to the index of the first PCM frame. If fixed block sizes are used, this will + always be set to 0. This is 64-bit because the decoded PCM frame number will be 36 bits. + */ + drflac_uint64 pcmFrameNumber; + + /* + If the stream uses fixed block sizes, this will be set to the frame number. If variable block sizes are used, this will always be 0. This + is 32-bit because in fixed block sizes, the maximum frame number will be 31 bits. + */ + drflac_uint32 flacFrameNumber; + + /* The sample rate of this frame. */ + drflac_uint32 sampleRate; + + /* The number of PCM frames in each sub-frame within this frame. */ + drflac_uint16 blockSizeInPCMFrames; + + /* + The channel assignment of this frame. This is not always set to the channel count. If interchannel decorrelation is being used this + will be set to DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE, DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE or DRFLAC_CHANNEL_ASSIGNMENT_MID_SIDE. + */ + drflac_uint8 channelAssignment; + + /* The number of bits per sample within this frame. */ + drflac_uint8 bitsPerSample; + + /* The frame's CRC. */ + drflac_uint8 crc8; +} drflac_frame_header; + +typedef struct +{ + /* The header. */ + drflac_frame_header header; + + /* + The number of PCM frames left to be read in this FLAC frame. This is initially set to the block size. As PCM frames are read, + this will be decremented. When it reaches 0, the decoder will see this frame as fully consumed and load the next frame. + */ + drflac_uint32 pcmFramesRemaining; + + /* The list of sub-frames within the frame. There is one sub-frame for each channel, and there's a maximum of 8 channels. */ + drflac_subframe subframes[8]; +} drflac_frame; + +typedef struct +{ + /* The function to call when a metadata block is read. */ + drflac_meta_proc onMeta; + + /* The user data posted to the metadata callback function. */ + void* pUserDataMD; + + /* Memory allocation callbacks. */ + drflac_allocation_callbacks allocationCallbacks; + + + /* The sample rate. Will be set to something like 44100. */ + drflac_uint32 sampleRate; + + /* + The number of channels. This will be set to 1 for monaural streams, 2 for stereo, etc. Maximum 8. This is set based on the + value specified in the STREAMINFO block. + */ + drflac_uint8 channels; + + /* The bits per sample. Will be set to something like 16, 24, etc. */ + drflac_uint8 bitsPerSample; + + /* The maximum block size, in samples. This number represents the number of samples in each channel (not combined). */ + drflac_uint16 maxBlockSizeInPCMFrames; + + /* + The total number of PCM Frames making up the stream. Can be 0 in which case it's still a valid stream, but just means + the total PCM frame count is unknown. Likely the case with streams like internet radio. + */ + drflac_uint64 totalPCMFrameCount; + + + /* The container type. This is set based on whether or not the decoder was opened from a native or Ogg stream. */ + drflac_container container; + + /* The number of seekpoints in the seektable. */ + drflac_uint32 seekpointCount; + + + /* Information about the frame the decoder is currently sitting on. */ + drflac_frame currentFLACFrame; + + + /* The index of the PCM frame the decoder is currently sitting on. This is only used for seeking. */ + drflac_uint64 currentPCMFrame; + + /* The position of the first FLAC frame in the stream. This is only ever used for seeking. */ + drflac_uint64 firstFLACFramePosInBytes; + + + /* A hack to avoid a malloc() when opening a decoder with drflac_open_memory(). */ + drflac__memory_stream memoryStream; + + + /* A pointer to the decoded sample data. This is an offset of pExtraData. */ + drflac_int32* pDecodedSamples; + + /* A pointer to the seek table. This is an offset of pExtraData, or NULL if there is no seek table. */ + drflac_seekpoint* pSeekpoints; + + /* Internal use only. Only used with Ogg containers. Points to a drflac_oggbs object. This is an offset of pExtraData. */ + void* _oggbs; + + /* Internal use only. Used for profiling and testing different seeking modes. */ + drflac_bool32 _noSeekTableSeek : 1; + drflac_bool32 _noBinarySearchSeek : 1; + drflac_bool32 _noBruteForceSeek : 1; + + /* The bit streamer. The raw FLAC data is fed through this object. */ + drflac_bs bs; + + /* Variable length extra data. We attach this to the end of the object so we can avoid unnecessary mallocs. */ + drflac_uint8 pExtraData[1]; +} drflac; + + +/* +Opens a FLAC decoder. + + +Parameters +---------- +onRead (in) + The function to call when data needs to be read from the client. + +onSeek (in) + The function to call when the read position of the client data needs to move. + +onTell (in) + The function to call when the read position of the client needs to be queried. + +pUserData (in, optional) + A pointer to application defined data that will be passed to onRead and onSeek. + +pAllocationCallbacks (in, optional) + A pointer to application defined callbacks for managing memory allocations. + + +Return Value +------------ +Returns a pointer to an object representing the decoder. + + +Remarks +------- +Close the decoder with `drflac_close()`. + +`pAllocationCallbacks` can be NULL in which case it will use `DRFLAC_MALLOC`, `DRFLAC_REALLOC` and `DRFLAC_FREE`. + +This function will automatically detect whether or not you are attempting to open a native or Ogg encapsulated FLAC, both of which should work seamlessly +without any manual intervention. Ogg encapsulation also works with multiplexed streams which basically means it can play FLAC encoded audio tracks in videos. + +This is the lowest level function for opening a FLAC stream. You can also use `drflac_open_file()` and `drflac_open_memory()` to open the stream from a file or +from a block of memory respectively. + +The STREAMINFO block must be present for this to succeed. Use `drflac_open_relaxed()` to open a FLAC stream where the header may not be present. + +Use `drflac_open_with_metadata()` if you need access to metadata. + + +Seek Also +--------- +drflac_open_file() +drflac_open_memory() +drflac_open_with_metadata() +drflac_close() +*/ +DRFLAC_API drflac* drflac_open(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); + +/* +Opens a FLAC stream with relaxed validation of the header block. + + +Parameters +---------- +onRead (in) + The function to call when data needs to be read from the client. + +onSeek (in) + The function to call when the read position of the client data needs to move. + +onTell (in) + The function to call when the read position of the client needs to be queried. + +container (in) + Whether or not the FLAC stream is encapsulated using standard FLAC encapsulation or Ogg encapsulation. + +pUserData (in, optional) + A pointer to application defined data that will be passed to onRead and onSeek. + +pAllocationCallbacks (in, optional) + A pointer to application defined callbacks for managing memory allocations. + + +Return Value +------------ +A pointer to an object representing the decoder. + + +Remarks +------- +The same as drflac_open(), except attempts to open the stream even when a header block is not present. + +Because the header is not necessarily available, the caller must explicitly define the container (Native or Ogg). Do not set this to `drflac_container_unknown` +as that is for internal use only. + +Opening in relaxed mode will continue reading data from onRead until it finds a valid frame. If a frame is never found it will continue forever. To abort, +force your `onRead` callback to return 0, which dr_flac will use as an indicator that the end of the stream was found. + +Use `drflac_open_with_metadata_relaxed()` if you need access to metadata. +*/ +DRFLAC_API drflac* drflac_open_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); + +/* +Opens a FLAC decoder and notifies the caller of the metadata chunks (album art, etc.). + + +Parameters +---------- +onRead (in) + The function to call when data needs to be read from the client. + +onSeek (in) + The function to call when the read position of the client data needs to move. + +onTell (in) + The function to call when the read position of the client needs to be queried. + +onMeta (in) + The function to call for every metadata block. + +pUserData (in, optional) + A pointer to application defined data that will be passed to onRead, onSeek and onMeta. + +pAllocationCallbacks (in, optional) + A pointer to application defined callbacks for managing memory allocations. + + +Return Value +------------ +A pointer to an object representing the decoder. + + +Remarks +------- +Close the decoder with `drflac_close()`. + +`pAllocationCallbacks` can be NULL in which case it will use `DRFLAC_MALLOC`, `DRFLAC_REALLOC` and `DRFLAC_FREE`. + +This is slower than `drflac_open()`, so avoid this one if you don't need metadata. Internally, this will allocate and free memory on the heap for every +metadata block except for STREAMINFO and PADDING blocks. + +The caller is notified of the metadata via the `onMeta` callback. All metadata blocks will be handled before the function returns. This callback takes a +pointer to a `drflac_metadata` object which is a union containing the data of all relevant metadata blocks. Use the `type` member to discriminate against +the different metadata types. + +The STREAMINFO block must be present for this to succeed. Use `drflac_open_with_metadata_relaxed()` to open a FLAC stream where the header may not be present. + +Note that this will behave inconsistently with `drflac_open()` if the stream is an Ogg encapsulated stream and a metadata block is corrupted. This is due to +the way the Ogg stream recovers from corrupted pages. When `drflac_open_with_metadata()` is being used, the open routine will try to read the contents of the +metadata block, whereas `drflac_open()` will simply seek past it (for the sake of efficiency). This inconsistency can result in different samples being +returned depending on whether or not the stream is being opened with metadata. + + +Seek Also +--------- +drflac_open_file_with_metadata() +drflac_open_memory_with_metadata() +drflac_open() +drflac_close() +*/ +DRFLAC_API drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); + +/* +The same as drflac_open_with_metadata(), except attempts to open the stream even when a header block is not present. + +See Also +-------- +drflac_open_with_metadata() +drflac_open_relaxed() +*/ +DRFLAC_API drflac* drflac_open_with_metadata_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, drflac_meta_proc onMeta, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks); + +/* +Closes the given FLAC decoder. + + +Parameters +---------- +pFlac (in) + The decoder to close. + + +Remarks +------- +This will destroy the decoder object. + + +See Also +-------- +drflac_open() +drflac_open_with_metadata() +drflac_open_file() +drflac_open_file_w() +drflac_open_file_with_metadata() +drflac_open_file_with_metadata_w() +drflac_open_memory() +drflac_open_memory_with_metadata() +*/ +DRFLAC_API void drflac_close(drflac* pFlac); + + +/* +Reads sample data from the given FLAC decoder, output as interleaved signed 32-bit PCM. + + +Parameters +---------- +pFlac (in) + The decoder. + +framesToRead (in) + The number of PCM frames to read. + +pBufferOut (out, optional) + A pointer to the buffer that will receive the decoded samples. + + +Return Value +------------ +Returns the number of PCM frames actually read. If the return value is less than `framesToRead` it has reached the end. + + +Remarks +------- +pBufferOut can be null, in which case the call will act as a seek, and the return value will be the number of frames seeked. +*/ +DRFLAC_API drflac_uint64 drflac_read_pcm_frames_s32(drflac* pFlac, drflac_uint64 framesToRead, drflac_int32* pBufferOut); + + +/* +Reads sample data from the given FLAC decoder, output as interleaved signed 16-bit PCM. + + +Parameters +---------- +pFlac (in) + The decoder. + +framesToRead (in) + The number of PCM frames to read. + +pBufferOut (out, optional) + A pointer to the buffer that will receive the decoded samples. + + +Return Value +------------ +Returns the number of PCM frames actually read. If the return value is less than `framesToRead` it has reached the end. + + +Remarks +------- +pBufferOut can be null, in which case the call will act as a seek, and the return value will be the number of frames seeked. + +Note that this is lossy for streams where the bits per sample is larger than 16. +*/ +DRFLAC_API drflac_uint64 drflac_read_pcm_frames_s16(drflac* pFlac, drflac_uint64 framesToRead, drflac_int16* pBufferOut); + +/* +Reads sample data from the given FLAC decoder, output as interleaved 32-bit floating point PCM. + + +Parameters +---------- +pFlac (in) + The decoder. + +framesToRead (in) + The number of PCM frames to read. + +pBufferOut (out, optional) + A pointer to the buffer that will receive the decoded samples. + + +Return Value +------------ +Returns the number of PCM frames actually read. If the return value is less than `framesToRead` it has reached the end. + + +Remarks +------- +pBufferOut can be null, in which case the call will act as a seek, and the return value will be the number of frames seeked. + +Note that this should be considered lossy due to the nature of floating point numbers not being able to exactly represent every possible number. +*/ +DRFLAC_API drflac_uint64 drflac_read_pcm_frames_f32(drflac* pFlac, drflac_uint64 framesToRead, float* pBufferOut); + +/* +Seeks to the PCM frame at the given index. + + +Parameters +---------- +pFlac (in) + The decoder. + +pcmFrameIndex (in) + The index of the PCM frame to seek to. See notes below. + + +Return Value +------------- +`DRFLAC_TRUE` if successful; `DRFLAC_FALSE` otherwise. +*/ +DRFLAC_API drflac_bool32 drflac_seek_to_pcm_frame(drflac* pFlac, drflac_uint64 pcmFrameIndex); + + + +#ifndef DR_FLAC_NO_STDIO +/* +Opens a FLAC decoder from the file at the given path. + + +Parameters +---------- +pFileName (in) + The path of the file to open, either absolute or relative to the current directory. + +pAllocationCallbacks (in, optional) + A pointer to application defined callbacks for managing memory allocations. + + +Return Value +------------ +A pointer to an object representing the decoder. + + +Remarks +------- +Close the decoder with drflac_close(). + + +Remarks +------- +This will hold a handle to the file until the decoder is closed with drflac_close(). Some platforms will restrict the number of files a process can have open +at any given time, so keep this mind if you have many decoders open at the same time. + + +See Also +-------- +drflac_open_file_with_metadata() +drflac_open() +drflac_close() +*/ +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); + +/* +Opens a FLAC decoder from the file at the given path and notifies the caller of the metadata chunks (album art, etc.) + + +Parameters +---------- +pFileName (in) + The path of the file to open, either absolute or relative to the current directory. + +pAllocationCallbacks (in, optional) + A pointer to application defined callbacks for managing memory allocations. + +onMeta (in) + The callback to fire for each metadata block. + +pUserData (in) + A pointer to the user data to pass to the metadata callback. + +pAllocationCallbacks (in) + A pointer to application defined callbacks for managing memory allocations. + + +Remarks +------- +Look at the documentation for drflac_open_with_metadata() for more information on how metadata is handled. + + +See Also +-------- +drflac_open_with_metadata() +drflac_open() +drflac_close() +*/ +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 + +/* +Opens a FLAC decoder from a pre-allocated block of memory + + +Parameters +---------- +pData (in) + A pointer to the raw encoded FLAC data. + +dataSize (in) + The size in bytes of `data`. + +pAllocationCallbacks (in) + A pointer to application defined callbacks for managing memory allocations. + + +Return Value +------------ +A pointer to an object representing the decoder. + + +Remarks +------- +This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for the lifetime of the decoder. + + +See Also +-------- +drflac_open() +drflac_close() +*/ +DRFLAC_API drflac* drflac_open_memory(const void* pData, size_t dataSize, const drflac_allocation_callbacks* pAllocationCallbacks); + +/* +Opens a FLAC decoder from a pre-allocated block of memory and notifies the caller of the metadata chunks (album art, etc.) + + +Parameters +---------- +pData (in) + A pointer to the raw encoded FLAC data. + +dataSize (in) + The size in bytes of `data`. + +onMeta (in) + The callback to fire for each metadata block. + +pUserData (in) + A pointer to the user data to pass to the metadata callback. + +pAllocationCallbacks (in) + A pointer to application defined callbacks for managing memory allocations. + + +Remarks +------- +Look at the documentation for drflac_open_with_metadata() for more information on how metadata is handled. + + +See Also +------- +drflac_open_with_metadata() +drflac_open() +drflac_close() +*/ +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); + + + +/* High Level APIs */ + +/* +Opens a FLAC stream from the given callbacks and fully decodes it in a single operation. The return value is a +pointer to the sample data as interleaved signed 32-bit PCM. The returned data must be freed with drflac_free(). + +You can pass in custom memory allocation callbacks via the pAllocationCallbacks parameter. This can be NULL in which +case it will use DRFLAC_MALLOC, DRFLAC_REALLOC and DRFLAC_FREE. + +Sometimes a FLAC file won't keep track of the total sample count. In this situation the function will continuously +read samples into a dynamically sized buffer on the heap until no samples are left. + +Do not call this function on a broadcast type of stream (like internet radio streams and whatnot). +*/ +DRFLAC_API drflac_int32* drflac_open_and_read_pcm_frames_s32(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); + +/* Same as drflac_open_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. */ +DRFLAC_API drflac_int16* drflac_open_and_read_pcm_frames_s16(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); + +/* Same as drflac_open_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. */ +DRFLAC_API float* drflac_open_and_read_pcm_frames_f32(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, void* pUserData, unsigned int* channels, unsigned int* sampleRate, drflac_uint64* totalPCMFrameCount, const drflac_allocation_callbacks* pAllocationCallbacks); + +#ifndef DR_FLAC_NO_STDIO +/* Same as drflac_open_and_read_pcm_frames_s32() except opens the decoder from a file. */ +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); + +/* Same as drflac_open_file_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. */ +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); + +/* Same as drflac_open_file_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. */ +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 + +/* Same as drflac_open_and_read_pcm_frames_s32() except opens the decoder from a block of memory. */ +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); + +/* Same as drflac_open_memory_and_read_pcm_frames_s32(), except returns signed 16-bit integer samples. */ +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); + +/* Same as drflac_open_memory_and_read_pcm_frames_s32(), except returns 32-bit floating-point samples. */ +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); + +/* +Frees memory that was allocated internally by dr_flac. + +Set pAllocationCallbacks to the same object that was passed to drflac_open_*_and_read_pcm_frames_*(). If you originally passed in NULL, pass in NULL for this. +*/ +DRFLAC_API void drflac_free(void* p, const drflac_allocation_callbacks* pAllocationCallbacks); + + +/* Structure representing an iterator for vorbis comments in a VORBIS_COMMENT metadata block. */ +typedef struct +{ + drflac_uint32 countRemaining; + const char* pRunningData; +} drflac_vorbis_comment_iterator; + +/* +Initializes a vorbis comment iterator. This can be used for iterating over the vorbis comments in a VORBIS_COMMENT +metadata block. +*/ +DRFLAC_API void drflac_init_vorbis_comment_iterator(drflac_vorbis_comment_iterator* pIter, drflac_uint32 commentCount, const void* pComments); + +/* +Goes to the next vorbis comment in the given iterator. If null is returned it means there are no more comments. The +returned string is NOT null terminated. +*/ +DRFLAC_API const char* drflac_next_vorbis_comment(drflac_vorbis_comment_iterator* pIter, drflac_uint32* pCommentLengthOut); + + +/* Structure representing an iterator for cuesheet tracks in a CUESHEET metadata block. */ +typedef struct +{ + drflac_uint32 countRemaining; + const char* pRunningData; +} drflac_cuesheet_track_iterator; + +/* The order of members here is important because we map this directly to the raw data within the CUESHEET metadata block. */ +typedef struct +{ + drflac_uint64 offset; + drflac_uint8 index; + drflac_uint8 reserved[3]; +} drflac_cuesheet_track_index; + +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; + +/* +Initializes a cuesheet track iterator. This can be used for iterating over the cuesheet tracks in a CUESHEET metadata +block. +*/ +DRFLAC_API void drflac_init_cuesheet_track_iterator(drflac_cuesheet_track_iterator* pIter, drflac_uint32 trackCount, const void* pTrackData); + +/* Goes to the next cuesheet track in the given iterator. If DRFLAC_FALSE is returned it means there are no more comments. */ +DRFLAC_API drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter, drflac_cuesheet_track* pCuesheetTrack); + + +#ifdef __cplusplus +} +#endif +#endif /* dr_flac_h */ + + +/************************************************************************************************************************************************************ + ************************************************************************************************************************************************************ + + IMPLEMENTATION + + ************************************************************************************************************************************************************ + ************************************************************************************************************************************************************/ +#if defined(DR_FLAC_IMPLEMENTATION) || defined(DRFLAC_IMPLEMENTATION) +#ifndef dr_flac_c +#define dr_flac_c + +/* Disable some annoying warnings. */ +#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 + +/* Inline */ +#ifdef _MSC_VER + #define DRFLAC_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 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 +/* End Inline */ + +/* +Intrinsics Support + +There's a bug in GCC 4.2.x which results in an incorrect compilation error when using _mm_slli_epi32() where it complains with + + "error: shift must be an immediate" + +Unfortuantely dr_flac depends on this for a few things so we're just going to disable SSE on GCC 4.2 and below. +*/ +#if !defined(DR_FLAC_NO_SIMD) + #if defined(DRFLAC_X64) || defined(DRFLAC_X86) + #if defined(_MSC_VER) && !defined(__clang__) + /* MSVC. */ + #if _MSC_VER >= 1400 && !defined(DRFLAC_NO_SSE2) /* 2005 */ + #define DRFLAC_SUPPORT_SSE2 + #endif + #if _MSC_VER >= 1600 && !defined(DRFLAC_NO_SSE41) /* 2010 */ + #define DRFLAC_SUPPORT_SSE41 + #endif + #elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) + /* Assume GNUC-style. */ + #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 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(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 + +/* Compile-time CPU feature support. */ +#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) + { + /* + 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 + } + #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; /* 64-bit targets always support SSE2. */ + #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__) + return DRFLAC_TRUE; /* If the compiler is allowed to freely generate SSE2 code we can assume support. */ + #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; /* SSE2 is only supported on x86 and x64 architectures. */ + #endif +#else + return DRFLAC_FALSE; /* No compiler support. */ +#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(__SSE4_1__) || defined(__AVX__) + return DRFLAC_TRUE; /* If the compiler is allowed to freely generate SSE41 code we can assume support. */ + #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; /* SSE41 is only supported on x86 and x64 architectures. */ + #endif +#else + return DRFLAC_FALSE; /* No compiler support. */ +#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] \ + value [ax] \ + modify nomemory; +#pragma aux _watcom_bswap32 = \ + "bswap eax" \ + parm [eax] \ + value [eax] \ + modify nomemory; +#pragma aux _watcom_bswap64 = \ + "bswap eax" \ + "bswap edx" \ + "xchg eax,edx" \ + parm [eax edx] \ + value [eax edx] \ + modify nomemory; +#endif + + +/* Standard library stuff. */ +#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_MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#define DRFLAC_MAX_SIMD_VECTOR_SIZE 64 /* 64 for AVX-512 in the future. */ + +/* Result Codes */ +typedef drflac_int32 drflac_result; +#define DRFLAC_SUCCESS 0 +#define DRFLAC_ERROR -1 /* A generic error. */ +#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 -100 +/* End Result Codes */ + + +#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_SEEKPOINT_SIZE_IN_BYTES 18 +#define DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES 36 +#define DRFLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES 12 + +#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; +} + + +/* CPU caps. */ +#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; + +/* +I've had a bug report that Clang's ThreadSanitizer presents a warning in this function. Having reviewed this, this does +actually make sense. However, since CPU caps should never differ for a running process, I don't think the trade off of +complicating internal API's by passing around CPU caps versus just disabling the warnings is worthwhile. I'm therefore +just going to disable these warnings. This is disabled via the DRFLAC_NO_THREAD_SANITIZE attribute. +*/ +DRFLAC_NO_THREAD_SANITIZE static void drflac__init_cpu_caps(void) +{ + static drflac_bool32 isCPUCapsInitialized = DRFLAC_FALSE; + + if (!isCPUCapsInitialized) { + /* LZCNT */ +#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) + int info[4] = {0}; + drflac__cpuid(info, 0x80000001); + drflac__gIsLZCNTSupported = (info[2] & (1 << 5)) != 0; +#endif + + /* SSE2 */ + drflac__gIsSSE2Supported = drflac_has_sse2(); + + /* SSE4.1 */ + drflac__gIsSSE41Supported = drflac_has_sse41(); + + /* Initialized. */ + 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; /* If the compiler is allowed to freely generate NEON code we can assume support. */ + #else + /* TODO: Runtime check. */ + return DRFLAC_FALSE; + #endif + #else + return DRFLAC_FALSE; /* NEON is only supported on ARM architectures. */ + #endif +#else + return DRFLAC_FALSE; /* No compiler support. */ +#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 + + +/* Endian Management */ +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(__ARM_ARCH_6M__) && !defined(DRFLAC_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(). */ + drflac_uint32 r; + __asm__ __volatile__ ( + #if defined(DRFLAC_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 + #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 + /* Weird "<< 32" bitshift is required for C89 because it doesn't support 64-bit constants. Should be optimized out by a good compiler. */ + 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; +} + + + +/* The CRC code below is based on this document: http://zlib.net/crc_v3.txt */ +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 + /* REFERENCE (use of this implementation requires an explicit flush by doing "drflac_crc8(crc, 0, 8);") */ + 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 + /* REFERENCE (use of this implementation requires an explicit flush by doing "drflac_crc16(crc, 0, 16);") */ + 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))); /* Weird "<< 32" bitshift is required for C89 because it doesn't support 64-bit constants. Should be optimized out by a good compiler. */ + 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 + +/* +BIT READING ATTEMPT #2 + +This uses a 32- or 64-bit bit-shifted cache - as bits are read, the cache is shifted such that the first valid bit is sitting +on the most significant bit. It uses the notion of an L1 and L2 cache (borrowed from CPU architecture), where the L1 cache +is a 32- or 64-bit unsigned integer (depending on whether or not a 32- or 64-bit build is being compiled) and the L2 is an +array of "cache lines", with each cache line being the same size as the L1. The L2 is a buffer of about 4KB and is where data +from onRead() is read into. +*/ +#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) +{ + /* We should never be flushing in a situation where we are not aligned on a byte boundary. */ + DRFLAC_ASSERT((DRFLAC_CACHE_L1_BITS_REMAINING(bs) & 7) == 0); + + /* + The bits that were read from the L1 cache need to be accumulated. The number of bytes needing to be accumulated is determined + by the number of bits that have been consumed. + */ + if (DRFLAC_CACHE_L1_BITS_REMAINING(bs) == 0) { + drflac__update_crc16(bs); + } else { + /* We only accumulate the consumed bits. */ + bs->crc16 = drflac_crc16_bytes(bs->crc16, bs->crc16Cache >> DRFLAC_CACHE_L1_BITS_REMAINING(bs), (bs->consumedBits >> 3) - bs->crc16CacheIgnoredBytes); + + /* + The bits that we just accumulated should never be accumulated again. We need to keep track of how many bytes were accumulated + so we can handle that later. + */ + 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; + + /* Fast path. Try loading straight from L2. */ + if (bs->nextL2Line < DRFLAC_CACHE_L2_LINE_COUNT(bs)) { + bs->cache = bs->cacheL2[bs->nextL2Line++]; + return DRFLAC_TRUE; + } + + /* + If we get here it means we've run out of data in the L2 cache. We'll need to fetch more from the client, if there's + any left. + */ + if (bs->unalignedByteCount > 0) { + return DRFLAC_FALSE; /* If we have any unaligned bytes it means there's no more aligned bytes left in the client. */ + } + + 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; + } + + + /* + If we get here it means we were unable to retrieve enough data to fill the entire L2 cache. It probably + means we've just reached the end of the file. We need to move the valid data down to the end of the buffer + and adjust the index of the next line accordingly. Also keep in mind that the L2 cache must be aligned to + the size of the L1 so we'll need to seek backwards by any misaligned bytes. + */ + alignedL1LineCount = bytesRead / DRFLAC_CACHE_L1_SIZE_BYTES(bs); + + /* We need to keep track of any unaligned bytes for later use. */ + 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 { + /* If we get into this branch it means we weren't able to load any L1-aligned data. */ + 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 + + /* Fast path. Try just moving the next value in the L2 cache to the L1 cache. */ + 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; + } + + /* Slow path. */ + + /* + If we get here it means we have failed to load the L1 cache from the L2. Likely we've just reached the end of the stream and the last + few bytes did not meet the alignment requirements for the L2 cache. In this case we need to fall back to a slower path and read the + data from the unaligned cache. + */ + bytesRead = bs->unalignedByteCount; + if (bytesRead == 0) { + bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); /* <-- The stream has been exhausted, so marked the bits as consumed. */ + 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)); /* <-- Make sure the consumed bits are always set to zero. Other parts of the library depend on this property. */ + bs->unalignedByteCount = 0; /* <-- At this point the unaligned bytes have been moved into the cache and we thus have no more unaligned bytes. */ + +#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); /* <-- This clears the L2 cache. */ + bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); /* <-- This clears the L1 cache. */ + bs->cache = 0; + bs->unalignedByteCount = 0; /* <-- This clears the trailing unaligned bytes. */ + 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)) { + /* + If we want to load all 32-bits from a 32-bit cache we need to do it slightly differently because we can't do + a 32-bit shift on a 32-bit integer. This will never be the case on 64-bit caches, so we can have a slightly + more optimal solution for this. + */ +#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 { + /* Cannot shift by 32-bits, so need to do it differently. */ + *pResultOut = (drflac_uint32)bs->cache; + bs->consumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs); + bs->cache = 0; + } +#endif + + return DRFLAC_TRUE; + } else { + /* It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them. */ + 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)) { + /* This happens when we get to end of stream */ + 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; + } + + /* Do not attempt to shift by 32 as it's undefined. */ + 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 + +/* Function below is unused, but leaving it here in case I need to quickly add it again. */ +#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 { + /* It straddles the cached data. This function isn't called too frequently so I'm favouring simplicity here. */ + bitsToSeek -= DRFLAC_CACHE_L1_BITS_REMAINING(bs); + bs->consumedBits += DRFLAC_CACHE_L1_BITS_REMAINING(bs); + bs->cache = 0; + + /* Simple case. Seek in groups of the same number as bits that fit within a cache line. */ +#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 + + /* Whole leftover bytes. */ + while (bitsToSeek >= 8) { + drflac_uint8 bin; + if (!drflac__read_uint8(bs, 8, &bin)) { + return DRFLAC_FALSE; + } + bitsToSeek -= 8; + } + + /* Leftover bits. */ + if (bitsToSeek > 0) { + drflac_uint8 bin; + if (!drflac__read_uint8(bs, (drflac_uint32)bitsToSeek, &bin)) { + return DRFLAC_FALSE; + } + bitsToSeek = 0; /* <-- Necessary for the assert below. */ + } + + DRFLAC_ASSERT(bitsToSeek == 0); + return DRFLAC_TRUE; + } +} + + +/* This function moves the bit streamer to the first bit after the sync code (bit 15 of the of the frame header). It will also update the CRC-16. */ +static drflac_bool32 drflac__find_and_seek_to_next_sync_code(drflac_bs* bs) +{ + DRFLAC_ASSERT(bs != NULL); + + /* + The sync code is always aligned to 8 bits. This is convenient for us because it means we can do byte-aligned movements. The first + thing to do is align to the next byte. + */ + 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; + } + } + } + } + + /* Should never get here. */ + /*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 +#ifdef __MRC__ +#include +#define DRFLAC_IMPLEMENT_CLZ_MRC +#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) +{ + /* Fast compile time check for ARM. */ +#if defined(DRFLAC_HAS_LZCNT_INTRINSIC) && defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) + return DRFLAC_TRUE; +#elif defined(__MRC__) + return DRFLAC_TRUE; +#else + /* If the compiler itself does not support the intrinsic then we'll need to return false. */ + #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) +{ + /* + It's critical for competitive decoding performance that this function be highly optimal. With MSVC we can use the __lzcnt64() and __lzcnt() intrinsics + to achieve good performance, however on GCC and Clang it's a little bit more annoying. The __builtin_clzl() and __builtin_clzll() intrinsics leave + it undefined as to the return value when `x` is 0. We need this to be well defined as returning 32 or 64, depending on whether or not it's a 32- or + 64-bit build. To work around this we would need to add a conditional to check for the x = 0 case, but this creates unnecessary inefficiency. To work + around this problem I have written some inline assembly to emit the LZCNT (x86) or CLZ (ARM) instruction directly which removes the need to include + the conditional. This has worked well in the past, but for some reason Clang's MSVC compatible driver, clang-cl, does not seem to be handling this + in the same way as the normal Clang driver. It seems that `clang-cl` is just outputting the wrong results sometimes, maybe due to some register + getting clobbered? + + I'm not sure if this is a bug with dr_flac's inlined assembly (most likely), a bug in `clang-cl` or just a misunderstanding on my part with inline + assembly rules for `clang-cl`. If somebody can identify an error in dr_flac's inlined assembly I'm happy to get that fixed. + + Fortunately there is an easy workaround for this. Clang implements MSVC-specific intrinsics for compatibility. It also defines _MSC_VER for extra + compatibility. We can therefore just check for _MSC_VER and use the MSVC intrinsic which, fortunately for us, Clang supports. It would still be nice + to know how to fix the inlined assembly for correctness sake, however. + */ + +#if defined(_MSC_VER) /*&& !defined(__clang__)*/ /* <-- Intentionally wanting Clang to use the MSVC __lzcnt64/__lzcnt intrinsics due to above ^. */ + #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) + { + /* + A note on lzcnt. + + We check for the presence of the lzcnt instruction at runtime before calling this function, but we still generate this code. I have had + a report where the assembler does not recognize the lzcnt instruction. To work around this we are going to use `rep; bsr` instead which + has an identical byte encoding as lzcnt, and should hopefully improve compatibility with older assemblers. + */ + drflac_uint64 r; + __asm__ __volatile__ ( + "rep; bsr{q %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc" + /*"lzcnt{ %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc"*/ + ); + + return (drflac_uint32)r; + } + #elif defined(DRFLAC_X86) + { + drflac_uint32 r; + __asm__ __volatile__ ( + "rep; bsr{l %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc" + /*"lzcnt{l %1, %0| %0, %1}" : "=r"(r) : "r"(x) : "cc"*/ + ); + + return r; + } + #elif defined(DRFLAC_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) && !defined(__ARM_ARCH_6M__) && !(defined(__thumb__) && !defined(__thumb2__)) && !defined(DRFLAC_64BIT) /* <-- I haven't tested 64-bit inline assembly, so only enabling this for the 32-bit build for now. */ + { + unsigned int r; + __asm__ __volatile__ ( + #if defined(DRFLAC_64BIT) + "clz %w[out], %w[in]" : [out]"=r"(r) : [in]"r"(x) /* <-- This is untested. If someone in the community could test this, that would be appreciated! */ + #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 + /* Unsupported compiler. */ + #error "This compiler does not support the lzcnt intrinsic." + #endif +#endif +} +#endif + +#ifdef DRFLAC_IMPLEMENT_CLZ_MSVC +#include /* For BitScanReverse(). */ + +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); +#ifdef DRFLAC_IMPLEMENT_CLZ_WATCOM_LZCNT +/* Use the LZCNT instruction (only available on some processors since the 2010s). */ +#pragma aux drflac__clz_watcom_lzcnt = \ + "db 0F3h, 0Fh, 0BDh, 0C0h" /* lzcnt eax, eax */ \ + parm [eax] \ + value [eax] \ + modify nomemory; +#else +/* Use the 386+-compatible implementation. */ +#pragma aux drflac__clz_watcom = \ + "bsr eax, eax" \ + "xor eax, 31" \ + parm [eax] nomemory \ + value [eax] \ + modify exact [eax] nomemory; +#endif +#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_LZCNT) + return drflac__clz_watcom_lzcnt(x); +#elif defined(DRFLAC_IMPLEMENT_CLZ_WATCOM) + return (x == 0) ? sizeof(x)*8 : drflac__clz_watcom(x); +#elif defined(__MRC__) + return __cntlzw(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) { + /* Not catching this would lead to undefined behaviour: a shift of a 32-bit number by 32 or more is undefined */ + *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)) { + /* This happens when we get to end of stream */ + 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); + + /* + Seeking from the start is not quite as trivial as it sounds because the onSeek callback takes a signed 32-bit integer (which + is intentional because it simplifies the implementation of the onSeek callbacks), however offsetFromStart is unsigned 64-bit. + To resolve we just need to do an initial seek from the start, and then a series of offset seeks to make up the remainder. + */ + if (offsetFromStart > 0x7FFFFFFF) { + drflac_uint64 bytesRemaining = offsetFromStart; + if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, DRFLAC_SEEK_SET)) { + return DRFLAC_FALSE; + } + bytesRemaining -= 0x7FFFFFFF; + + while (bytesRemaining > 0x7FFFFFFF) { + if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + bytesRemaining -= 0x7FFFFFFF; + } + + if (bytesRemaining > 0) { + if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + } + } else { + if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, DRFLAC_SEEK_SET)) { + return DRFLAC_FALSE; + } + } + + /* The cache should be reset to force a reload of fresh data from the client. */ + 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; + } + + /*byteCount = 1;*/ + 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; /* Bad UTF-8 encoding. */ + } + + /* Read extra bytes. */ + 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 /* Needs optimizing. */ + 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) +{ + /* https://web.archive.org/web/20220205005724/https://github.com/ietf-wg-cellar/flac-specification/blob/37a49aa48ba4ba12e8757badfc59c0df35435fec/rfc_backmatter.md */ + return bitsPerSample + precision + drflac__ilog2_u32(order) > 32; +} + + +/* +The next two functions are responsible for calculating the prediction. + +When the bits per sample is >16 we need to use 64-bit integer arithmetic because otherwise we'll run out of precision. It's +safe to assume this will be slower on 32-bit platforms so we use a more optimal solution when the bits per sample is <=16. +*/ +#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); + + /* 32-bit version. */ + + /* VC++ optimizes this to a single jmp. I've not yet verified this for other compilers. */ + 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); + + /* 64-bit version. */ + + /* This method is faster on the 32-bit build when compiling with VC++. See note below. */ +#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 + + /* + VC++ optimizes this to a single jmp instruction, but only the 64-bit build. The 32-bit build generates less efficient code for some + reason. The ugly version above is faster so we'll just switch between the two depending on the target platform. + */ +#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 +/* +Reference implementation for reading and decoding samples with residual. This is intentionally left unoptimized for the +sake of readability and should only be used as a reference. +*/ +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); /* <-- riceParam should never be 0. drflac__read_rice_parts__param_equals_zero() should be used instead for this case. */ + + 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); /* <-- Equivalent to "if (setBitOffsetPlus1 < DRFLAC_CACHE_L1_SIZE_BITS(bs)) { bs->cache <<= setBitOffsetPlus1; }" */ + + /* It straddles the cached data. It will never cover more than the next chunk. We just read the number in two parts and combine them. */ + bitCountLo = bs->consumedBits - DRFLAC_CACHE_L1_SIZE_BITS(bs); + resultHi = DRFLAC_CACHE_L1_SELECT_AND_SHIFT(bs, riceParam); /* <-- Use DRFLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE() if ever this function allows riceParam=0. */ + + 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 { + /* Slow path. We need to fetch more data from the client. */ + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + if (bitCountLo > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { + /* This happens when we get to end of stream */ + 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_cache_t riceParamPlus1Mask = DRFLAC_CACHE_L1_SELECTION_MASK(riceParamPlus1);*/ + drflac_uint32 riceParamPlus1Shift = DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPlus1); + drflac_uint32 riceParamPlus1MaxConsumedBits = DRFLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1; + + /* + The idea here is to use local variables for the cache in an attempt to encourage the compiler to store them in registers. I have + no idea how this will work in practice... + */ + drflac_cache_t bs_cache = bs->cache; + drflac_uint32 bs_consumedBits = bs->consumedBits; + + /* The first thing to do is find the first unset bit. Most likely a bit will be set in the current cache line. */ + drflac_uint32 lzcount = drflac__clz(bs_cache); + if (lzcount < sizeof(bs_cache)*8) { + pZeroCounterOut[0] = lzcount; + + /* + It is most likely that the riceParam part (which comes after the zero counter) is also on this cache line. When extracting + this, we include the set bit from the unary coded part because it simplifies cache management. This bit will be handled + outside of this function at a higher level. + */ + extract_rice_param_part: + bs_cache <<= lzcount; + bs_consumedBits += lzcount; + + if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) { + /* Getting here means the rice parameter part is wholly contained within the current cache line. */ + pRiceParamPartOut[0] = (drflac_uint32)(bs_cache >> riceParamPlus1Shift); + bs_cache <<= riceParamPlus1; + bs_consumedBits += riceParamPlus1; + } else { + drflac_uint32 riceParamPartHi; + drflac_uint32 riceParamPartLo; + drflac_uint32 riceParamPartLoBitCount; + + /* + Getting here means the rice parameter part straddles the cache line. We need to read from the tail of the current cache + line, reload the cache, and then combine it with the head of the next cache line. + */ + + /* Grab the high part of the rice parameter part. */ + riceParamPartHi = (drflac_uint32)(bs_cache >> riceParamPlus1Shift); + + /* Before reloading the cache we need to grab the size in bits of the low part. */ + riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits; + DRFLAC_ASSERT(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32); + + /* Now reload the cache. */ + 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 { + /* Slow path. We need to fetch more data from the client. */ + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + if (riceParamPartLoBitCount > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { + /* This happens when we get to end of stream */ + return DRFLAC_FALSE; + } + + bs_cache = bs->cache; + bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; + } + + /* We should now have enough information to construct the rice parameter part. */ + riceParamPartLo = (drflac_uint32)(bs_cache >> (DRFLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPartLoBitCount))); + pRiceParamPartOut[0] = riceParamPartHi | riceParamPartLo; + + bs_cache <<= riceParamPartLoBitCount; + } + } else { + /* + Getting here means there are no bits set on the cache line. This is a less optimal case because we just wasted a call + to drflac__clz() and we need to reload the cache. + */ + 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 { + /* Slow path. We need to fetch more data from the client. */ + 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; + } + + /* Make sure the cache is restored at the end of it all. */ + 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; + + /* + The idea here is to use local variables for the cache in an attempt to encourage the compiler to store them in registers. I have + no idea how this will work in practice... + */ + drflac_cache_t bs_cache = bs->cache; + drflac_uint32 bs_consumedBits = bs->consumedBits; + + /* The first thing to do is find the first unset bit. Most likely a bit will be set in the current cache line. */ + drflac_uint32 lzcount = drflac__clz(bs_cache); + if (lzcount < sizeof(bs_cache)*8) { + /* + It is most likely that the riceParam part (which comes after the zero counter) is also on this cache line. When extracting + this, we include the set bit from the unary coded part because it simplifies cache management. This bit will be handled + outside of this function at a higher level. + */ + extract_rice_param_part: + bs_cache <<= lzcount; + bs_consumedBits += lzcount; + + if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) { + /* Getting here means the rice parameter part is wholly contained within the current cache line. */ + bs_cache <<= riceParamPlus1; + bs_consumedBits += riceParamPlus1; + } else { + /* + Getting here means the rice parameter part straddles the cache line. We need to read from the tail of the current cache + line, reload the cache, and then combine it with the head of the next cache line. + */ + + /* Before reloading the cache we need to grab the size in bits of the low part. */ + drflac_uint32 riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits; + DRFLAC_ASSERT(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32); + + /* Now reload the cache. */ + 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 { + /* Slow path. We need to fetch more data from the client. */ + if (!drflac__reload_cache(bs)) { + return DRFLAC_FALSE; + } + + if (riceParamPartLoBitCount > DRFLAC_CACHE_L1_BITS_REMAINING(bs)) { + /* This happens when we get to end of stream */ + return DRFLAC_FALSE; + } + + bs_cache = bs->cache; + bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount; + } + + bs_cache <<= riceParamPartLoBitCount; + } + } else { + /* + Getting here means there are no bits set on the cache line. This is a less optimal case because we just wasted a call + to drflac__clz() and we need to reload the cache. + */ + 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 { + /* Slow path. We need to fetch more data from the client. */ + 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; + } + + /* Make sure the cache is restored at the end of it all. */ + 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) { + /* Rice extraction. */ + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) { + return DRFLAC_FALSE; + } + + /* Rice reconstruction. */ + 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) { + /* + Rice extraction. It's faster to do this one at a time against local variables than it is to use the x4 version + against an array. Not sure why, but perhaps it's making more efficient use of registers? + */ + 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) { + /* Rice extraction. */ + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) { + return DRFLAC_FALSE; + } + + /* Rice reconstruction. */ + riceParamPart0 &= riceParamMask; + riceParamPart0 |= (zeroCountPart0 << riceParam); + riceParamPart0 = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01]; + /*riceParamPart0 = (riceParamPart0 >> 1) ^ (~(riceParamPart0 & 0x01) + 1);*/ + + /* Sample reconstruction. */ + 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; + + /* Pack. */ + r = _mm_packs_epi32(a, b); + + /* a3a2 a1a0 b3b2 b1b0 -> a3a2 b3b2 a1a0 b1b0 */ + r = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 1, 2, 0)); + + /* a3a2 b3b2 a1a0 b1b0 -> a3b3 a2b2 a1b1 a0b0 */ + 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) +{ + /* + To simplify this we are assuming count < 32. This restriction allows us to work on a low side and a high side. The low side + is shifted with zero bits, whereas the right side is shifted with sign bits. + */ + __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)); /* The high part needs to have the low part cleared. */ + + 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); + + /* Pre-load. */ + 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(); + + /* + Pre-loading the coefficients and prior samples is annoying because we need to ensure we don't try reading more than + what's available in the input buffers. It would be convenient to use a fall-through switch to do this, but this results + in strict aliasing warnings with GCC. To work around this I'm just doing something hacky. This feels a bit convoluted + so I think there's opportunity for this to be simplified. + */ +#if 1 + { + int runningOrder = order; + + /* 0 - 3. */ + 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; + } + + /* 4 - 7 */ + 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; + } + + /* 8 - 11 */ + 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; + } + + /* Coefficients need to be shuffled for our streaming algorithm below to work. Samples are already in the correct order from the loading routine above. */ + 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 + /* This causes strict-aliasing warnings with GCC. */ + 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 + + /* For this version we are doing one sample at a time. */ + 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))); /* <-- SSE2 compatible */ + /*riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_mullo_epi32(_mm_and_si128(riceParamPart128, _mm_set1_epi32(0x01)), _mm_set1_epi32(0xFFFFFFFF)));*/ /* <-- Only supported from SSE4.1 and is slower in my testing... */ + + if (order <= 4) { + for (i = 0; i < 4; i += 1) { + prediction128 = _mm_mullo_epi32(coefficients128_0, samples128_0); + + /* Horizontal add and shift. */ + 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)); + + /* Horizontal add and shift. */ + 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)); + + /* Horizontal add and shift. */ + 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); + } + } + + /* We store samples in groups of 4. */ + _mm_storeu_si128((__m128i*)pDecodedSamples, samples128_0); + pDecodedSamples += 4; + } + + /* Make sure we process the last few samples. */ + i = (count & ~3); + while (i < (int)count) { + /* Rice extraction. */ + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) { + return DRFLAC_FALSE; + } + + /* Rice reconstruction. */ + riceParamParts0 &= riceParamMask; + riceParamParts0 |= (zeroCountParts0 << riceParam); + riceParamParts0 = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01]; + + /* Sample reconstruction. */ + 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(); + + /* Pre-load. */ + 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; + + /* 0 - 3. */ + 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; + } + + /* 4 - 7 */ + 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; + } + + /* 8 - 11 */ + 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; + } + + /* Coefficients need to be shuffled for our streaming algorithm below to work. Samples are already in the correct order from the loading routine above. */ + 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 + + /* For this version we are doing one sample at a time. */ + 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); /* Reset to 0. */ + + 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)))); + } + + /* Horizontal add and shift. */ + prediction128 = drflac__mm_hadd_epi64(prediction128); + prediction128 = drflac__mm_srai_epi64(prediction128, shift); + prediction128 = _mm_add_epi32(riceParamPart128, prediction128); + + /* Our value should be sitting in prediction128[0]. We need to combine this with our SSE samples. */ + 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); + + /* Slide our rice parameter down so that the value in position 0 contains the next one to process. */ + riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4); + } + + /* We store samples in groups of 4. */ + _mm_storeu_si128((__m128i*)pDecodedSamples, samples128_0); + pDecodedSamples += 4; + } + + /* Make sure we process the last few samples. */ + i = (count & ~3); + while (i < (int)count) { + /* Rice extraction. */ + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) { + return DRFLAC_FALSE; + } + + /* Rice reconstruction. */ + riceParamParts0 &= riceParamMask; + riceParamParts0 |= (zeroCountParts0 << riceParam); + riceParamParts0 = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01]; + + /* Sample reconstruction. */ + 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); + + /* In my testing the order is rarely > 12, so in this case I'm going to simplify the SSE implementation by only handling order <= 12. */ + 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) +{ + /* Equivalent to SSE's _mm_alignr_epi8(a, b, 4) */ + + /* Reference */ + /*return drflac__vdupq_n_s32x4( + vgetq_lane_s32(a, 0), + vgetq_lane_s32(b, 3), + vgetq_lane_s32(b, 2), + vgetq_lane_s32(b, 1) + );*/ + + return vextq_s32(b, a, 1); +} + +static DRFLAC_INLINE uint32x4_t drflac__valignrq_u32_1(uint32x4_t a, uint32x4_t b) +{ + /* Equivalent to SSE's _mm_alignr_epi8(a, b, 4) */ + + /* Reference */ + /*return drflac__vdupq_n_s32x4( + vgetq_lane_s32(a, 0), + vgetq_lane_s32(b, 3), + vgetq_lane_s32(b, 2), + vgetq_lane_s32(b, 1) + );*/ + + return vextq_u32(b, a, 1); +} + +static DRFLAC_INLINE int32x2_t drflac__vhaddq_s32(int32x4_t x) +{ + /* The sum must end up in position 0. */ + + /* Reference */ + /*return vdupq_n_s32( + vgetq_lane_s32(x, 3) + + vgetq_lane_s32(x, 2) + + vgetq_lane_s32(x, 1) + + vgetq_lane_s32(x, 0) + );*/ + + 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) +{ + /* Reference */ + /*return drflac__vdupq_n_s32x4( + vgetq_lane_s32(x, 0), + vgetq_lane_s32(x, 1), + vgetq_lane_s32(x, 2), + vgetq_lane_s32(x, 3) + );*/ + + 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 = (drflac_uint32)~((~0UL) << riceParam); + riceParamMask128 = vdupq_n_u32(riceParamMask); + + riceParam128 = vdupq_n_s32(riceParam); + shift64 = vdup_n_s32(-shift); /* Negate the shift because we'll be doing a variable shift using vshlq_s32(). */ + one128 = vdupq_n_u32(1); + + /* + Pre-loading the coefficients and prior samples is annoying because we need to ensure we don't try reading more than + what's available in the input buffers. It would be conenient to use a fall-through switch to do this, but this results + in strict aliasing warnings with GCC. To work around this I'm just doing something hacky. This feels a bit convoluted + so I think there's opportunity for this to be simplified. + */ + { + int runningOrder = order; + drflac_int32 tempC[4] = {0, 0, 0, 0}; + drflac_int32 tempS[4] = {0, 0, 0, 0}; + + /* 0 - 3. */ + 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]; /* fallthrough */ + case 2: tempC[1] = coefficients[1]; tempS[2] = pSamplesOut[-2]; /* fallthrough */ + case 1: tempC[0] = coefficients[0]; tempS[3] = pSamplesOut[-1]; /* fallthrough */ + } + + coefficients128_0 = vld1q_s32(tempC); + samples128_0 = vld1q_s32(tempS); + runningOrder = 0; + } + + /* 4 - 7 */ + 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]; /* fallthrough */ + case 2: tempC[1] = coefficients[5]; tempS[2] = pSamplesOut[-6]; /* fallthrough */ + case 1: tempC[0] = coefficients[4]; tempS[3] = pSamplesOut[-5]; /* fallthrough */ + } + + coefficients128_4 = vld1q_s32(tempC); + samples128_4 = vld1q_s32(tempS); + runningOrder = 0; + } + + /* 8 - 11 */ + 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]; /* fallthrough */ + case 2: tempC[1] = coefficients[ 9]; tempS[2] = pSamplesOut[-10]; /* fallthrough */ + case 1: tempC[0] = coefficients[ 8]; tempS[3] = pSamplesOut[- 9]; /* fallthrough */ + } + + coefficients128_8 = vld1q_s32(tempC); + samples128_8 = vld1q_s32(tempS); + runningOrder = 0; + } + + /* Coefficients need to be shuffled for our streaming algorithm below to work. Samples are already in the correct order from the loading routine above. */ + coefficients128_0 = drflac__vrevq_s32(coefficients128_0); + coefficients128_4 = drflac__vrevq_s32(coefficients128_4); + coefficients128_8 = drflac__vrevq_s32(coefficients128_8); + } + + /* For this version we are doing one sample at a time. */ + 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); + + /* Horizontal add and shift. */ + 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); + + /* Horizontal add and shift. */ + 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); + + /* Horizontal add and shift. */ + 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); + } + } + + /* We store samples in groups of 4. */ + vst1q_s32(pDecodedSamples, samples128_0); + pDecodedSamples += 4; + } + + /* Make sure we process the last few samples. */ + i = (count & ~3); + while (i < (int)count) { + /* Rice extraction. */ + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0])) { + return DRFLAC_FALSE; + } + + /* Rice reconstruction. */ + riceParamParts[0] &= riceParamMask; + riceParamParts[0] |= (zeroCountParts[0] << riceParam); + riceParamParts[0] = (riceParamParts[0] >> 1) ^ t[riceParamParts[0] & 0x01]; + + /* Sample reconstruction. */ + 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; + int64x2_t prediction128 = { 0 }; + uint32x4_t zeroCountPart128; + uint32x4_t riceParamPart128; + + const drflac_uint32 t[2] = {0x00000000, 0xFFFFFFFF}; + + riceParamMask = (drflac_uint32)~((~0UL) << riceParam); + riceParamMask128 = vdupq_n_u32(riceParamMask); + + riceParam128 = vdupq_n_s32(riceParam); + shift64 = vdup_n_s64(-shift); /* Negate the shift because we'll be doing a variable shift using vshlq_s32(). */ + one128 = vdupq_n_u32(1); + + /* + Pre-loading the coefficients and prior samples is annoying because we need to ensure we don't try reading more than + what's available in the input buffers. It would be convenient to use a fall-through switch to do this, but this results + in strict aliasing warnings with GCC. To work around this I'm just doing something hacky. This feels a bit convoluted + so I think there's opportunity for this to be simplified. + */ + { + int runningOrder = order; + drflac_int32 tempC[4] = {0, 0, 0, 0}; + drflac_int32 tempS[4] = {0, 0, 0, 0}; + + /* 0 - 3. */ + 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]; /* fallthrough */ + case 2: tempC[1] = coefficients[1]; tempS[2] = pSamplesOut[-2]; /* fallthrough */ + case 1: tempC[0] = coefficients[0]; tempS[3] = pSamplesOut[-1]; /* fallthrough */ + } + + coefficients128_0 = vld1q_s32(tempC); + samples128_0 = vld1q_s32(tempS); + runningOrder = 0; + } + + /* 4 - 7 */ + 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]; /* fallthrough */ + case 2: tempC[1] = coefficients[5]; tempS[2] = pSamplesOut[-6]; /* fallthrough */ + case 1: tempC[0] = coefficients[4]; tempS[3] = pSamplesOut[-5]; /* fallthrough */ + } + + coefficients128_4 = vld1q_s32(tempC); + samples128_4 = vld1q_s32(tempS); + runningOrder = 0; + } + + /* 8 - 11 */ + 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]; /* fallthrough */ + case 2: tempC[1] = coefficients[ 9]; tempS[2] = pSamplesOut[-10]; /* fallthrough */ + case 1: tempC[0] = coefficients[ 8]; tempS[3] = pSamplesOut[- 9]; /* fallthrough */ + } + + coefficients128_8 = vld1q_s32(tempC); + samples128_8 = vld1q_s32(tempS); + runningOrder = 0; + } + + /* Coefficients need to be shuffled for our streaming algorithm below to work. Samples are already in the correct order from the loading routine above. */ + coefficients128_0 = drflac__vrevq_s32(coefficients128_0); + coefficients128_4 = drflac__vrevq_s32(coefficients128_4); + coefficients128_8 = drflac__vrevq_s32(coefficients128_8); + } + + /* For this version we are doing one sample at a time. */ + while (pDecodedSamples < pDecodedSamplesEnd) { + 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); /* Reset to 0. */ + 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))); + } + + /* Horizontal add and shift. */ + prediction64 = drflac__vhaddq_s64(prediction128); + prediction64 = vshl_s64(prediction64, shift64); + prediction64 = vadd_s64(prediction64, vdup_n_s64(vgetq_lane_u32(riceParamPart128, 0))); + + /* Our value should be sitting in prediction64[0]. We need to combine this with our SSE samples. */ + 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); + + /* Slide our rice parameter down so that the value in position 0 contains the next one to process. */ + riceParamPart128 = drflac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128); + } + + /* We store samples in groups of 4. */ + vst1q_s32(pDecodedSamples, samples128_0); + pDecodedSamples += 4; + } + + /* Make sure we process the last few samples. */ + i = (count & ~3); + while (i < (int)count) { + /* Rice extraction. */ + if (!drflac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0])) { + return DRFLAC_FALSE; + } + + /* Rice reconstruction. */ + riceParamParts[0] &= riceParamMask; + riceParamParts[0] |= (zeroCountParts[0] << riceParam); + riceParamParts[0] = (riceParamParts[0] >> 1) ^ t[riceParamParts[0] & 0x01]; + + /* Sample reconstruction. */ + 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); + + /* In my testing the order is rarely > 12, so in this case I'm going to simplify the NEON implementation by only handling order <= 12. */ + 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 + { + /* Scalar fallback. */ + #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 + } +} + +/* Reads and seeks past a string of residual values as Rice codes. The decoder should be sitting on the first bit of the Rice codes. */ +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); /* <-- unencodedBitsPerSample is a 5 bit number, so cannot exceed 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; +} + + +/* +Reads and decodes the residual for the sub-frame the decoder is currently sitting on. This function should be called +when the decoder is sitting at the very start of the RESIDUAL block. The first residuals will be ignored. The + and parameters are used to determine how many residual values need to be decoded. +*/ +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); /* <-- Should we allow NULL, in which case we just seek past the residual rather than do a full decode? */ + + 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; /* Unknown or unsupported residual coding method. */ + } + + /* Ignore the first values. */ + pDecodedSamples += lpcOrder; + + if (!drflac__read_uint8(bs, 4, &partitionOrder)) { + return DRFLAC_FALSE; + } + + /* + From the FLAC spec: + The Rice partition order in a Rice-coded residual section must be less than or equal to 8. + */ + if (partitionOrder > 8) { + return DRFLAC_FALSE; + } + + /* Validation check. */ + 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; +} + +/* +Reads and seeks past the residual for the sub-frame the decoder is currently sitting on. This function should be called +when the decoder is sitting at the very start of the RESIDUAL block. The first residuals will be set to 0. The + and parameters are used to determine how many residual values need to be decoded. +*/ +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; /* Unknown or unsupported residual coding method. */ + } + + if (!drflac__read_uint8(bs, 4, &partitionOrder)) { + return DRFLAC_FALSE; + } + + /* + From the FLAC spec: + The Rice partition order in a Rice-coded residual section must be less than or equal to 8. + */ + if (partitionOrder > 8) { + return DRFLAC_FALSE; + } + + /* Validation check. */ + 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; + + /* Only a single sample needs to be decoded here. */ + drflac_int32 sample; + if (!drflac__read_int32(bs, subframeBitsPerSample, &sample)) { + return DRFLAC_FALSE; + } + + /* + We don't really need to expand this, but it does simplify the process of reading samples. If this becomes a performance issue (unlikely) + we'll want to look at a more efficient way. + */ + 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} + }; + + /* Warm up samples and coefficients. */ + 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]; + + /* Warm up samples. */ + 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; /* Invalid. */ + } + lpcPrecision += 1; + + if (!drflac__read_int8(bs, 5, &lpcShift)) { + return DRFLAC_FALSE; + } + + /* + From the FLAC specification: + + Quantized linear predictor coefficient shift needed in bits (NOTE: this number is signed two's-complement) + + Emphasis on the "signed two's-complement". In practice there does not seem to be any encoders nor decoders supporting negative shifts. For now dr_flac is + not going to support negative shifts as I don't have any reference files. However, when a reference file comes through I will consider adding support. + */ + 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}; /* -1 = reserved. */ + + DRFLAC_ASSERT(bs != NULL); + DRFLAC_ASSERT(header != NULL); + + /* Keep looping until we find a valid sync code. */ + for (;;) { + drflac_uint8 crc8 = 0xCE; /* 0xCE = drflac_crc8(0, 0x3FFE, 14); */ + 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; /* <-- Safe cast. */ + 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; /* Frame is too big. This is the size of the frame minus 1. The STREAMINFO block defines the max block size which is 16-bits. Adding one will make it 17 bits and therefore too big. */ + } + 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; /* Invalid. Assume an invalid block. */ + } + + + header->channelAssignment = channelAssignment; + + header->bitsPerSample = bitsPerSampleTable[bitsPerSample]; + if (header->bitsPerSample == 0) { + header->bitsPerSample = streaminfoBitsPerSample; + } + + if (header->bitsPerSample != streaminfoBitsPerSample) { + /* If this subframe has a different bitsPerSample then streaminfo or the first frame, reject it */ + return DRFLAC_FALSE; + } + + if (!drflac__read_uint8(bs, 8, &header->crc8)) { + return DRFLAC_FALSE; + } + +#ifndef DR_FLAC_NO_CRC + if (header->crc8 != crc8) { + continue; /* CRC mismatch. Loop back to the top and find the next sync code. */ + } +#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; + } + + /* First bit should always be 0. */ + if ((header & 0x80) != 0) { + return DRFLAC_FALSE; + } + + /* + Default to 0 for the LPC order. It's important that we always set this to 0 for non LPC + and FIXED subframes because we'll be using it in a generic validation check later. + */ + pSubframe->lpcOrder = 0; + + 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; + } + + /* Wasted bits per sample. */ + 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_bool32 decodeResult; + + DRFLAC_ASSERT(bs != NULL); + DRFLAC_ASSERT(frame != NULL); + + pSubframe = frame->subframes + subframeIndex; + if (!drflac__read_subframe_header(bs, pSubframe)) { + return DRFLAC_FALSE; + } + + /* Side channels require an extra bit per sample. Took a while to figure that one out... */ + 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) { + /* libFLAC and ffmpeg reject 33-bit subframes as well */ + return DRFLAC_FALSE; + } + + /* Need to handle wasted bits per sample. */ + if (pSubframe->wastedBitsPerSample >= subframeBitsPerSample) { + return DRFLAC_FALSE; + } + subframeBitsPerSample -= pSubframe->wastedBitsPerSample; + + pSubframe->pSamplesS32 = pDecodedSamplesOut; + + /* + pDecodedSamplesOut will be pointing to a buffer that was allocated with enough memory to store + maxBlockSizeInPCMFrames samples (as specified in the FLAC header). We need to guard against an + overflow here. At a higher level we are checking maxBlockSizeInPCMFrames from the header, but + here we need to do an additional check to ensure this frame's block size fully encompasses any + warmup samples which is determined by the LPC order. For non LPC and FIXED subframes, the LPC + order will be have been set to 0 in drflac__read_subframe_header(). + */ + if (frame->header.blockSizeInPCMFrames < pSubframe->lpcOrder) { + return DRFLAC_FALSE; + } + + switch (pSubframe->subframeType) + { + case DRFLAC_SUBFRAME_CONSTANT: + { + decodeResult = drflac__decode_samples__constant(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->pSamplesS32); + } break; + + case DRFLAC_SUBFRAME_VERBATIM: + { + decodeResult = drflac__decode_samples__verbatim(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->pSamplesS32); + } break; + + case DRFLAC_SUBFRAME_FIXED: + { + decodeResult = drflac__decode_samples__fixed(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->lpcOrder, pSubframe->pSamplesS32); + } break; + + case DRFLAC_SUBFRAME_LPC: + { + decodeResult = drflac__decode_samples__lpc(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->lpcOrder, pSubframe->pSamplesS32); + } break; + + default: decodeResult = DRFLAC_FALSE; + } + + return decodeResult; +} + +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; + } + + /* Side channels require an extra bit per sample. Took a while to figure that one out... */ + 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; + } + + /* Need to handle wasted bits per sample. */ + 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; /* Invalid. */ + } + lpcPrecision += 1; + + + bitsToSeek = (pSubframe->lpcOrder * lpcPrecision) + 5; /* +5 for shift. */ + 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 + + /* This function should be called while the stream is sitting on the first byte after the frame header. */ + pFlac->currentFLACFrame.pcmFramesRemaining = 0; + DRFLAC_ZERO_MEMORY(pFlac->currentFLACFrame.subframes, sizeof(pFlac->currentFLACFrame.subframes)); + + /* The frame block size must never be larger than the maximum block size defined by the FLAC stream. */ + if (pFlac->currentFLACFrame.header.blockSizeInPCMFrames > pFlac->maxBlockSizeInPCMFrames) { + return DRFLAC_ERROR; + } + + /* The number of channels in the frame must match the channel count from the STREAMINFO block. */ + 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; /* CRC mismatch. */ + } +#endif + + pFlac->currentFLACFrame.pcmFramesRemaining = pFlac->currentFLACFrame.header.blockSizeInPCMFrames; + + return DRFLAC_SUCCESS; +} + +static drflac_result drflac__seek_flac_frame(drflac* pFlac) +{ + drflac_result result; + int channelCount; + int i; + drflac_uint16 desiredCRC16; +#ifndef DR_FLAC_NO_CRC + drflac_uint16 actualCRC16; +#endif + + pFlac->currentFLACFrame.pcmFramesRemaining = 0; + + 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)) { + result = DRFLAC_ERROR; + goto error; + } + } + + /* Padding. */ + if (!drflac__seek_bits(&pFlac->bs, DRFLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7)) { + result = DRFLAC_ERROR; + goto error; + } + + /* CRC. */ +#ifndef DR_FLAC_NO_CRC + actualCRC16 = drflac__flush_crc16(&pFlac->bs); +#endif + if (!drflac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) { + result = DRFLAC_AT_END; + goto error; + } + +#ifndef DR_FLAC_NO_CRC + if (actualCRC16 != desiredCRC16) { + result = DRFLAC_CRC_MISMATCH; /* CRC mismatch. */ + goto error; + } +#endif + + return DRFLAC_SUCCESS; + +error: + DRFLAC_ZERO_MEMORY(pFlac->currentFLACFrame.subframes, sizeof(pFlac->currentFLACFrame.subframes)); + return result; +} + +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; /* CRC mismatch. Skip to the next frame. */ + } 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; /* Needs to be zero based. */ + } + + 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) +{ + /* This function should only ever be called while the decoder is sitting on the first byte past the FRAME_HEADER section. */ + 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; /* Couldn't read the next frame, so just break from the loop and return. */ + } + } else { + if (pFlac->currentFLACFrame.pcmFramesRemaining > pcmFramesToSeek) { + pcmFramesRead += pcmFramesToSeek; + pFlac->currentFLACFrame.pcmFramesRemaining -= (drflac_uint32)pcmFramesToSeek; /* <-- Safe cast. Will always be < currentFrame.pcmFramesRemaining < 65536. */ + 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 we are seeking forward we start from the current position. Otherwise we need to start all the way from the start of the file. */ + if (pcmFrameIndex >= pFlac->currentPCMFrame) { + /* Seeking forward. Need to seek from the current position. */ + runningPCMFrameCount = pFlac->currentPCMFrame; + + /* The frame header for the first frame may not yet have been read. We need to do that if necessary. */ + 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 { + /* Seeking backwards. Need to seek from the start of the file. */ + runningPCMFrameCount = 0; + + /* Move back to the start. */ + if (!drflac__seek_to_first_frame(pFlac)) { + return DRFLAC_FALSE; + } + + /* Decode the first frame in preparation for sample-exact seeking below. */ + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { + return DRFLAC_FALSE; + } + } + + /* + We need to as quickly as possible find the frame that contains the target sample. To do this, we iterate over each frame and inspect its + header. If based on the header we can determine that the frame contains the sample, we do a full decode of that frame. + */ + 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)) { + /* + The sample should be in this frame. We need to fully decode it, however if it's an invalid frame (a CRC mismatch), we need to pretend + it never existed and keep iterating. + */ + drflac_uint64 pcmFramesToDecode = pcmFrameIndex - runningPCMFrameCount; + + if (!isMidFrame) { + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + /* The frame is valid. We just need to skip over some samples to ensure it's sample-exact. */ + return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; /* <-- If this fails, something bad has happened (it should never fail). */ + } else { + if (result == DRFLAC_CRC_MISMATCH) { + goto next_iteration; /* CRC mismatch. Pretend this frame never existed. */ + } else { + return DRFLAC_FALSE; + } + } + } else { + /* We started seeking mid-frame which means we need to skip the frame decoding part. */ + return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; + } + } else { + /* + It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this + frame never existed and leave the running sample count untouched. + */ + 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; /* CRC mismatch. Pretend this frame never existed. */ + } else { + return DRFLAC_FALSE; + } + } + } else { + /* + We started seeking mid-frame which means we need to seek by reading to the end of the frame instead of with + drflac__seek_to_next_flac_frame() which only works if the decoder is sitting on the byte just after the frame header. + */ + runningPCMFrameCount += pFlac->currentFLACFrame.pcmFramesRemaining; + pFlac->currentFLACFrame.pcmFramesRemaining = 0; + isMidFrame = DRFLAC_FALSE; + } + + /* If we are seeking to the end of the file and we've just hit it, we're done. */ + if (pcmFrameIndex == pFlac->totalPCMFrameCount && runningPCMFrameCount == pFlac->totalPCMFrameCount) { + return DRFLAC_TRUE; + } + } + + next_iteration: + /* Grab the next frame in preparation for the 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) +/* +We use an average compression ratio to determine our approximate start location. FLAC files are generally about 50%-70% the size of their +uncompressed counterparts so we'll use this as a basis. I'm going to split the middle and use a factor of 0.6 to determine the starting +location. +*/ +#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 (;;) { + /* After rangeLo == rangeHi == targetByte fails, we need to break out. */ + drflac_uint64 lastTargetByte = targetByte; + + /* When seeking to a byte, failure probably means we've attempted to seek beyond the end of the stream. To counter this we just halve it each attempt. */ + if (!drflac__seek_to_byte(&pFlac->bs, targetByte)) { + /* If we couldn't even seek to the first byte in the stream we have a problem. Just abandon the whole thing. */ + if (targetByte == 0) { + drflac__seek_to_first_frame(pFlac); /* Try to recover. */ + return DRFLAC_FALSE; + } + + /* Halve the byte location and continue. */ + targetByte = rangeLo + ((rangeHi - rangeLo)/2); + rangeHi = targetByte; + } else { + /* Getting here should mean that we have seeked to an appropriate byte. */ + + /* Clear the details of the FLAC frame so we don't misreport data. */ + DRFLAC_ZERO_MEMORY(&pFlac->currentFLACFrame, sizeof(pFlac->currentFLACFrame)); + + /* + Now seek to the next FLAC frame. We need to decode the entire frame (not just the header) because it's possible for the header to incorrectly pass the + CRC check and return bad data. We need to decode the entire frame to be more certain. Although this seems unlikely, this has happened to me in testing + so it needs to stay this way for now. + */ +#if 1 + if (!drflac__read_and_decode_next_flac_frame(pFlac)) { + /* Halve the byte location and continue. */ + targetByte = rangeLo + ((rangeHi - rangeLo)/2); + rangeHi = targetByte; + } else { + break; + } +#else + if (!drflac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) { + /* Halve the byte location and continue. */ + targetByte = rangeLo + ((rangeHi - rangeLo)/2); + rangeHi = targetByte; + } else { + break; + } +#endif + } + + /* We already tried this byte and there are no more to try, break out. */ + if(targetByte == lastTargetByte) { + return DRFLAC_FALSE; + } + } + + /* The current PCM frame needs to be updated based on the frame we just seeked to. */ + 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) +{ + /* This section of code would be used if we were only decoding the FLAC frame header when calling drflac__seek_to_approximate_flac_frame_to_byte(). */ +#if 0 + if (drflac__decode_flac_frame(pFlac) != DRFLAC_SUCCESS) { + /* We failed to decode this frame which may be due to it being corrupt. We'll just use the next valid FLAC frame. */ + 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) +{ + /* This assumes pFlac->currentPCMFrame is sitting on byteRangeLo upon entry. */ + + 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 only two adjacent byte offsets remain, binary search cannot narrow the range any further. Seek to the closest frame before the target and decode + forward from there. + */ + if ((byteRangeHi - byteRangeLo) == 1) { + if (!drflac__seek_to_approximate_flac_frame_to_byte(pFlac, closestSeekOffsetBeforeTargetPCMFrame, closestSeekOffsetBeforeTargetPCMFrame, byteRangeHi, &lastSuccessfulSeekOffset)) { + break; + } + + if (pFlac->currentPCMFrame <= pcmFrameIndex && drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) { + return DRFLAC_TRUE; + } + + break; + } + + if (drflac__seek_to_approximate_flac_frame_to_byte(pFlac, targetByte, byteRangeLo, byteRangeHi, &lastSuccessfulSeekOffset)) { + /* We found a FLAC frame. We need to check if it contains the sample we're looking for. */ + drflac_uint64 newPCMRangeLo; + drflac_uint64 newPCMRangeHi; + drflac__get_pcm_frame_range_of_current_flac_frame(pFlac, &newPCMRangeLo, &newPCMRangeHi); + + /* If we selected the same frame, it means we should be pretty close. Just decode the rest. */ + if (pcmRangeLo == newPCMRangeLo) { + if (!drflac__seek_to_approximate_flac_frame_to_byte(pFlac, closestSeekOffsetBeforeTargetPCMFrame, closestSeekOffsetBeforeTargetPCMFrame, byteRangeHi, &lastSuccessfulSeekOffset)) { + break; /* Failed to seek to closest frame. */ + } + + if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) { + return DRFLAC_TRUE; + } else { + break; /* Failed to seek forward. */ + } + } + + pcmRangeLo = newPCMRangeLo; + pcmRangeHi = newPCMRangeHi; + + if (pcmRangeLo <= pcmFrameIndex && pcmRangeHi >= pcmFrameIndex) { + /* The target PCM frame is in this FLAC frame. */ + if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame) ) { + return DRFLAC_TRUE; + } else { + break; /* Failed to seek to FLAC frame. */ + } + } else { + if (pcmRangeLo > pcmFrameIndex) { + /* We seeked too far forward. We need to move our target byte backward and try again. */ + byteRangeHi = lastSuccessfulSeekOffset; + if (byteRangeLo > byteRangeHi) { + byteRangeLo = byteRangeHi; + } + + targetByte = byteRangeLo + ((byteRangeHi - byteRangeLo) / 2); + if (targetByte < byteRangeLo) { + targetByte = byteRangeLo; + } + } else /*if (pcmRangeHi < pcmFrameIndex)*/ { + /* We didn't seek far enough. We need to move our target byte forward and try again. */ + + /* If we're close enough we can just seek forward. */ + if ((pcmFrameIndex - pcmRangeLo) < seekForwardThreshold) { + if (drflac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) { + return DRFLAC_TRUE; + } else { + break; /* Failed to seek to FLAC frame. */ + } + } else { + const double approxCompressionRatio = (drflac_int64)(lastSuccessfulSeekOffset - pFlac->firstFLACFramePosInBytes) / ((drflac_int64)(pcmRangeLo * pFlac->channels * pFlac->bitsPerSample)/8.0); + + byteRangeLo = lastSuccessfulSeekOffset; + if (byteRangeHi < byteRangeLo) { + byteRangeHi = byteRangeLo; + } + + targetByte = lastSuccessfulSeekOffset + (drflac_uint64)(((drflac_int64)((pcmFrameIndex-pcmRangeLo) * pFlac->channels * pFlac->bitsPerSample)/8.0) * approxCompressionRatio); + if (targetByte > byteRangeHi) { + targetByte = byteRangeHi; + } + + if (closestSeekOffsetBeforeTargetPCMFrame < lastSuccessfulSeekOffset) { + closestSeekOffsetBeforeTargetPCMFrame = lastSuccessfulSeekOffset; + } + } + } + } + } else { + /* Getting here is really bad. We just recover as best we can, but moving to the first frame in the stream, and then abort. */ + break; + } + } + + drflac__seek_to_first_frame(pFlac); /* <-- Try to recover. */ + 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; + + /* Our algorithm currently assumes the FLAC stream is currently sitting at the start. */ + if (drflac__seek_to_first_frame(pFlac) == DRFLAC_FALSE) { + return DRFLAC_FALSE; + } + + /* If we're close enough to the start, just move to the start and seek forward. */ + if (pcmFrameIndex < seekForwardThreshold) { + return drflac__seek_forward_by_pcm_frames(pFlac, pcmFrameIndex) == pcmFrameIndex; + } + + /* + Our starting byte range is the byte position of the first FLAC frame and the approximate end of the file as if it were completely uncompressed. This ensures + the entire file is included, even though most of the time it'll exceed the end of the actual stream. This is OK as the frame searching logic will handle it. + */ + 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 /* !DR_FLAC_NO_CRC */ + +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; + } + + /* Do not use the seektable if pcmFramIndex is not coverd by it. */ + 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; + } + + /* There's been cases where the seek table contains only zeros. We need to do some basic validation on the closest seekpoint. */ + 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) + /* At this point we should know the closest seek point. We can use a binary search for this. We need to know the total sample count for this. */ + 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 our closest seek point is not the last one, we only need to search between it and the next one. The section below calculates an appropriate starting + value for byteRangeHi which will clamp it appropriately. + + Note that the next seekpoint must have an offset greater than the closest seekpoint because otherwise our binary search algorithm will break down. There + have been cases where a seektable consists of seek points where every byte offset is set to 0 which causes problems. If this happens we need to abort. + */ + if (iClosestSeekpoint < pFlac->seekpointCount-1) { + drflac_uint32 iNextSeekpoint = iClosestSeekpoint + 1; + + /* Basic validation on the seekpoints to ensure they're usable. */ + if (pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset >= pFlac->pSeekpoints[iNextSeekpoint].flacFrameOffset || pFlac->pSeekpoints[iNextSeekpoint].pcmFrameCount == 0) { + return DRFLAC_FALSE; /* The next seekpoint doesn't look right. The seek table cannot be trusted from here. Abort. */ + } + + if (pFlac->pSeekpoints[iNextSeekpoint].firstPCMFrame != (((drflac_uint64)0xFFFFFFFF << 32) | 0xFFFFFFFF)) { /* Make sure it's not a placeholder seekpoint. */ + byteRangeHi = pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iNextSeekpoint].flacFrameOffset - 1; /* byteRangeHi must be zero based. */ + } + } + + 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 /* !DR_FLAC_NO_CRC */ + + /* Getting here means we need to use a slower algorithm because the binary search method failed or cannot be used. */ + + /* + If we are seeking forward and the closest seekpoint is _before_ the current sample, we just seek forward from where we are. Otherwise we start seeking + from the seekpoint's first sample. + */ + if (pcmFrameIndex >= pFlac->currentPCMFrame && pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame <= pFlac->currentPCMFrame) { + /* Optimized case. Just seek forward from where we are. */ + runningPCMFrameCount = pFlac->currentPCMFrame; + + /* The frame header for the first frame may not yet have been read. We need to do that if necessary. */ + 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 { + /* Slower case. Seek to the start of the seekpoint and then seek forward from there. */ + runningPCMFrameCount = pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame; + + if (!drflac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset)) { + return DRFLAC_FALSE; + } + + /* Grab the frame the seekpoint is sitting on in preparation for the sample-exact seeking below. */ + 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)) { + /* + The sample should be in this frame. We need to fully decode it, but if it's an invalid frame (a CRC mismatch) we need to pretend + it never existed and keep iterating. + */ + drflac_uint64 pcmFramesToDecode = pcmFrameIndex - runningPCMFrameCount; + + if (!isMidFrame) { + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + /* The frame is valid. We just need to skip over some samples to ensure it's sample-exact. */ + return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; /* <-- If this fails, something bad has happened (it should never fail). */ + } else { + if (result == DRFLAC_CRC_MISMATCH) { + goto next_iteration; /* CRC mismatch. Pretend this frame never existed. */ + } else { + return DRFLAC_FALSE; + } + } + } else { + /* We started seeking mid-frame which means we need to skip the frame decoding part. */ + return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; + } + } else { + /* + It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this + frame never existed and leave the running sample count untouched. + */ + 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; /* CRC mismatch. Pretend this frame never existed. */ + } else { + return DRFLAC_FALSE; + } + } + } else { + /* + We started seeking mid-frame which means we need to seek by reading to the end of the frame instead of with + drflac__seek_to_next_flac_frame() which only works if the decoder is sitting on the byte just after the frame header. + */ + runningPCMFrameCount += pFlac->currentFLACFrame.pcmFramesRemaining; + pFlac->currentFLACFrame.pcmFramesRemaining = 0; + isMidFrame = DRFLAC_FALSE; + } + + /* If we are seeking to the end of the file and we've just hit it, we're done. */ + if (pcmFrameIndex == pFlac->totalPCMFrameCount && runningPCMFrameCount == pFlac->totalPCMFrameCount) { + return DRFLAC_TRUE; + } + } + + next_iteration: + /* Grab the next frame in preparation for the 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]; /* Should be "OggS" */ + drflac_uint8 structureVersion; /* Always 0. */ + 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_tell_proc onTell; + 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; /* <-- A bit streamer is required for loading data during initialization. */ + drflac_frame_header firstFrameHeader; /* <-- The header of the first frame that was read during relaxed initalization. Only set if there is no STREAMINFO block. */ + +#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]; + + /* min/max block size. */ + if (onRead(pUserData, &blockSizes, 4) != 4) { + return DRFLAC_FALSE; + } + + /* min/max frame size. */ + if (onRead(pUserData, &frameSizes, 6) != 6) { + return DRFLAC_FALSE; + } + + /* Sample rate, channels, bits per sample and total sample count. */ + if (onRead(pUserData, &importantProps, 8) != 8) { + return DRFLAC_FALSE; + } + + /* MD5 */ + 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); + } + + /* Try using realloc(). */ + 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); + } + + /* Try emulating realloc() in terms of malloc()/free(). */ + 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, DRFLAC_MIN(szNew, 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_tell_proc onTell, drflac_meta_proc onMeta, void* pUserData, void* pUserDataMD, drflac_uint64* pFirstFramePos, drflac_uint64* pSeektablePos, drflac_uint32* pSeekpointCount, drflac_allocation_callbacks* pAllocationCallbacks) +{ + /* + We want to keep track of the byte position in the stream of the seektable. At the time of calling this function we know that + we'll be sitting on byte 42. + */ + drflac_uint64 runningFilePos = 42; + drflac_uint64 seektablePos = 0; + drflac_uint32 seektableSize = 0; + drflac_int64 fileSize = 0; + drflac_bool32 hasKnownFileSize = DRFLAC_FALSE; + + /* We'll be doing some memory allocations here against untrusted data. We'll do a basic validation check that they don't exceed the size of the file. */ + if (onTell != NULL && onSeek != NULL) { + if (onSeek(pUserData, 0, DRFLAC_SEEK_END)) { + if (onTell(pUserData, &fileSize)) { + hasKnownFileSize = DRFLAC_TRUE; + } + + onSeek(pUserData, (int)runningFilePos, DRFLAC_SEEK_SET); /* Safe cast because runningFilePos should always be 42 at this point. */ + } + } + + for (;;) { + drflac_metadata metadata; + drflac_uint8 isLastBlock = 0; + drflac_uint8 blockType = 0; + drflac_uint32 blockSize; + if (drflac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize) == DRFLAC_FALSE) { + return DRFLAC_FALSE; + } + + if (hasKnownFileSize && (blockSize > ((drflac_uint64)fileSize - runningFilePos))) { + return DRFLAC_FALSE; /* Block size exceeds the size of the file. */ + } + + runningFilePos += 4; + + metadata.type = blockType; + metadata.rawDataSize = 0; + metadata.rawDataOffset = runningFilePos; + metadata.pRawData = NULL; + + 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 seekpointCount; + drflac_uint32 iSeekpoint; + void* pRawData; + size_t rawDataSize; + + seekpointCount = blockSize/DRFLAC_SEEKPOINT_SIZE_IN_BYTES; + rawDataSize = seekpointCount * sizeof(drflac_seekpoint); + + pRawData = drflac__malloc_from_callbacks(rawDataSize, pAllocationCallbacks); + if (pRawData == NULL) { + return DRFLAC_FALSE; + } + + /* We need to read seekpoint by seekpoint and do some processing. */ + for (iSeekpoint = 0; iSeekpoint < seekpointCount; ++iSeekpoint) { + drflac_seekpoint* pSeekpoint = (drflac_seekpoint*)pRawData + iSeekpoint; + + if (onRead(pUserData, pSeekpoint, DRFLAC_SEEKPOINT_SIZE_IN_BYTES) != DRFLAC_SEEKPOINT_SIZE_IN_BYTES) { + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + return DRFLAC_FALSE; + } + + /* Endian swap. */ + pSeekpoint->firstPCMFrame = drflac__be2host_64(pSeekpoint->firstPCMFrame); + pSeekpoint->flacFrameOffset = drflac__be2host_64(pSeekpoint->flacFrameOffset); + pSeekpoint->pcmFrameCount = drflac__be2host_16(pSeekpoint->pcmFrameCount); + } + + metadata.pRawData = pRawData; + metadata.rawDataSize = rawDataSize; + metadata.data.seektable.seekpointCount = seekpointCount; + metadata.data.seektable.pSeekpoints = (const drflac_seekpoint*)pRawData; + + 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; + + /* Need space for the rest of the block */ + if ((pRunningDataEnd - pRunningData) - 4 < (drflac_int64)metadata.data.vorbis_comment.vendorLength) { /* <-- Note the order of operations to avoid overflow to a valid value */ + 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; + + /* Need space for 'commentCount' comments after the block, which at minimum is a drflac_uint32 per comment */ + if ((pRunningDataEnd - pRunningData) / sizeof(drflac_uint32) < metadata.data.vorbis_comment.commentCount) { /* <-- Note the order of operations to avoid overflow to a valid value */ + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + return DRFLAC_FALSE; + } + metadata.data.vorbis_comment.pComments = pRunningData; + + /* Check that the comments section is valid before passing it to the callback */ + 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) { /* <-- Note the order of operations to avoid overflow to a valid value */ + 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; + size_t bufferSize; + drflac_uint8 iTrack; + drflac_uint8 iIndex; + void* pTrackData; + + /* + This needs to be loaded in two passes. The first pass is used to calculate the size of the memory allocation + we need for storing the necessary data. The second pass will fill that buffer with usable data. + */ + 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 = NULL; /* Will be filled later. */ + + /* Pass 1: Calculate the size of the buffer for the track data. */ + { + const char* pRunningDataSaved = pRunningData; /* Will be restored at the end in preparation for the second pass. */ + + bufferSize = metadata.data.cuesheet.trackCount * DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES; + + for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) { + drflac_uint8 indexCount; + drflac_uint32 indexPointSize; + + if (pRunningDataEnd - pRunningData < DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES) { + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + return DRFLAC_FALSE; + } + + /* Skip to the index point count */ + pRunningData += 35; + + indexCount = pRunningData[0]; + pRunningData += 1; + + bufferSize += indexCount * sizeof(drflac_cuesheet_track_index); + + /* Quick validation check. */ + indexPointSize = indexCount * DRFLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES; + if (pRunningDataEnd - pRunningData < (drflac_int64)indexPointSize) { + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + return DRFLAC_FALSE; + } + + pRunningData += indexPointSize; + } + + pRunningData = pRunningDataSaved; + } + + /* Pass 2: Allocate a buffer and fill the data. Validation was done in the step above so can be skipped. */ + { + char* pRunningTrackData; + + pTrackData = drflac__malloc_from_callbacks(bufferSize, pAllocationCallbacks); + if (pTrackData == NULL) { + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + return DRFLAC_FALSE; + } + + pRunningTrackData = (char*)pTrackData; + + for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) { + drflac_uint8 indexCount; + + DRFLAC_COPY_MEMORY(pRunningTrackData, pRunningData, DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES); + pRunningData += DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES-1; /* Skip forward, but not beyond the last byte in the CUESHEET_TRACK block which is the index count. */ + pRunningTrackData += DRFLAC_CUESHEET_TRACK_SIZE_IN_BYTES-1; + + /* Grab the index count for the next part. */ + indexCount = pRunningData[0]; + pRunningData += 1; + pRunningTrackData += 1; + + /* Extract each track index. */ + for (iIndex = 0; iIndex < indexCount; ++iIndex) { + drflac_cuesheet_track_index* pTrackIndex = (drflac_cuesheet_track_index*)pRunningTrackData; + + DRFLAC_COPY_MEMORY(pRunningTrackData, pRunningData, DRFLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES); + pRunningData += DRFLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES; + pRunningTrackData += sizeof(drflac_cuesheet_track_index); + + pTrackIndex->offset = drflac__be2host_64(pTrackIndex->offset); + } + } + + metadata.data.cuesheet.pTrackData = pTrackData; + } + + /* The original data is no longer needed. */ + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + pRawData = NULL; + + onMeta(pUserDataMD, &metadata); + + drflac__free_from_callbacks(pTrackData, pAllocationCallbacks); + pTrackData = NULL; + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_PICTURE: + { + if (blockSize < 32) { + return DRFLAC_FALSE; + } + + if (onMeta) { + drflac_bool32 result = DRFLAC_TRUE; + drflac_uint32 blockSizeRemaining = blockSize; + char* pMime = NULL; + char* pDescription = NULL; + void* pPictureData = NULL; + + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.type, 4) != 4) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.type = drflac__be2host_32(metadata.data.picture.type); + + + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.mimeLength, 4) != 4) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.mimeLength = drflac__be2host_32(metadata.data.picture.mimeLength); + + if (blockSizeRemaining < metadata.data.picture.mimeLength) { + result = DRFLAC_FALSE; + goto done_flac; + } + + pMime = (char*)drflac__malloc_from_callbacks(metadata.data.picture.mimeLength + 1, pAllocationCallbacks); /* +1 for null terminator. */ + if (pMime == NULL) { + result = DRFLAC_FALSE; + goto done_flac; + } + + if (onRead(pUserData, pMime, metadata.data.picture.mimeLength) != metadata.data.picture.mimeLength) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= metadata.data.picture.mimeLength; + pMime[metadata.data.picture.mimeLength] = '\0'; /* Null terminate for safety. */ + metadata.data.picture.mime = (const char*)pMime; + + + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.descriptionLength, 4) != 4) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.descriptionLength = drflac__be2host_32(metadata.data.picture.descriptionLength); + + if (blockSizeRemaining < metadata.data.picture.descriptionLength) { + result = DRFLAC_FALSE; + goto done_flac; + } + + pDescription = (char*)drflac__malloc_from_callbacks(metadata.data.picture.descriptionLength + 1, pAllocationCallbacks); /* +1 for null terminator. */ + if (pDescription == NULL) { + result = DRFLAC_FALSE; + goto done_flac; + } + + if (onRead(pUserData, pDescription, metadata.data.picture.descriptionLength) != metadata.data.picture.descriptionLength) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= metadata.data.picture.descriptionLength; + pDescription[metadata.data.picture.descriptionLength] = '\0'; /* Null terminate for safety. */ + metadata.data.picture.description = (const char*)pDescription; + + + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.width, 4) != 4) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.width = drflac__be2host_32(metadata.data.picture.width); + + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.height, 4) != 4) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.height = drflac__be2host_32(metadata.data.picture.height); + + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.colorDepth, 4) != 4) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.colorDepth = drflac__be2host_32(metadata.data.picture.colorDepth); + + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.indexColorCount, 4) != 4) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.indexColorCount = drflac__be2host_32(metadata.data.picture.indexColorCount); + + + /* Picture data. */ + if (blockSizeRemaining < 4 || onRead(pUserData, &metadata.data.picture.pictureDataSize, 4) != 4) { + result = DRFLAC_FALSE; + goto done_flac; + } + blockSizeRemaining -= 4; + metadata.data.picture.pictureDataSize = drflac__be2host_32(metadata.data.picture.pictureDataSize); + + if (blockSizeRemaining < metadata.data.picture.pictureDataSize) { + result = DRFLAC_FALSE; + goto done_flac; + } + + /* For the actual image data we want to store the offset to the start of the stream. */ + metadata.data.picture.pictureDataOffset = runningFilePos + (blockSize - blockSizeRemaining); + + /* + For the allocation of image data, we can allow memory allocation to fail, in which case we just leave + the pointer as null. If it fails, we need to fall back to seeking past the image data. + */ + #ifndef DR_FLAC_NO_PICTURE_METADATA_MALLOC + pPictureData = drflac__malloc_from_callbacks(metadata.data.picture.pictureDataSize, pAllocationCallbacks); + if (pPictureData != NULL) { + if (onRead(pUserData, pPictureData, metadata.data.picture.pictureDataSize) != metadata.data.picture.pictureDataSize) { + result = DRFLAC_FALSE; + goto done_flac; + } + } else + #endif + { + /* Allocation failed. We need to seek past the picture data. */ + if (!onSeek(pUserData, metadata.data.picture.pictureDataSize, DRFLAC_SEEK_CUR)) { + result = DRFLAC_FALSE; + goto done_flac; + } + } + + blockSizeRemaining -= metadata.data.picture.pictureDataSize; + (void)blockSizeRemaining; + + metadata.data.picture.pPictureData = (const drflac_uint8*)pPictureData; + + + /* Only fire the callback if we actually have a way to read the image data. We must have either a valid offset, or a valid data pointer. */ + if (metadata.data.picture.pictureDataOffset != 0 || metadata.data.picture.pPictureData != NULL) { + onMeta(pUserDataMD, &metadata); + } else { + /* Don't have a valid offset or data pointer, so just pretend we don't have a picture metadata. */ + } + + done_flac: + drflac__free_from_callbacks(pMime, pAllocationCallbacks); + drflac__free_from_callbacks(pDescription, pAllocationCallbacks); + drflac__free_from_callbacks(pPictureData, pAllocationCallbacks); + + if (result != DRFLAC_TRUE) { + return DRFLAC_FALSE; + } + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_PADDING: + { + if (onMeta) { + metadata.data.padding.unused = 0; + + /* Padding doesn't have anything meaningful in it, so just skip over it, but make sure the caller is aware of it by firing the callback. */ + if (!onSeek(pUserData, blockSize, DRFLAC_SEEK_CUR)) { + isLastBlock = DRFLAC_TRUE; /* An error occurred while seeking. Attempt to recover by treating this as the last block which will in turn terminate the loop. */ + } else { + onMeta(pUserDataMD, &metadata); + } + } + } break; + + case DRFLAC_METADATA_BLOCK_TYPE_INVALID: + { + /* Invalid chunk. Just skip over this one. */ + if (onMeta) { + if (!onSeek(pUserData, blockSize, DRFLAC_SEEK_CUR)) { + isLastBlock = DRFLAC_TRUE; /* An error occurred while seeking. Attempt to recover by treating this as the last block which will in turn terminate the loop. */ + } + } + } break; + + default: + { + /* + It's an unknown chunk, but not necessarily invalid. There's a chance more metadata blocks might be defined later on, so we + can at the very least report the chunk to the application and let it look at the raw data. + */ + if (onMeta) { + void* pRawData = drflac__malloc_from_callbacks(blockSize, pAllocationCallbacks); + if (pRawData != NULL) { + if (onRead(pUserData, pRawData, blockSize) != blockSize) { + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + return DRFLAC_FALSE; + } + } else { + /* Allocation failed. We need to seek past the block. */ + if (!onSeek(pUserData, blockSize, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + } + + metadata.pRawData = pRawData; + metadata.rawDataSize = blockSize; + onMeta(pUserDataMD, &metadata); + + drflac__free_from_callbacks(pRawData, pAllocationCallbacks); + } + } break; + } + + /* If we're not handling metadata, just skip over the block. If we are, it will have been handled earlier in the switch statement above. */ + if (onMeta == NULL && blockSize > 0) { + if (!onSeek(pUserData, blockSize, DRFLAC_SEEK_CUR)) { + isLastBlock = DRFLAC_TRUE; + } + } + + runningFilePos += blockSize; + if (isLastBlock) { + break; + } + } + + *pSeektablePos = seektablePos; + *pSeekpointCount = seektableSize / DRFLAC_SEEKPOINT_SIZE_IN_BYTES; + *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) +{ + /* Pre Condition: The bit stream should be sitting just past the 4-byte id header. */ + + drflac_uint8 isLastBlock; + drflac_uint8 blockType; + drflac_uint32 blockSize; + + (void)onSeek; + + pInit->container = drflac_container_native; + + /* The first metadata block should be the STREAMINFO block. */ + 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) { + /* We're opening in strict mode and the first block is not the STREAMINFO block. Error. */ + return DRFLAC_FALSE; + } else { + /* + Relaxed mode. To open from here we need to just find the first frame and set the sample rate, etc. to whatever is defined + for that frame. + */ + pInit->hasStreamInfoBlock = DRFLAC_FALSE; + pInit->hasMetadataBlocks = DRFLAC_FALSE; + + if (!drflac__read_next_flac_frame_header(&pInit->bs, 0, &pInit->firstFrameHeader)) { + return DRFLAC_FALSE; /* Couldn't find a frame. */ + } + + if (pInit->firstFrameHeader.bitsPerSample == 0) { + return DRFLAC_FALSE; /* Failed to initialize because the first frame depends on the STREAMINFO block, which does not exist. */ + } + + 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; /* <-- See notes here: https://xiph.org/flac/format.html#metadata_block_streaminfo */ + 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; /* Don't care about the min block size - only the max (used for determining the size of the memory allocation). */ + 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 /* CRC-32 of "OggS". */ + +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) +{ + /* This can be optimized. */ + 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; + + /* + It's not actually used, but set the capture pattern to 'OggS' for completeness. Not doing this will cause static analysers to complain about + us trying to access uninitialized data. We could alternatively just comment out this member of the drflac_ogg_page_header structure, but I + like to have it map to the structure of the underlying data. + */ + 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]; + + /* Calculate the CRC. Note that for the calculation the checksum part of the page needs to be set to 0. */ + 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; + + /* We need to read byte-by-byte until we find the OggS capture pattern. */ + 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 { + /* The first 4 bytes did not equal the capture pattern. Read the next byte and try again. */ + 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; + } + } +} + + +/* +The main part of the Ogg encapsulation is the conversion from the physical Ogg bitstream to the native FLAC bitstream. It works +in three general stages: Ogg Physical Bitstream -> Ogg/FLAC Logical Bitstream -> FLAC Native Bitstream. dr_flac is designed +in such a way that the core sections assume everything is delivered in native format. Therefore, for each encapsulation type +dr_flac is supporting there needs to be a layer sitting on top of the onRead and onSeek callbacks that ensures the bits read from +the physical Ogg bitstream are converted and delivered in native FLAC format. +*/ +typedef struct +{ + drflac_read_proc onRead; /* The original onRead callback from drflac_open() and family. */ + drflac_seek_proc onSeek; /* The original onSeek callback from drflac_open() and family. */ + drflac_tell_proc onTell; /* The original onTell callback from drflac_open() and family. */ + void* pUserData; /* The user data passed on onRead and onSeek. This is the user data that was passed on drflac_open() and family. */ + drflac_uint64 currentBytePos; /* The position of the byte we are sitting on in the physical byte stream. Used for efficient seeking. */ + drflac_uint64 firstBytePos; /* The position of the first byte in the physical bitstream. Points to the start of the "OggS" identifier of the FLAC bos page. */ + drflac_uint32 serialNumber; /* The serial number of the FLAC audio pages. This is determined by the initial header page that was read during initialization. */ + drflac_ogg_page_header bosPageHeader; /* Used for seeking. */ + drflac_ogg_page_header currentPageHeader; + drflac_uint32 bytesRemainingInPage; + drflac_uint32 pageDataSize; + drflac_uint8 pageData[DRFLAC_OGG_MAX_PAGE_SIZE]; +} drflac_oggbs; /* oggbs = Ogg Bitstream */ + +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_SET) { + if (offset <= 0x7FFFFFFF) { + if (!oggbs->onSeek(oggbs->pUserData, (int)offset, DRFLAC_SEEK_SET)) { + return DRFLAC_FALSE; + } + oggbs->currentBytePos = offset; + + return DRFLAC_TRUE; + } else { + if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, DRFLAC_SEEK_SET)) { + return DRFLAC_FALSE; + } + oggbs->currentBytePos = offset; + + return drflac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, DRFLAC_SEEK_CUR); + } + } else { + while (offset > 0x7FFFFFFF) { + if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + oggbs->currentBytePos += 0x7FFFFFFF; + offset -= 0x7FFFFFFF; + } + + if (!oggbs->onSeek(oggbs->pUserData, (int)offset, DRFLAC_SEEK_CUR)) { /* <-- Safe cast thanks to the loop above. */ + 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; /* Invalid page size. Assume it's corrupted and just move to the next page. */ + } + + if (header.serialNumber != oggbs->serialNumber) { + /* It's not a FLAC page. Skip it. */ + if (pageBodySize > 0 && !drflac_oggbs__seek_physical(oggbs, pageBodySize, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + continue; + } + + + /* We need to read the entire page and then do a CRC check on it. If there's a CRC mismatch we need to skip this page. */ + 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; /* CRC mismatch. Skip this page. */ + } else { + /* + Even though we are failing on a CRC mismatch, we still want our stream to be in a good state. Therefore we + go to the next valid page to ensure we're in a good state, but return false to let the caller know that the + seek did not fully complete. + */ + drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch); + return DRFLAC_FALSE; + } + } +#else + (void)recoveryMethod; /* <-- Silence a warning. */ +#endif + + oggbs->currentPageHeader = header; + oggbs->bytesRemainingInPage = pageBodySize; + return DRFLAC_TRUE; + } +} + +/* Function below is unused at the moment, but I might be re-adding it later. */ +#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) +{ + /* The current packet ends when we get to the segment with a lacing value of < 255 which is not at the end of a page. */ + 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; + } + + /* + At this point we will have found either the packet or the end of the page. If were at the end of the page we'll + want to load the next page and keep searching for the end of the packet. + */ + drflac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, DRFLAC_SEEK_CUR); + oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage; + + if (atEndOfPage) { + /* + We're potentially at the next packet, but we need to check the next page first to be sure because the packet may + straddle pages. + */ + if (!drflac_oggbs__goto_next_page(oggbs)) { + return DRFLAC_FALSE; + } + + /* If it's a fresh packet it most likely means we're at the next packet. */ + if ((oggbs->currentPageHeader.headerType & 0x01) == 0) { + return DRFLAC_TRUE; + } + } else { + /* We're at the next packet. */ + return DRFLAC_TRUE; + } + } +} + +static drflac_bool32 drflac_oggbs__seek_to_next_frame(drflac_oggbs* oggbs) +{ + /* The bitstream should be sitting on the first byte just after the header of the frame. */ + + /* What we're actually doing here is seeking to the start of the next packet. */ + 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); + + /* Reading is done page-by-page. If we've run out of bytes in the page we need to move to the next one. */ + 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 we get here it means some of the requested data is contained in the next pages. */ + 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; /* Failed to go to the next page. Might have simply hit the end of the stream. */ + } + } + + 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); /* <-- Never seek backwards. */ + + /* Seeking is always forward which makes things a lot simpler. */ + if (origin == DRFLAC_SEEK_SET) { + if (!drflac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, DRFLAC_SEEK_SET)) { + 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_CUR); + } else if (origin == DRFLAC_SEEK_CUR) { + while (bytesSeeked < offset) { + int bytesRemainingToSeek = offset - bytesSeeked; + DRFLAC_ASSERT(bytesRemainingToSeek >= 0); + + if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) { + bytesSeeked += bytesRemainingToSeek; + (void)bytesSeeked; /* <-- Silence a dead store warning emitted by Clang Static Analyzer. */ + oggbs->bytesRemainingInPage -= bytesRemainingToSeek; + break; + } + + /* If we get here it means some of the requested data is contained in the next pages. */ + 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)) { + /* Failed to go to the next page. We either hit the end of the stream or had a CRC mismatch. */ + return DRFLAC_FALSE; + } + } + } else if (origin == DRFLAC_SEEK_END) { + /* Seeking to the end is not supported. */ + return DRFLAC_FALSE; + } + + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__on_tell_ogg(void* pUserData, drflac_int64* pCursor) +{ + /* + Not implemented for Ogg containers because we don't currently track the byte position of the logical bitstream. To support this, we'll need + to track the position in drflac__on_read_ogg and drflac__on_seek_ogg. + */ + (void)pUserData; + (void)pCursor; + return DRFLAC_FALSE; +} + + +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; /* For recovery. Points to the OggS identifier. */ + + /* First seek to the first frame. */ + 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_SET); + return DRFLAC_FALSE; /* Never did find that sample... */ + } + + runningFrameBytePos = oggbs->currentBytePos - drflac_ogg__get_page_header_size(&oggbs->currentPageHeader) - oggbs->pageDataSize; + if (oggbs->currentPageHeader.granulePosition >= pcmFrameIndex) { + break; /* The sample is somewhere in the previous page. */ + } + + /* + At this point we know the sample is not in the previous page. It could possibly be in this page. For simplicity we + disregard any pages that do not begin a fresh packet. + */ + if ((oggbs->currentPageHeader.headerType & 0x01) == 0) { /* <-- Is it a fresh page? */ + 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) { /* <-- Does the page begin with a frame's sync code? */ + runningGranulePosition = oggbs->currentPageHeader.granulePosition; + } + + continue; + } + } + } + + /* + We found the page that that is closest to the sample, so now we need to find it. The first thing to do is seek to the + start of that page. In the loop above we checked that it was a fresh page which means this page is also the start of + a new frame. This property means that after we've seeked to the page we can immediately start looping over frames until + we find the one containing the target sample. + */ + if (!drflac_oggbs__seek_physical(oggbs, runningFrameBytePos, DRFLAC_SEEK_SET)) { + return DRFLAC_FALSE; + } + if (!drflac_oggbs__goto_next_page(oggbs, drflac_ogg_recover_on_crc_mismatch)) { + return DRFLAC_FALSE; + } + + /* + At this point we'll be sitting on the first byte of the frame header of the first frame in the page. We just keep + looping over these frames until we find the one containing the sample we're after. + */ + runningPCMFrameCount = runningGranulePosition; + for (;;) { + /* + There are two ways to find the sample and seek past irrelevant frames: + 1) Use the native FLAC decoder. + 2) Use Ogg's framing system. + + Both of these options have their own pros and cons. Using the native FLAC decoder is slower because it needs to + do a full decode of the frame. Using Ogg's framing system is faster, but more complicated and involves some code + duplication for the decoding of frame headers. + + Another thing to consider is that using the Ogg framing system will perform direct seeking of the physical Ogg + bitstream. This is important to consider because it means we cannot read data from the drflac_bs object using the + standard drflac__*() APIs because that will read in extra data for its own internal caching which in turn breaks + the positioning of the read pointer of the physical Ogg bitstream. Therefore, anything that would normally be read + using the native FLAC decoding APIs, such as drflac__read_next_flac_frame_header(), need to be re-implemented so as to + avoid the use of the drflac_bs object. + + Considering these issues, I have decided to use the slower native FLAC decoding method for the following reasons: + 1) Seeking is already partially accelerated using Ogg's paging system in the code block above. + 2) Seeking in an Ogg encapsulated FLAC stream is probably quite uncommon. + 3) Simplicity. + */ + 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 we are seeking to the end of the file and we've just hit it, we're done. */ + 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)) { + /* + The sample should be in this FLAC frame. We need to fully decode it, however if it's an invalid frame (a CRC mismatch), we need to pretend + it never existed and keep iterating. + */ + drflac_result result = drflac__decode_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + /* The frame is valid. We just need to skip over some samples to ensure it's sample-exact. */ + drflac_uint64 pcmFramesToDecode = (size_t)(pcmFrameIndex - runningPCMFrameCount); /* <-- Safe cast because the maximum number of samples in a frame is 65535. */ + if (pcmFramesToDecode == 0) { + return DRFLAC_TRUE; + } + + pFlac->currentPCMFrame = runningPCMFrameCount; + + return drflac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode; /* <-- If this fails, something bad has happened (it should never fail). */ + } else { + if (result == DRFLAC_CRC_MISMATCH) { + continue; /* CRC mismatch. Pretend this frame never existed. */ + } else { + return DRFLAC_FALSE; + } + } + } else { + /* + It's not in this frame. We need to seek past the frame, but check if there was a CRC mismatch. If so, we pretend this + frame never existed and leave the running sample count untouched. + */ + drflac_result result = drflac__seek_to_next_flac_frame(pFlac); + if (result == DRFLAC_SUCCESS) { + runningPCMFrameCount += pcmFrameCountInThisFrame; + } else { + if (result == DRFLAC_CRC_MISMATCH) { + continue; /* CRC mismatch. Pretend this frame never existed. */ + } 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; + + /* Pre Condition: The bit stream should be sitting just past the 4-byte OggS capture pattern. */ + (void)relaxed; + + pInit->container = drflac_container_ogg; + pInit->oggFirstBytePos = 0; + + /* + We'll get here if the first 4 bytes of the stream were the OggS capture pattern, however it doesn't necessarily mean the + stream includes FLAC encoded audio. To check for this we need to scan the beginning-of-stream page markers and check if + any match the FLAC specification. Important to keep in mind that the stream may be multiplexed. + */ + 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; + + /* Break if we're past the beginning of stream page. */ + if ((header.headerType & 0x02) == 0) { + return DRFLAC_FALSE; + } + + /* Check if it's a FLAC header. */ + pageBodySize = drflac_ogg__get_page_body_size(&header); + if (pageBodySize == 51) { /* 51 = the lacing value of the FLAC header packet. */ + /* It could be a FLAC page... */ + drflac_uint32 bytesRemainingInPage = pageBodySize; + drflac_uint8 packetType; + + if (onRead(pUserData, &packetType, 1) != 1) { + return DRFLAC_FALSE; + } + + bytesRemainingInPage -= 1; + if (packetType == 0x7F) { + /* Increasingly more likely to be a FLAC page... */ + 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') { + /* Almost certainly a FLAC page... */ + drflac_uint8 mappingVersion[2]; + if (onRead(pUserData, mappingVersion, 2) != 2) { + return DRFLAC_FALSE; + } + + if (mappingVersion[0] != 1) { + return DRFLAC_FALSE; /* Only supporting version 1.x of the Ogg mapping. */ + } + + /* + The next 2 bytes are the non-audio packets, not including this one. We don't care about this because we're going to + be handling it in a generic way based on the serial number and packet types. + */ + if (!onSeek(pUserData, 2, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + + /* Expecting the native FLAC signature "fLaC". */ + if (onRead(pUserData, sig, 4) != 4) { + return DRFLAC_FALSE; + } + + if (sig[0] == 'f' && sig[1] == 'L' && sig[2] == 'a' && sig[3] == 'C') { + /* The remaining data in the page should be the STREAMINFO block. */ + 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; /* Invalid block type. First block must be the STREAMINFO block. */ + } + + if (drflac__read_streaminfo(onRead, pUserData, &streaminfo)) { + /* Success! */ + 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; /* Subtracting 79 will place us right on top of the "OggS" identifier of the FLAC bos page. */ + pInit->oggSerial = header.serialNumber; + pInit->oggBosHeader = header; + break; + } else { + /* Failed to read STREAMINFO block. Aww, so close... */ + return DRFLAC_FALSE; + } + } else { + /* Invalid file. */ + return DRFLAC_FALSE; + } + } else { + /* Not a FLAC header. Skip it. */ + if (!onSeek(pUserData, bytesRemainingInPage, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + } + } else { + /* Not a FLAC header. Seek past the entire page and move on to the next. */ + if (!onSeek(pUserData, bytesRemainingInPage, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + } + } else { + if (!onSeek(pUserData, pageBodySize, DRFLAC_SEEK_CUR)) { + return DRFLAC_FALSE; + } + } + + pInit->runningFilePos += pageBodySize; + + + /* Read the header of the next page. */ + if (drflac_ogg__read_page_header(onRead, pUserData, &header, &bytesRead, &crc32) != DRFLAC_SUCCESS) { + return DRFLAC_FALSE; + } + pInit->runningFilePos += bytesRead; + } + + /* + If we get here it means we found a FLAC audio stream. We should be sitting on the first byte of the header of the next page. The next + packets in the FLAC logical stream contain the metadata. The only thing left to do in the initialization phase for Ogg is to create the + Ogg bistream object. + */ + pInit->hasMetadataBlocks = DRFLAC_TRUE; /* <-- Always have at least VORBIS_COMMENT metadata block. */ + return DRFLAC_TRUE; +} +#endif + +static drflac_bool32 drflac__init_private(drflac_init_info* pInit, drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, 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) { /* <-- onTell is optional. */ + return DRFLAC_FALSE; + } + + DRFLAC_ZERO_MEMORY(pInit, sizeof(*pInit)); + pInit->onRead = onRead; + pInit->onSeek = onSeek; + pInit->onTell = onTell; + pInit->onMeta = onMeta; + pInit->container = container; + pInit->pUserData = pUserData; + pInit->pUserDataMD = pUserDataMD; + + pInit->bs.onRead = onRead; + pInit->bs.onSeek = onSeek; + pInit->bs.onTell = onTell; + pInit->bs.pUserData = pUserData; + drflac__reset_cache(&pInit->bs); + + + /* If the container is explicitly defined then we can try opening in relaxed mode. */ + relaxed = container != drflac_container_unknown; + + /* Skip over any ID3 tags. */ + for (;;) { + if (onRead(pUserData, id, 4) != 4) { + return DRFLAC_FALSE; /* Ran out of data. */ + } + 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; /* Ran out of data. */ + } + 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_CUR)) { + return DRFLAC_FALSE; /* Failed to seek past the tag. */ + } + 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 we get here it means we likely don't have a header. Try opening in relaxed mode, if applicable. */ + 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 + } + + /* Unsupported container. */ + 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_tell_proc onTell, 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* pOggbs = NULL; +#endif + drflac_uint64 firstFramePos; + drflac_uint64 seektablePos; + drflac_uint32 seekpointCount; + drflac_allocation_callbacks allocationCallbacks; + drflac* pFlac; + + /* CPU support first. */ + drflac__init_cpu_caps(); + + if (!drflac__init_private(&init, onRead, onSeek, onTell, onMeta, container, pUserData, pUserDataMD)) { + return NULL; + } + + if (pAllocationCallbacks != NULL) { + allocationCallbacks = *pAllocationCallbacks; + if (allocationCallbacks.onFree == NULL || (allocationCallbacks.onMalloc == NULL && allocationCallbacks.onRealloc == NULL)) { + return NULL; /* Invalid allocation callbacks. */ + } + } else { + allocationCallbacks.pUserData = NULL; + allocationCallbacks.onMalloc = drflac__malloc_default; + allocationCallbacks.onRealloc = drflac__realloc_default; + allocationCallbacks.onFree = drflac__free_default; + } + + + /* + The size of the allocation for the drflac object needs to be large enough to fit the following: + 1) The main members of the drflac structure + 2) A block of memory large enough to store the decoded samples of the largest frame in the stream + 3) If the container is Ogg, a drflac_oggbs object + + The complicated part of the allocation is making sure there's enough room the decoded samples, taking into consideration + the different SIMD instruction sets. + */ + allocationSize = sizeof(drflac); + + /* + The allocation size for decoded frames depends on the number of 32-bit integers that fit inside the largest SIMD vector + we are supporting. + */ + 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; /* Allocate extra bytes to ensure we have enough for alignment. */ + +#ifndef DR_FLAC_NO_OGG + /* There's additional data required for Ogg streams. */ + if (init.container == drflac_container_ogg) { + allocationSize += sizeof(drflac_oggbs); + + pOggbs = (drflac_oggbs*)drflac__malloc_from_callbacks(sizeof(*pOggbs), &allocationCallbacks); + if (pOggbs == NULL) { + return NULL; /*DRFLAC_OUT_OF_MEMORY;*/ + } + + DRFLAC_ZERO_MEMORY(pOggbs, sizeof(*pOggbs)); + pOggbs->onRead = onRead; + pOggbs->onSeek = onSeek; + pOggbs->onTell = onTell; + pOggbs->pUserData = pUserData; + pOggbs->currentBytePos = init.oggFirstBytePos; + pOggbs->firstBytePos = init.oggFirstBytePos; + pOggbs->serialNumber = init.oggSerial; + pOggbs->bosPageHeader = init.oggBosHeader; + pOggbs->bytesRemainingInPage = 0; + } +#endif + + /* + This part is a bit awkward. We need to load the seektable so that it can be referenced in-memory, but I want the drflac object to + consist of only a single heap allocation. To this, the size of the seek table needs to be known, which we determine when reading + and decoding the metadata. + */ + firstFramePos = 42; /* <-- We know we are at byte 42 at this point. */ + seektablePos = 0; + seekpointCount = 0; + if (init.hasMetadataBlocks) { + drflac_read_proc onReadOverride = onRead; + drflac_seek_proc onSeekOverride = onSeek; + drflac_tell_proc onTellOverride = onTell; + void* pUserDataOverride = pUserData; + +#ifndef DR_FLAC_NO_OGG + if (init.container == drflac_container_ogg) { + onReadOverride = drflac__on_read_ogg; + onSeekOverride = drflac__on_seek_ogg; + onTellOverride = drflac__on_tell_ogg; + pUserDataOverride = (void*)pOggbs; + } +#endif + + if (!drflac__read_and_decode_metadata(onReadOverride, onSeekOverride, onTellOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seekpointCount, &allocationCallbacks)) { + #ifndef DR_FLAC_NO_OGG + drflac__free_from_callbacks(pOggbs, &allocationCallbacks); + #endif + return NULL; + } + + if ((0xFFFFFFFF - (seekpointCount * sizeof(drflac_seekpoint))) < allocationSize) { + #ifndef DR_FLAC_NO_OGG + drflac__free_from_callbacks(pOggbs, &allocationCallbacks); + #endif + return NULL; + } + + allocationSize += seekpointCount * sizeof(drflac_seekpoint); + } + + pFlac = (drflac*)drflac__malloc_from_callbacks((size_t)allocationSize, &allocationCallbacks); + if (pFlac == NULL) { + #ifndef DR_FLAC_NO_OGG + drflac__free_from_callbacks(pOggbs, &allocationCallbacks); + #endif + 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 + (seekpointCount * sizeof(drflac_seekpoint))); + DRFLAC_COPY_MEMORY(pInternalOggbs, pOggbs, sizeof(*pOggbs)); + + /* At this point the pOggbs object has been handed over to pInternalOggbs and can be freed. */ + drflac__free_from_callbacks(pOggbs, &allocationCallbacks); + pOggbs = NULL; + + /* The Ogg bistream needs to be layered on top of the original bitstream. */ + pFlac->bs.onRead = drflac__on_read_ogg; + pFlac->bs.onSeek = drflac__on_seek_ogg; + pFlac->bs.onTell = drflac__on_tell_ogg; + pFlac->bs.pUserData = (void*)pInternalOggbs; + pFlac->_oggbs = (void*)pInternalOggbs; + } +#endif + + pFlac->firstFLACFramePosInBytes = firstFramePos; + + /* NOTE: Seektables are not currently compatible with Ogg encapsulation (Ogg has its own accelerated seeking system). I may change this later, so I'm leaving this here for now. */ +#ifndef DR_FLAC_NO_OGG + if (init.container == drflac_container_ogg) + { + pFlac->pSeekpoints = NULL; + pFlac->seekpointCount = 0; + } + else +#endif + { + /* If we have a seektable we need to load it now, making sure we move back to where we were previously. */ + if (seektablePos != 0) { + pFlac->seekpointCount = seekpointCount; + pFlac->pSeekpoints = (drflac_seekpoint*)((drflac_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize); + + DRFLAC_ASSERT(pFlac->bs.onSeek != NULL); + DRFLAC_ASSERT(pFlac->bs.onRead != NULL); + + /* Seek to the seektable, then just read directly into our seektable buffer. */ + if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, DRFLAC_SEEK_SET)) { + drflac_uint32 iSeekpoint; + + for (iSeekpoint = 0; iSeekpoint < seekpointCount; iSeekpoint += 1) { + if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints + iSeekpoint, DRFLAC_SEEKPOINT_SIZE_IN_BYTES) == DRFLAC_SEEKPOINT_SIZE_IN_BYTES) { + /* Endian swap. */ + 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 { + /* Failed to read the seektable. Pretend we don't have one. */ + pFlac->pSeekpoints = NULL; + pFlac->seekpointCount = 0; + break; + } + } + + /* We need to seek back to where we were. If this fails it's a critical error. */ + if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFLACFramePosInBytes, DRFLAC_SEEK_SET)) { + drflac__free_from_callbacks(pFlac, &allocationCallbacks); + return NULL; + } + } else { + /* Failed to seek to the seektable. Ominous sign, but for now we can just pretend we don't have one. */ + pFlac->pSeekpoints = NULL; + pFlac->seekpointCount = 0; + } + } + } + + + /* + If we get here, but don't have a STREAMINFO block, it means we've opened the stream in relaxed mode and need to decode + the first frame. + */ + 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 +#ifndef DR_FLAC_NO_WCHAR +#include /* For wcslen(), wcsrtombs() */ +#endif + +/* Errno */ +/* drflac_result_from_errno() is only used for fopen() and wfopen() so putting it inside DR_WAV_NO_STDIO for now. If something else needs this later we can move it out. */ +#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 + #if defined(ENOTEMPTY) && ENOTEMPTY != EEXIST /* In AIX, ENOTEMPTY and EEXIST use the same value. */ + 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; + } +} +/* End Errno */ + +/* fopen */ +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; /* Safety. */ + } + + 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; /* Just a safety check to make sure we never ever return success when pFile == NULL. */ + } + + return result; + } +#endif + + return DRFLAC_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 DRFLAC_HAS_WFOPEN + #endif +#endif + +#ifndef DR_FLAC_NO_WCHAR +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; /* Safety. */ + } + + if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) { + return DRFLAC_INVALID_ARGS; + } + +#if defined(DRFLAC_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 drflac_result_from_errno(err); + } + #else + *ppFile = _wfopen(pFilePath, pOpenMode); + if (*ppFile == NULL) { + return drflac_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. + */ + + /* + Some compilers don't support wchar_t or wcsrtombs() which we're using below. In this case we just + need to abort with an error. If you encounter a compiler lacking such support, add it to this list + and submit a bug report and it'll be added to the library upstream. + */ + #if defined(__DJGPP__) + { + /* Nothing to do here. This will fall through to the error check below. */ + } + #else + { + mbstate_t mbs; + size_t lenMB; + const wchar_t* pFilePathTemp = pFilePath; + char* pFilePathMB = NULL; + char pOpenModeMB[32] = {0}; + + /* Get the length first. */ + 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); + + /* 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); + + drflac__free_from_callbacks(pFilePathMB, pAllocationCallbacks); + } + #endif + + if (*ppFile == NULL) { + return DRFLAC_ERROR; + } +#endif + + return DRFLAC_SUCCESS; +} +#endif +/* End fopen */ + +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) +{ + int whence = SEEK_SET; + if (origin == DRFLAC_SEEK_CUR) { + whence = SEEK_CUR; + } else if (origin == DRFLAC_SEEK_END) { + whence = SEEK_END; + } + + return fseek((FILE*)pUserData, offset, whence) == 0; +} + +static drflac_bool32 drflac__on_tell_stdio(void* pUserData, drflac_int64* pCursor) +{ + FILE* pFileStdio = (FILE*)pUserData; + drflac_int64 result; + + /* These were all validated at a higher level. */ + DRFLAC_ASSERT(pFileStdio != NULL); + DRFLAC_ASSERT(pCursor != NULL); + +#if defined(_WIN32) && !defined(NXDK) + #if defined(_MSC_VER) && _MSC_VER > 1200 + result = _ftelli64(pFileStdio); + #else + result = ftell(pFileStdio); + #endif +#else + result = ftell(pFileStdio); +#endif + + *pCursor = result; + + return DRFLAC_TRUE; +} + + + +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, drflac__on_tell_stdio, (void*)pFile, pAllocationCallbacks); + if (pFlac == NULL) { + fclose(pFile); + return NULL; + } + + return pFlac; +} + +#ifndef DR_FLAC_NO_WCHAR +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, drflac__on_tell_stdio, (void*)pFile, pAllocationCallbacks); + if (pFlac == NULL) { + fclose(pFile); + return NULL; + } + + return pFlac; +} +#endif + +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, drflac__on_tell_stdio, onMeta, drflac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); + if (pFlac == NULL) { + fclose(pFile); + return pFlac; + } + + return pFlac; +} + +#ifndef DR_FLAC_NO_WCHAR +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, drflac__on_tell_stdio, onMeta, drflac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks); + if (pFlac == NULL) { + fclose(pFile); + return pFlac; + } + + return pFlac; +} +#endif +#endif /* DR_FLAC_NO_STDIO */ + +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_int64 newCursor; + + DRFLAC_ASSERT(memoryStream != NULL); + + if (origin == DRFLAC_SEEK_SET) { + newCursor = 0; + } else if (origin == DRFLAC_SEEK_CUR) { + newCursor = (drflac_int64)memoryStream->currentReadPos; + } else if (origin == DRFLAC_SEEK_END) { + newCursor = (drflac_int64)memoryStream->dataSize; + } else { + DRFLAC_ASSERT(!"Invalid seek origin"); + return DRFLAC_FALSE; + } + + newCursor += offset; + + if (newCursor < 0) { + return DRFLAC_FALSE; /* Trying to seek prior to the start of the buffer. */ + } + if ((size_t)newCursor > memoryStream->dataSize) { + return DRFLAC_FALSE; /* Trying to seek beyond the end of the buffer. */ + } + + memoryStream->currentReadPos = (size_t)newCursor; + + return DRFLAC_TRUE; +} + +static drflac_bool32 drflac__on_tell_memory(void* pUserData, drflac_int64* pCursor) +{ + drflac__memory_stream* memoryStream = (drflac__memory_stream*)pUserData; + + DRFLAC_ASSERT(memoryStream != NULL); + DRFLAC_ASSERT(pCursor != NULL); + + *pCursor = (drflac_int64)memoryStream->currentReadPos; + 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, drflac__on_tell_memory, &memoryStream, pAllocationCallbacks); + if (pFlac == NULL) { + return NULL; + } + + pFlac->memoryStream = memoryStream; + + /* This is an awful hack... */ +#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, drflac__on_tell_memory, onMeta, drflac_container_unknown, &memoryStream, pUserData, pAllocationCallbacks); + if (pFlac == NULL) { + return NULL; + } + + pFlac->memoryStream = memoryStream; + + /* This is an awful hack... */ +#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, drflac_tell_proc onTell, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) +{ + return drflac_open_with_metadata_private(onRead, onSeek, onTell, NULL, drflac_container_unknown, pUserData, pUserData, pAllocationCallbacks); +} +DRFLAC_API drflac* drflac_open_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) +{ + return drflac_open_with_metadata_private(onRead, onSeek, onTell, NULL, container, pUserData, pUserData, pAllocationCallbacks); +} + +DRFLAC_API drflac* drflac_open_with_metadata(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, drflac_meta_proc onMeta, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) +{ + return drflac_open_with_metadata_private(onRead, onSeek, onTell, onMeta, drflac_container_unknown, pUserData, pUserData, pAllocationCallbacks); +} +DRFLAC_API drflac* drflac_open_with_metadata_relaxed(drflac_read_proc onRead, drflac_seek_proc onSeek, drflac_tell_proc onTell, drflac_meta_proc onMeta, drflac_container container, void* pUserData, const drflac_allocation_callbacks* pAllocationCallbacks) +{ + return drflac_open_with_metadata_private(onRead, onSeek, onTell, onMeta, container, pUserData, pUserData, pAllocationCallbacks); +} + +DRFLAC_API void drflac_close(drflac* pFlac) +{ + if (pFlac == NULL) { + return; + } + +#ifndef DR_FLAC_NO_STDIO + /* + If we opened the file with drflac_open_file() we will want to close the file handle. We can know whether or not drflac_open_file() + was used by looking at the callbacks. + */ + if (pFlac->bs.onRead == drflac__on_read_stdio) { + fclose((FILE*)pFlac->bs.pUserData); + } + +#ifndef DR_FLAC_NO_OGG + /* Need to clean up Ogg streams a bit differently due to the way the bit streaming is chained. */ + 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 + { + /* Scalar fallback. */ +#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 + { + /* Scalar fallback. */ +#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; /* wbps = Wasted Bits Per Sample */ + int32x4_t wbpsShift1_4; /* wbps = Wasted Bits Per Sample */ + 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 + { + /* Scalar fallback. */ +#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 + { + /* Scalar fallback. */ +#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 + } +} + + +static drflac_bool32 drflac__is_current_flac_frame_valid(drflac* pFlac) +{ + drflac_uint32 iChannel; + + if (pFlac->currentFLACFrame.header.blockSizeInPCMFrames > pFlac->maxBlockSizeInPCMFrames || pFlac->currentFLACFrame.pcmFramesRemaining > pFlac->currentFLACFrame.header.blockSizeInPCMFrames) { + return DRFLAC_FALSE; + } + + for (iChannel = 0; iChannel < pFlac->channels; iChannel += 1) { + if (pFlac->currentFLACFrame.subframes[iChannel].pSamplesS32 == NULL) { + return DRFLAC_FALSE; + } + } + + return DRFLAC_TRUE; +} + +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 we've run out of samples in this frame, go to the next. */ + if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) { + if (!drflac__read_and_decode_next_flac_frame(pFlac)) { + break; /* Couldn't read the next frame, so just break from the loop and return. */ + } + } 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 { + /* Generic interleaving. */ + 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 + { + /* Scalar fallback. */ +#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 + { + /* Scalar fallback. */ +#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; /* wbps = Wasted Bits Per Sample */ + int32x4_t wbpsShift1_4; /* wbps = Wasted Bits Per Sample */ + + 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 + { + /* Scalar fallback. */ +#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); + + /* At this point we have results. We can now pack and interleave these into a single __m128i object and then store the in the output buffer. */ + _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 + { + /* Scalar fallback. */ +#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 we've run out of samples in this frame, go to the next. */ + if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) { + if (!drflac__read_and_decode_next_flac_frame(pFlac)) { + break; /* Couldn't read the next frame, so just break from the loop and return. */ + } + } 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 { + /* Generic interleaving. */ + 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 + { + /* Scalar fallback. */ +#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 + { + /* Scalar fallback. */ +#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; /* Wasted Bits Per Sample */ + int32x4_t wbps1_4; /* Wasted Bits Per Sample */ + + 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 + { + /* Scalar fallback. */ +#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 + { + /* Scalar fallback. */ +#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 we've run out of samples in this frame, go to the next. */ + if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) { + if (!drflac__read_and_decode_next_flac_frame(pFlac)) { + break; /* Couldn't read the next frame, so just break from the loop and return. */ + } + } 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 { + /* Generic interleaving. */ + 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; + } + + /* Don't do anything if we're already on the seek point. */ + if (pFlac->currentPCMFrame == pcmFrameIndex) { + return DRFLAC_TRUE; + } + + /* + If we don't know where the first frame begins then we can't seek. This will happen when the STREAMINFO block was not present + when the decoder was opened. + */ + 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; + + /* Clamp the sample to the end. */ + if (pcmFrameIndex > pFlac->totalPCMFrameCount) { + pcmFrameIndex = pFlac->totalPCMFrameCount; + } + + /* If the target sample and the current sample are in the same frame we just move the position forward. */ + if (drflac__is_current_flac_frame_valid(pFlac)) { + if (pcmFrameIndex > pFlac->currentPCMFrame) { + /* Forward. */ + drflac_uint32 offset = (drflac_uint32)(pcmFrameIndex - pFlac->currentPCMFrame); + if (pFlac->currentFLACFrame.pcmFramesRemaining > offset) { + pFlac->currentFLACFrame.pcmFramesRemaining -= offset; + pFlac->currentPCMFrame = pcmFrameIndex; + return DRFLAC_TRUE; + } + } else { + /* Backward. */ + 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; + } + } + } + + /* + Different techniques depending on encapsulation. Using the native FLAC seektable with Ogg encapsulation is a bit awkward so + we'll instead use Ogg's natural seeking facility. + */ +#ifndef DR_FLAC_NO_OGG + if (pFlac->container == drflac_container_ogg) + { + wasSuccessful = drflac_ogg__seek_to_pcm_frame(pFlac, pcmFrameIndex); + } + else +#endif + { + /* First try seeking via the seek table. If this fails, fall back to a brute force seek which is much slower. */ + if (/*!wasSuccessful && */!pFlac->_noSeekTableSeek) { + wasSuccessful = drflac__seek_to_pcm_frame__seek_table(pFlac, pcmFrameIndex); + } + +#if !defined(DR_FLAC_NO_CRC) + /* Fall back to binary search if seek table seeking fails. This requires the length of the stream to be known. */ + if (!wasSuccessful && !pFlac->_noBinarySearchSeek && pFlac->totalPCMFrameCount > 0) { + wasSuccessful = drflac__seek_to_pcm_frame__binary_search(pFlac, pcmFrameIndex); + } +#endif + + /* Fall back to brute force if all else fails. */ + if (!wasSuccessful && !pFlac->_noBruteForceSeek) { + wasSuccessful = drflac__seek_to_pcm_frame__brute_force(pFlac, pcmFrameIndex); + } + } + + if (wasSuccessful) { + pFlac->currentPCMFrame = pcmFrameIndex; + } else { + /* Seek failed. Try putting the decoder back to it's original state. */ + if (drflac_seek_to_pcm_frame(pFlac, originalPCMFrame) == DRFLAC_FALSE) { + /* Failed to seek back to the original PCM frame. Fall back to 0. */ + drflac_seek_to_pcm_frame(pFlac, 0); + } + } + + return wasSuccessful; + } +} + + + +/* High Level APIs */ + +/* SIZE_MAX */ +#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 +/* End SIZE_MAX */ + + +/* Using a macro as the definition of the drflac__full_decode_and_close_*() API family. Sue me. */ +#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; \ + type buffer[4096]; \ + drflac_uint64 pcmFramesRead; \ + size_t sampleDataBufferSize = sizeof(buffer); \ + \ + DRFLAC_ASSERT(pFlac != NULL); \ + \ + totalPCMFrameCount = 0; \ + \ + 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; \ + } \ + \ + /* At this point everything should be decoded, but we just want to fill the unused part buffer with silence - need to \ + protect those ears from random noise! */ \ + DRFLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type))); \ + \ + 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, drflac_tell_proc onTell, 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, onTell, 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, drflac_tell_proc onTell, 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, onTell, 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, drflac_tell_proc onTell, 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, onTell, 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; + + /* Safety. */ + 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 */ +#endif /* DR_FLAC_IMPLEMENTATION */ + + +/* +REVISION HISTORY +================ +v0.13.4 - TBD + - Add a bounds check when allocating memory during metadata processing. + - Fix a possible overflow error when parsing picture metadata. + - Fix an error with seek point parsing. + - Fix a possible deadlock when seeking. + - Fix an error where the decoder can be put into a bad state when seeking fails which then results in a crash when reading and seeking. + +v0.13.3 - 2026-01-17 + - Fix a compiler compatibility issue with some inlined assembly. + - Fix a compilation warning. + +v0.13.2 - 2025-12-02 + - Improve robustness of the parsing of picture metadata to improve support for memory constrained embedded devices. + - Fix a warning about an assigned by unused variable. + - Improvements to drflac_open_and_read_pcm_frames_*() and family to avoid excessively large memory allocations from malformed files. + +v0.13.1 - 2025-09-10 + - Fix an error with the NXDK build. + +v0.13.0 - 2025-07-23 + - API CHANGE: Seek origin enums have been renamed to match the naming convention used by other dr_libs libraries: + - drflac_seek_origin_start -> DRFLAC_SEEK_SET + - drflac_seek_origin_current -> DRFLAC_SEEK_CUR + - DRFLAC_SEEK_END (new) + - API CHANGE: A new seek origin has been added to allow seeking from the end of the file. If you implement your own `onSeek` callback, you should now detect and handle `DRFLAC_SEEK_END`. If seeking to the end is not supported, return `DRFLAC_FALSE`. If you only use `*_open_file()` or `*_open_memory()`, you need not change anything. + - API CHANGE: An `onTell` callback has been added to the following functions: + - drflac_open() + - drflac_open_relaxed() + - drflac_open_with_metadata() + - drflac_open_with_metadata_relaxed() + - drflac_open_and_read_pcm_frames_s32() + - drflac_open_and_read_pcm_frames_s16() + - drflac_open_and_read_pcm_frames_f32() + - Fix compilation for AIX OS. + +v0.12.43 - 2024-12-17 + - Fix a possible buffer overflow during decoding. + - Improve detection of ARM64EC + +v0.12.42 - 2023-11-02 + - Fix build for ARMv6-M. + - Fix a compilation warning with GCC. + +v0.12.41 - 2023-06-17 + - Fix an incorrect date in revision history. No functional change. + +v0.12.40 - 2023-05-22 + - Minor code restructure. No functional change. + +v0.12.39 - 2022-09-17 + - Fix compilation with DJGPP. + - Fix compilation error with Visual Studio 2019 and the ARM build. + - Fix an error with SSE 4.1 detection. + - Add support for disabling wchar_t with DR_WAV_NO_WCHAR. + - Improve compatibility with compilers which lack support for explicit struct packing. + - Improve compatibility with low-end and embedded hardware by reducing the amount of stack + allocation when loading an Ogg encapsulated file. + +v0.12.38 - 2022-04-10 + - Fix compilation error on older versions of GCC. + +v0.12.37 - 2022-02-12 + - Improve ARM detection. + +v0.12.36 - 2022-02-07 + - Fix a compilation error with the ARM build. + +v0.12.35 - 2022-02-06 + - Fix a bug due to underestimating the amount of precision required for the prediction stage. + - Fix some bugs found from fuzz testing. + +v0.12.34 - 2022-01-07 + - Fix some misalignment bugs when reading metadata. + +v0.12.33 - 2021-12-22 + - Fix a bug with seeking when the seek table does not start at PCM frame 0. + +v0.12.32 - 2021-12-11 + - Fix a warning with Clang. + +v0.12.31 - 2021-08-16 + - Silence some warnings. + +v0.12.30 - 2021-07-31 + - Fix platform detection for ARM64. + +v0.12.29 - 2021-04-02 + - Fix a bug where the running PCM frame index is set to an invalid value when over-seeking. + - Fix a decoding error due to an incorrect validation check. + +v0.12.28 - 2021-02-21 + - Fix a warning due to referencing _MSC_VER when it is undefined. + +v0.12.27 - 2021-01-31 + - Fix a static analysis warning. + +v0.12.26 - 2021-01-17 + - Fix a compilation warning due to _BSD_SOURCE being deprecated. + +v0.12.25 - 2020-12-26 + - Update documentation. + +v0.12.24 - 2020-11-29 + - Fix ARM64/NEON detection when compiling with MSVC. + +v0.12.23 - 2020-11-21 + - Fix compilation with OpenWatcom. + +v0.12.22 - 2020-11-01 + - Fix an error with the previous release. + +v0.12.21 - 2020-11-01 + - Fix a possible deadlock when seeking. + - Improve compiler support for older versions of GCC. + +v0.12.20 - 2020-09-08 + - Fix a compilation error on older compilers. + +v0.12.19 - 2020-08-30 + - Fix a bug due to an undefined 32-bit shift. + +v0.12.18 - 2020-08-14 + - Fix a crash when compiling with clang-cl. + +v0.12.17 - 2020-08-02 + - Simplify sized types. + +v0.12.16 - 2020-07-25 + - Fix a compilation warning. + +v0.12.15 - 2020-07-06 + - Check for negative LPC shifts and return an error. + +v0.12.14 - 2020-06-23 + - Add include guard for the implementation section. + +v0.12.13 - 2020-05-16 + - Add compile-time and run-time version querying. + - DRFLAC_VERSION_MINOR + - DRFLAC_VERSION_MAJOR + - DRFLAC_VERSION_REVISION + - DRFLAC_VERSION_STRING + - drflac_version() + - drflac_version_string() + +v0.12.12 - 2020-04-30 + - Fix compilation errors with VC6. + +v0.12.11 - 2020-04-19 + - Fix some pedantic warnings. + - Fix some undefined behaviour warnings. + +v0.12.10 - 2020-04-10 + - Fix some bugs when trying to seek with an invalid seek table. + +v0.12.9 - 2020-04-05 + - Fix warnings. + +v0.12.8 - 2020-04-04 + - Add drflac_open_file_w() and drflac_open_file_with_metadata_w(). + - Fix some static analysis warnings. + - Minor documentation updates. + +v0.12.7 - 2020-03-14 + - Fix compilation errors with VC6. + +v0.12.6 - 2020-03-07 + - Fix compilation error with Visual Studio .NET 2003. + +v0.12.5 - 2020-01-30 + - Silence some static analysis warnings. + +v0.12.4 - 2020-01-29 + - Silence some static analysis warnings. + +v0.12.3 - 2019-12-02 + - Fix some warnings when compiling with GCC and the -Og flag. + - Fix a crash in out-of-memory situations. + - Fix potential integer overflow bug. + - Fix some static analysis warnings. + - Fix a possible crash when using custom memory allocators without a custom realloc() implementation. + - Fix a bug with binary search seeking where the bits per sample is not a multiple of 8. + +v0.12.2 - 2019-10-07 + - Internal code clean up. + +v0.12.1 - 2019-09-29 + - Fix some Clang Static Analyzer warnings. + - Fix an unused variable warning. + +v0.12.0 - 2019-09-23 + - API CHANGE: Add support for user defined memory allocation routines. This system allows the program to specify their own memory allocation + routines with a user data pointer for client-specific contextual data. This adds an extra parameter to the end of the following APIs: + - drflac_open() + - drflac_open_relaxed() + - drflac_open_with_metadata() + - drflac_open_with_metadata_relaxed() + - drflac_open_file() + - drflac_open_file_with_metadata() + - drflac_open_memory() + - drflac_open_memory_with_metadata() + - drflac_open_and_read_pcm_frames_s32() + - drflac_open_and_read_pcm_frames_s16() + - drflac_open_and_read_pcm_frames_f32() + - drflac_open_file_and_read_pcm_frames_s32() + - drflac_open_file_and_read_pcm_frames_s16() + - drflac_open_file_and_read_pcm_frames_f32() + - drflac_open_memory_and_read_pcm_frames_s32() + - drflac_open_memory_and_read_pcm_frames_s16() + - drflac_open_memory_and_read_pcm_frames_f32() + Set this extra parameter to NULL to use defaults which is the same as the previous behaviour. Setting this NULL will use + DRFLAC_MALLOC, DRFLAC_REALLOC and DRFLAC_FREE. + - Remove deprecated APIs: + - drflac_read_s32() + - drflac_read_s16() + - drflac_read_f32() + - drflac_seek_to_sample() + - drflac_open_and_decode_s32() + - drflac_open_and_decode_s16() + - drflac_open_and_decode_f32() + - drflac_open_and_decode_file_s32() + - drflac_open_and_decode_file_s16() + - drflac_open_and_decode_file_f32() + - drflac_open_and_decode_memory_s32() + - drflac_open_and_decode_memory_s16() + - drflac_open_and_decode_memory_f32() + - Remove drflac.totalSampleCount which is now replaced with drflac.totalPCMFrameCount. You can emulate drflac.totalSampleCount + by doing pFlac->totalPCMFrameCount*pFlac->channels. + - Rename drflac.currentFrame to drflac.currentFLACFrame to remove ambiguity with PCM frames. + - Fix errors when seeking to the end of a stream. + - Optimizations to seeking. + - SSE improvements and optimizations. + - ARM NEON optimizations. + - Optimizations to drflac_read_pcm_frames_s16(). + - Optimizations to drflac_read_pcm_frames_s32(). + +v0.11.10 - 2019-06-26 + - Fix a compiler error. + +v0.11.9 - 2019-06-16 + - Silence some ThreadSanitizer warnings. + +v0.11.8 - 2019-05-21 + - Fix warnings. + +v0.11.7 - 2019-05-06 + - C89 fixes. + +v0.11.6 - 2019-05-05 + - Add support for C89. + - Fix a compiler warning when CRC is disabled. + - Change license to choice of public domain or MIT-0. + +v0.11.5 - 2019-04-19 + - Fix a compiler error with GCC. + +v0.11.4 - 2019-04-17 + - Fix some warnings with GCC when compiling with -std=c99. + +v0.11.3 - 2019-04-07 + - Silence warnings with GCC. + +v0.11.2 - 2019-03-10 + - Fix a warning. + +v0.11.1 - 2019-02-17 + - Fix a potential bug with seeking. + +v0.11.0 - 2018-12-16 + - API CHANGE: Deprecated drflac_read_s32(), drflac_read_s16() and drflac_read_f32() and replaced them with + drflac_read_pcm_frames_s32(), drflac_read_pcm_frames_s16() and drflac_read_pcm_frames_f32(). The new APIs take + and return PCM frame counts instead of sample counts. To upgrade you will need to change the input count by + dividing it by the channel count, and then do the same with the return value. + - API_CHANGE: Deprecated drflac_seek_to_sample() and replaced with drflac_seek_to_pcm_frame(). Same rules as + the changes to drflac_read_*() apply. + - API CHANGE: Deprecated drflac_open_and_decode_*() and replaced with drflac_open_*_and_read_*(). Same rules as + the changes to drflac_read_*() apply. + - Optimizations. + +v0.10.0 - 2018-09-11 + - Remove the DR_FLAC_NO_WIN32_IO option and the Win32 file IO functionality. If you need to use Win32 file IO you + need to do it yourself via the callback API. + - Fix the clang build. + - Fix undefined behavior. + - Fix errors with CUESHEET metdata blocks. + - Add an API for iterating over each cuesheet track in the CUESHEET metadata block. This works the same way as the + Vorbis comment API. + - Other miscellaneous bug fixes, mostly relating to invalid FLAC streams. + - Minor optimizations. + +v0.9.11 - 2018-08-29 + - Fix a bug with sample reconstruction. + +v0.9.10 - 2018-08-07 + - Improve 64-bit detection. + +v0.9.9 - 2018-08-05 + - Fix C++ build on older versions of GCC. + +v0.9.8 - 2018-07-24 + - Fix compilation errors. + +v0.9.7 - 2018-07-05 + - Fix a warning. + +v0.9.6 - 2018-06-29 + - Fix some typos. + +v0.9.5 - 2018-06-23 + - Fix some warnings. + +v0.9.4 - 2018-06-14 + - Optimizations to seeking. + - Clean up. + +v0.9.3 - 2018-05-22 + - Bug fix. + +v0.9.2 - 2018-05-12 + - Fix a compilation error due to a missing break statement. + +v0.9.1 - 2018-04-29 + - Fix compilation error with Clang. + +v0.9 - 2018-04-24 + - Fix Clang build. + - Start using major.minor.revision versioning. + +v0.8g - 2018-04-19 + - Fix build on non-x86/x64 architectures. + +v0.8f - 2018-02-02 + - Stop pretending to support changing rate/channels mid stream. + +v0.8e - 2018-02-01 + - Fix a crash when the block size of a frame is larger than the maximum block size defined by the FLAC stream. + - Fix a crash the the Rice partition order is invalid. + +v0.8d - 2017-09-22 + - Add support for decoding streams with ID3 tags. ID3 tags are just skipped. + +v0.8c - 2017-09-07 + - Fix warning on non-x86/x64 architectures. + +v0.8b - 2017-08-19 + - Fix build on non-x86/x64 architectures. + +v0.8a - 2017-08-13 + - A small optimization for the Clang build. + +v0.8 - 2017-08-12 + - API CHANGE: Rename dr_* types to drflac_*. + - Optimizations. This brings dr_flac back to about the same class of efficiency as the reference implementation. + - Add support for custom implementations of malloc(), realloc(), etc. + - Add CRC checking to Ogg encapsulated streams. + - Fix VC++ 6 build. This is only for the C++ compiler. The C compiler is not currently supported. + - Bug fixes. + +v0.7 - 2017-07-23 + - Add support for opening a stream without a header block. To do this, use drflac_open_relaxed() / drflac_open_with_metadata_relaxed(). + +v0.6 - 2017-07-22 + - Add support for recovering from invalid frames. With this change, dr_flac will simply skip over invalid frames as if they + never existed. Frames are checked against their sync code, the CRC-8 of the frame header and the CRC-16 of the whole frame. + +v0.5 - 2017-07-16 + - Fix typos. + - Change drflac_bool* types to unsigned. + - Add CRC checking. This makes dr_flac slower, but can be disabled with #define DR_FLAC_NO_CRC. + +v0.4f - 2017-03-10 + - Fix a couple of bugs with the bitstreaming code. + +v0.4e - 2017-02-17 + - Fix some warnings. + +v0.4d - 2016-12-26 + - Add support for 32-bit floating-point PCM decoding. + - Use drflac_int* and drflac_uint* sized types to improve compiler support. + - Minor improvements to documentation. + +v0.4c - 2016-12-26 + - Add support for signed 16-bit integer PCM decoding. + +v0.4b - 2016-10-23 + - A minor change to drflac_bool8 and drflac_bool32 types. + +v0.4a - 2016-10-11 + - Rename drBool32 to drflac_bool32 for styling consistency. + +v0.4 - 2016-09-29 + - API/ABI CHANGE: Use fixed size 32-bit booleans instead of the built-in bool type. + - API CHANGE: Rename drflac_open_and_decode*() to drflac_open_and_decode*_s32(). + - API CHANGE: Swap the order of "channels" and "sampleRate" parameters in drflac_open_and_decode*(). Rationale for this is to + keep it consistent with drflac_audio. + +v0.3f - 2016-09-21 + - Fix a warning with GCC. + +v0.3e - 2016-09-18 + - Fixed a bug where GCC 4.3+ was not getting properly identified. + - Fixed a few typos. + - Changed date formats to ISO 8601 (YYYY-MM-DD). + +v0.3d - 2016-06-11 + - Minor clean up. + +v0.3c - 2016-05-28 + - Fixed compilation error. + +v0.3b - 2016-05-16 + - Fixed Linux/GCC build. + - Updated documentation. + +v0.3a - 2016-05-15 + - Minor fixes to documentation. + +v0.3 - 2016-05-11 + - Optimizations. Now at about parity with the reference implementation on 32-bit builds. + - Lots of clean up. + +v0.2b - 2016-05-10 + - Bug fixes. + +v0.2a - 2016-05-10 + - Made drflac_open_and_decode() more robust. + - Removed an unused debugging variable + +v0.2 - 2016-05-09 + - Added support for Ogg encapsulation. + - API CHANGE. Have the onSeek callback take a third argument which specifies whether or not the seek + should be relative to the start or the current position. Also changes the seeking rules such that + seeking offsets will never be negative. + - Have drflac_open_and_decode() fail gracefully if the stream has an unknown total sample count. + +v0.1b - 2016-05-07 + - Properly close the file handle in drflac_open_file() and family when the decoder fails to initialize. + - Removed a stale comment. + +v0.1a - 2016-05-05 + - Minor formatting changes. + - Fixed a warning on the GCC build. + +v0.1 - 2016-05-03 + - Initial versioned release. +*/ + +/* +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 2023 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. +*/

F{snb_9d*oYs*gMo4dFd!L3dS9p;kJV@Ws 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�LgY1| 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 delta 321969 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