Files
oak-editor/crates/oakaudio/COVERAGE.md
T
Mike-Solar 013a175707 refactor: workspace layout — crates/, app at root, legacy C++ removed
Single mechanical restructure commit:
- root Cargo.toml = oakapp bin + workspace; one cargo build produces
  oakapp, oak-cli, oak-worker, liboakengine.dylib
- app/rust/src -> src/ (app at repo root, no rust/ nesting)
- src/<mod>/rust -> crates/oak<mod>; src/oakcore-rs -> crates/oakcore;
  src/bindings/oakotio -> crates/oakotio; src/engine/rust ->
  crates/oakengine (keeps cdylib+staticlib+rlib)
- public C headers include/<mod>/ -> crates/oakengine/include/<mod>/
- OFX SDK headers vendored into crates/oakplugin/ofx/ (HostSupport gone)
- legacy deleted: old src/ C++ modules, engine/, core/, ffmpeg_bridge/,
  app/ (Qt), cli/worker C++, root CMakeLists, third_party/KDDockWidgets
  submodule, otio-install, all build-* output (~40GB)
- oakstorage kept but excluded from the workspace (skeleton w/ todos);
  gpui excluded (own workspace)
- verified: cargo build green, cargo test --workspace 1845/0
  (with the documented OCIO_RS_* env override for the homebrew OCIO)
2026-08-10 20:24:25 +08:00

