拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PCSX2 中 libcubeb 的跨平台构建指南:从 CMake 配置到 Windows/MinGW 实战

PCSX2 中 libcubeb 的跨平台构建指南从 CMake 配置到 Windows/MinGW 实战【免费下载链接】pcsx2PCSX2 - The Playstation 2 Emulator项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2libcubeb 是 PCSX2 依赖的跨平台音频 I/O 库负责 PlayStation 2 模拟器中音频流的播放、设备枚举与低延迟回调见 CubebAudioStream.cpp。本文以官方构建说明 3rdparty/cubeb/INSTALL.md 为骨架结合本仓库中 cubeb 的 CMake 源码与 PCSX2 集成代码完整讲解其编译步骤、Windows 平台三种构建路径以及背后后端自动检测机制读完后你可以在任何支持 CMake 的环境下独立构建 cubeb 并理解它与 PCSX2 的衔接方式。环境要求与总体构建流程构建 libcubeb 的前置条件只有一个硬性要求必须安装 CMake v3.14 或更高版本这与仓库根 3rdparty/cubeb/CMakeLists.txt 中cmake_minimum_required(VERSION 3.14 FATAL_ERROR)的声明完全一致。标准构建分五步全部在命令行完成# 1. 克隆仓库含子模块 git clone --recursive https://github.com/mozilla/cubeb.git # 2. 进入源码目录 cd cubeb # 3. 配置构建目录-B 指定构建目录为 ./build cmake -B ./build . # 4. 编译 cmake --build ./build # 5. 运行测试 cd build ctest在 PCSX2 仓库中cubeb 以第三方源码形式内嵌于 3rdparty/cubeb 目录并直接通过 PCSX2 的顶层构建系统链接进模拟器在 pcsx2/CMakeLists.txt 中可以看到cubeb被列为PCSX2_FLAGS的链接目标之一。因此实际使用中你通常不需要单独克隆 cubeb构建 PCSX2 时它会被一并编译。构建配置说明步骤 3 中的cmake -B ./build .采用 CMake 的 out-of-source 构建方式所有中间产物隔离在./build目录不会污染源码树步骤 5 的ctest会在构建目录下自动发现并运行测试用例。仓库中 cubeb 自带subprojects/speex重采样器见 CMakeLists.txt测试会覆盖核心音频路径默认构建类型在未显式指定时会被强制设为RelWithDebInfoCMake 同时启用 C99 与 C17 标准、开启-Wall -WextraMSVC 下为 warning level 4并在 Windows 上关闭 RTTI 与异常支持见 CMakeLists.txt这些都是对音频实时回调代码的必要约束。Windows 平台构建说明Windows 下有三种受支持的构建方式Microsoft Visual Studio 2015、Microsoft Visual Studio 2017或 MinGW-w64Win32 threads。选择哪种生成器取决于你在cmake -G参数中指定的配置。方式一Visual Studio 2015/2017 命令行这是最直接的路径——在 Developer Command Prompt 中按上文五步执行即可。CMake 会根据当前环境自动选择一个默认生成器也可以显式指定cmake -G Visual Studio 15 2017 -B ./build . cmake --build ./build-G不传时CMake 会从环境中探测已安装的 Visual Studio 版本并自动生成对应的.sln工程因此直接执行cmake -B ./build .通常也能正常工作。方式二Visual Studio 2017 IDE 内置 CMake 支持Visual Studio 2017 开始原生支持 CMake 项目无需命令行菜单导航到File - Open - CMake...打开项目根目录下的CMakeLists.txt文件。需要注意VS 默认的 CMake 配置会把构建产物放在与上述命令行步骤不同的位置。若希望构建目录与命令行流程保持一致需要通过CMake - Change CMake Settings - CMakeLists.txt修改 CMake 设置将buildRoot指向./build。方式三MinGW-w64使用 MinGW-w64 构建需要依次完成下载并安装带Win32 threads的 MinGW-w64注意必须是 Win32 线程模型而非 POSIX 线程模型下载并安装 CMake从开始菜单启动MinGW-w64 Terminal按上文五步执行但第 4 步原文档中即编译生成阶段需改为指定生成器cmake -G MinGW Makefiles ../cubeb说明原 INSTALL.md 中的第 4 步与上文标准流程的步骤编号一一对应——当你在./build目录内执行时源码路径写作../cubeb若采用-B ./build .的写法则该参数可省略。MinGW 生成器会生成 Makefile 而非 Visual Studio 工程随后的cmake --build步骤不变。Windows 下的后端源码选择从仓库源码看Windows 构建时 cubeb 会自动探测并启用两个后端见 CMakeLists.txtWASAPIcubeb_wasapi.cpp现代 Windows 7 的主力后端链接ole32与ksuserWinMMcubeb_winmm.c面向 Windows XP 的旧式后端链接winmm。这意味着无论用 VS 还是 MinGW 构建只要编译环境包含 Windows SDK两个后端都会被编译进库中运行时再按优先级选择。Linux 与 macOS 的构建补充虽然 INSTALL.md 聚焦 Windows但同目录的 3rdparty/cubeb/README.md 与 CMake 源码补充了其他平台的要点Linux需要安装目标后端的开发包。Ubuntu/Debian 下为libpulse-dev libasound2-dev libjack-devFedora/RHEL 下为pulseaudio-libs-devel alsa-lib-devel jack-audio-connection-kit-develmacOS需要 Xcode Command Line Tools音频框架由 CMake 自动链接。在 Linux 上CMake 通过check_include_files()依次探测pulse/pulseaudio.h、alsa/asoundlib.h、jack/jack.h、sndio.h探测到哪个就启用对应后端见 CMakeLists.txt。macOS 则检测AudioUnit/AudioUnit.h命中后编译cubeb_audiounit.cpp并链接 AudioUnit/CoreAudio/CoreServices 三个框架见 CMakeLists.txt。LAZY_LOAD_LIBS动态加载开关这是 cubeb CMake 配置中一个值得注意的选项CMakeLists.txtcmake -B ./build . -DLAZY_LOAD_LIBSOFF默认ON后端依赖的共享库如 libpulse、libasound在运行时才通过dlopen加载编译时只需头文件降低了对系统库的硬依赖设为OFF改用pkg_check_modules找到libpulse、alsa、jack并静态链接同时定义DISABLE_LIBPULSE_DLOPEN等宏。如果你的发行版缺少 pkg-config 模块构建会失败。编译期条件与线程依赖cubeb 内部使用 C11/C 线程库find_package(Threads)见 CMakeLists.txt这也是 MinGW 必须选择 Win32 线程模型的原因——日志、PulseAudio、ALSA、JACK、sndio、OSS 等后端实现均依赖线程原语。支持的后端矩阵与支持级别结合 3rdparty/cubeb/README.md 的后端支持表可以了解不同平台可用的后端及其维护状态后端支持级别平台版本说明PulseAudio (Rust)Tier-1—Linux 桌面主力后端AudioUnit (Rust)Tier-1—macOS 主力后端WASAPITier-1Windows ≥ 7Windows 主力后端AAudioTier-1Android ≥ 8多数 Android 设备主力后端OpenSLTier-1Android ≥ 2.3旧 Android 设备后端OSS / sndio / SunTier-2—社区维护WinMM / AudioTrack / ALSA / JACK / KAITier-3—接受补丁状态不明PulseAudio (C) / AudioUnit (C)Tier-4—已废弃计划移除支持级别定义Tier-1 为积极维护且有 CI 覆盖Firefox 关键依赖Tier-2 由贡献者维护Tier-3 接受维护者/补丁Tier-4 已废弃待移除。需要说明的是本仓库内嵌的 cubeb 副本主要使用 C/C 实现的后端PulseAudio C 版、AudioUnit C 版、WASAPI 等与上游 README 描述的 Rust 化路线存在版本差异具体以 3rdparty/cubeb/src 目录下实际编译的源文件为准。cubeb 在 PCSX2 中的实际应用理解了构建方式后再看 cubeb 在 PCSX2 中的真实用法能更清楚构建这些后端的意义。音频流创建流程PCSX2 在 pcsx2/Host/CubebAudioStream.cpp 中实现了基于 cubeb 的音频流其初始化链路是cubeb_set_log_callback()注册日志回调cubeb_init(m_context, PCSX2, driver_name)创建应用上下文——第二个参数是出现在系统音量混音器中的名称第三个参数可强制指定后端cubeb_get_min_latency()查询后端支持的最小延迟帧数再结合用户配置的缓冲毫秒数确定latency_framescubeb_enumerate_devices()按device_id匹配用户选择的输出设备cubeb_stream_init()创建流注册DataCallback每帧回调填充 PCM 数据与StateCallbackcubeb_stream_start()启动播放。其中流参数cubeb_stream_params的关键字段对应 cubeb.h采样格式使用CUBEB_SAMPLE_FLOAT32LE采样率由模拟器决定声道布局根据 PCSX2 的AudioExpansionMode立体声/5.1/7.1 等映射到CUBEB_LAYOUT_*常量偏好设为CUBEB_STREAM_PREF_NONE。暂停/恢复则直接调用cubeb_stream_stop/cubeb_stream_start见 CubebAudioStream.cpp。USB 麦克风模块的复用cubeb 还被 PCSX2 的 USB 麦克风模拟如 EyeToy复用在 pcsx2/USB/usb-mic/audiodev-cubeb.cpp 中通过cubeb_init(s_cubeb_context, PCSX2_USB, backend)创建上下文并枚举输入/输出设备且用互斥锁保护共享的全局上下文处理了 Windows COM 初始化CoInitializeEx(COINIT_MULTITHREADED)与线程生命周期问题。这印证了 cubeb 的一次构建、多处使用特性以及后端枚举 APIcubeb_enumerate_devices在真实产品中的价值。后端与设备可配置性PCSX2 将 cubeb 的后端选择暴露给用户AudioStream::GetCubebDriverNames()调用cubeb_get_backend_names()列出编译进库的所有后端名见 CubebAudioStream.cpp设置界面可让用户指定 WASAPI、PulseAudio 等具体驱动。这也提醒我们如果你在自定义构建中裁剪了 cubeb 的后端PCSX2 设置界面里可见的后端列表也会随之变化。测试验证构建完成后可用 CTest 验证库的正确性cd build ctestcubeb 官方还提供了一个交互式测试工具在部分版本中编译为cubeb-test可执行文件可手动选择设备进行试听。在 PCSX2 场景下更实用的验证方式是在模拟器设置中选择不同音频后端与输出设备观察日志中Minimum latency: X ms (Y audio frames)的输出该日志出自 CubebAudioStream.cpp确认所选后端与延迟配置生效。小结围绕 3rdparty/cubeb/INSTALL.md 的构建说明本文完整覆盖了CMake 3.14 的标准五步构建、Windows 下 VS2015/2017 命令行、VS2017 IDE 内置 CMake 与 MinGW-w64 三条路径、Linux/macOS 要点、LAZY_LOAD_LIBS等关键选项以及 cubeb 后端在 PCSX2 主音频流与 USB 麦克风模块中的实际调用方式。无论是独立编译 cubeb 还是理解 PCSX2 的音频栈这份指南都能作为可复用的参考资料。【免费下载链接】pcsx2PCSX2 - The Playstation 2 Emulator项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门