91 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# oakaudio 类覆盖映射表(C++ audio 模块 → oakaudio Rust crate
> 逐类盘点 `src/audio/src` 与 `src/audio/c_api`。每一行标注 Rust 侧落点。
> `// CPP-PARITY` 注释义务不变:凡承载布局/数值/边角行为的地方,标出
> C++ 文件:行号。本表是初稿;实现阶段据实核对。
## 1. AudioManagermanager.rs
| C++ | Rust 落点 |
|---|---|
| `AudioManager::create_instance` / `destroy_instance` / `instance` | `manager::create_instance` / `destroy_instance` / `instance``OnceLock<Mutex<ManagerInner>>` 单例) |
| `set_output_notify_interval` / `set_output_notify_callback` | `manager::set_output_notify_interval`notify 回调经 guard 从 PortAudio 线程调用,见 previewdevice.rs |
| `push_to_output` / `clear_buffered_output` / `stop_output` | `manager::push_to_output` / `clear_buffered_output` / `stop_output` |
| `seconds` / `reset_output_clock` | `manager::seconds` / `reset_output_clock`(播放时钟补偿输出延迟) |
| `get/set_output_device` / `get/set_input_device` | `manager` 设备访问器(PaDeviceIndex-1 = paNoDevice |
| `hard_reset` | `manager::hard_reset`(关流并重初始化 PortAudio |
| `start_recording` / `stop_recording` | `manager` 录音(经 `bridge::codec` OakEncoder,恒定 interleaved f32 |
| `find_config_device_by_name` / `find_device_by_name`static | `manager::find_config_device_by_name_s` / `find_device_by_name_s` |
| `get_port_audio_params` / `get_port_audio_sample_format`(私有) | `manager` 内部(映射 AudioParams ↔ PortAudio`// CPP-PARITY` 标注格式映射) |
## 2. AudioProcessorprocessor.rs
| C++ | Rust 落点 |
|---|---|
| `open(from,to,tempo)` / `close` / `is_open` | `processor::open` / `close` / `is_open`FBAudioGraphConfig 组装) |
| `convert` | `processor::convert`planar f32 进/出;`fb_audio_graph_push` + `fb_audio_graph_pull` |
| `flush` | `processor::flush``fb_audio_graph_push` channel_data==NULL |
| `from()` / `to()` | `processor` 保存的 `AudioParams` |
## 3. AudioSynchronizersynchronizer.rs,纯静态)
| C++ | Rust 落点 |
|---|---|
| `place_by_source_time` | `synchronizer::place_by_source_time` |
| `place_by_waveform_offset` | `synchronizer::place_by_waveform_offset` |
## 4. AudioLevelMeterlevelmeter.rs,纯静态)
| C++ | Rust 落点 |
|---|---|
| `analyze_sample_buffer` | `levelmeter::analyze`peak/RMS/VU 阈值与 `-200` 地板;`// CPP-PARITY` 标注) |
| `linear_to_db` / `power_to_lufs`(私有) | `levelmeter` 内部(BS.1770 LUFS,无 K-weighting |
## 5. AudioVisualWaveformwaveform.rs
| C++ | Rust 落点 |
|---|---|
| 构造 / `channel_count` / `set_channel_count` / `length` | `waveform::Waveform` + 访问器 |
| `overwrite_samples` | `waveform::overwrite_samples`mipmap 展开,`k_minimum/maximum_sample_rate` |
| `overwrite_sums` / `overwrite_silence` | `waveform::overwrite_sums` / `overwrite_silence` |
| `trim_in` / `mid` / `resize` / `trim_range` | `waveform::trim_in` / `mid` / `resize` / `trim_range` |
| `get_summary_from_time` | `waveform::get_summary` |
| `sum_samples` / `re_sum_samples`static | `waveform::sum_samples` / `re_sum_samples` |
| mipmap 内部(`overwrite_samples_from_*` / `get_mipmap_for_scale` / `time_to_samples` / `validate_virtual_start` | `waveform` 内部 |
| 全文件提取(c_api `oakaudio_waveform_extract` | `waveform::extract`(经 `bridge::codec` decoder + `bridge::ffmpeg` |
| `SamplePerChannel` POD | 与 `oakaudio_min_max` `static_assert` 对齐(`// CPP-PARITY: c_api/waveform.cpp` |
## 6. AudioWaveformSyncwaveformsync.rs,纯静态)
| C++ | Rust 落点 |
|---|---|
| `extract_rms_envelope` | `waveformsync::extract_rms_envelope` |
| `estimate_offset`SampleBuffer 版) | `waveformsync::estimate_offset`(内部先提取 envelope |
| `estimate_envelope_offset`(两个重载) | `waveformsync::estimate_envelope_offset`valid 掩码版为权威) |
| `estimate_stretch_and_offset` | `waveformsync::estimate_stretch_and_offset`O(rates*lags*overlap) |
## 7. PreviewAudioDevicepreviewdevice.rsheader-only
| C++ | Rust 落点 |
|---|---|
| `read` / `write` | `previewdevice::PreviewAudioDevice::read` / `write`(回调侧 pull |
| `set_params` / `bytes_per_frame` / `set_bytes_per_frame` | `previewdevice`AudioParams → bytes_per_frame |
| `set_notify_interval` / `set_notify_callback` | `previewdevice`notify 回调,锁外触发) |
| `clear` | `previewdevice::clear` |
| `add_output_frames` / `output_frames_consumed` / `reset_output_frames` | `previewdevice`atomic 播放时钟) |
## 8. audio_config 命名空间(config.rs,不是类)
| C++ | Rust 落点 |
|---|---|
| `output_buffer_size()` | `config::output_buffer_size``oakcommon_config_get_int(nullptr,"AudioOutputBufferSize",0)` |
| `device_name(is_output_device)` | `config::device_name``oakcommon_config_get` 两阶段;key = "AudioOutput"/"AudioInput" |
## 9. 刻意不迁移(drop
| C++ | 理由 |
|---|---|
| `get_port_audio_params` 的 PortAudio 平台细节 | 归 `bridge::ffmpeg`/PortAudio 侧;Rust 保留语义与默认布局兜底 |
| Qt 常量(`qFuzzyIsNull` 等)内联展开 | 语义内联为 Rust 比较;`// CPP-PARITY` 标注 |
| `draw_sample`/`draw_waveform`QPainter | UI 绘制归 facade/appcrate 只存/汇总数据 |