279 lines
7.9 KiB
Markdown
279 lines
7.9 KiB
Markdown
# Contributing to Lightningbeam
|
|
|
|
Thank you for your interest in contributing to Lightningbeam! This document provides guidelines and instructions for setting up your development environment and contributing to the project.
|
|
|
|
## Table of Contents
|
|
|
|
- [Development Setup](#development-setup)
|
|
- [Building the Project](#building-the-project)
|
|
- [Project Structure](#project-structure)
|
|
- [Making Changes](#making-changes)
|
|
- [Code Style](#code-style)
|
|
- [Testing](#testing)
|
|
- [Submitting Changes](#submitting-changes)
|
|
- [Getting Help](#getting-help)
|
|
|
|
## Development Setup
|
|
|
|
### Prerequisites
|
|
|
|
- **Rust**: Install via [rustup](https://rustup.rs/) (stable toolchain)
|
|
- **System dependencies** (Linux):
|
|
- ALSA development files: `libasound2-dev`
|
|
- For Ubuntu/Debian: `sudo apt install libasound2-dev pkg-config`
|
|
- For Arch/Manjaro: `sudo pacman -S alsa-lib`
|
|
- **FFmpeg**: Required for video encoding/decoding
|
|
- Ubuntu/Debian: `sudo apt install ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev pkg-config clang`
|
|
- Arch/Manjaro: `sudo pacman -S ffmpeg`
|
|
|
|
### Clone and Build
|
|
|
|
```bash
|
|
# Clone the repository (GitHub)
|
|
git clone https://github.com/skykooler/lightningbeam.git
|
|
# Or from Gitea
|
|
git clone https://git.skyler.io/skyler/lightningbeam.git
|
|
|
|
cd lightningbeam
|
|
|
|
# Build the Rust UI editor (current focus)
|
|
cd lightningbeam-ui
|
|
cargo build
|
|
|
|
# Run the editor
|
|
cargo run
|
|
```
|
|
|
|
**Note**: The project is hosted on both GitHub and Gitea (git.skyler.io). You can use either for cloning and submitting pull requests.
|
|
|
|
## Building the Project
|
|
|
|
### Workspace Structure
|
|
|
|
The project consists of multiple Rust workspaces:
|
|
|
|
1. **lightningbeam-ui** (current focus) - Pure Rust UI application
|
|
- `lightningbeam-editor/` - Main editor application
|
|
- `lightningbeam-core/` - Core data models and business logic
|
|
|
|
2. **daw-backend** - Audio engine (standalone crate)
|
|
|
|
3. **Root workspace** (legacy) - Contains Tauri backend and benchmarks
|
|
|
|
### Build Commands
|
|
|
|
```bash
|
|
# Build the editor (from lightningbeam-ui/)
|
|
cargo build
|
|
|
|
# Build with optimizations (faster runtime)
|
|
cargo build --release
|
|
|
|
# Check just the audio backend
|
|
cargo check -p daw-backend
|
|
|
|
# Build the audio backend separately
|
|
cd ../daw-backend
|
|
cargo build
|
|
```
|
|
|
|
### Debug Builds and Audio Performance
|
|
|
|
The audio engine runs on a real-time thread with strict timing constraints (~5.8ms at 44.1kHz). To maintain performance in debug builds, the audio backend is compiled with optimizations even in debug mode:
|
|
|
|
```toml
|
|
# In lightningbeam-ui/Cargo.toml
|
|
[profile.dev.package.daw-backend]
|
|
opt-level = 2
|
|
```
|
|
|
|
This is already configured—no action needed.
|
|
|
|
### Debug Flags
|
|
|
|
Enable audio diagnostics with:
|
|
```bash
|
|
DAW_AUDIO_DEBUG=1 cargo run
|
|
```
|
|
|
|
This prints timing information, buffer sizes, and overrun warnings to help debug audio issues.
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
lightningbeam-2/
|
|
├── lightningbeam-ui/ # Rust UI workspace (current)
|
|
│ ├── lightningbeam-editor/ # Main application
|
|
│ │ └── src/
|
|
│ │ ├── main.rs # Entry point
|
|
│ │ ├── panes/ # UI panes (stage, timeline, etc.)
|
|
│ │ └── tools/ # Drawing and editing tools
|
|
│ └── lightningbeam-core/ # Core data model
|
|
│ └── src/
|
|
│ ├── document.rs # Document structure
|
|
│ ├── clip.rs # Clips and instances
|
|
│ ├── action.rs # Undo/redo system
|
|
│ └── tools.rs # Tool system
|
|
├── daw-backend/ # Audio engine
|
|
│ └── src/
|
|
│ ├── lib.rs # Audio system setup
|
|
│ ├── audio/
|
|
│ │ ├── engine.rs # Audio callback
|
|
│ │ ├── track.rs # Track management
|
|
│ │ └── project.rs # Project state
|
|
│ └── effects/ # Audio effects
|
|
├── src-tauri/ # Legacy Tauri backend
|
|
└── src/ # Legacy JavaScript frontend
|
|
```
|
|
|
|
## Making Changes
|
|
|
|
### Branching Strategy
|
|
|
|
- `main` - Stable branch
|
|
- `rust-ui` - Active development branch for Rust UI rewrite
|
|
- Feature branches - Create from `rust-ui` for new features
|
|
|
|
### Before You Start
|
|
|
|
1. Check existing issues or create a new one to discuss your change
|
|
2. Make sure you're on the latest `rust-ui` branch:
|
|
```bash
|
|
git checkout rust-ui
|
|
git pull origin rust-ui
|
|
```
|
|
3. Create a feature branch:
|
|
```bash
|
|
git checkout -b feature/your-feature-name
|
|
```
|
|
|
|
## Code Style
|
|
|
|
### Rust Style
|
|
|
|
- Follow standard Rust formatting: `cargo fmt`
|
|
- Check for common issues: `cargo clippy`
|
|
- Use meaningful variable names
|
|
- Add comments for non-obvious code
|
|
- Keep functions focused and reasonably sized
|
|
|
|
### Key Patterns
|
|
|
|
#### Pane ID Salting
|
|
When implementing new panes, **always salt egui IDs** with the node path to avoid collisions when users add multiple instances of the same pane:
|
|
|
|
```rust
|
|
ui.horizontal(|ui| {
|
|
ui.label("My Widget");
|
|
}).id.with(&node_path); // Salt with node path
|
|
```
|
|
|
|
#### Splitting Borrows with `std::mem::take`
|
|
When you need to split borrows from a struct, use `std::mem::take`:
|
|
|
|
```rust
|
|
let mut clips = std::mem::take(&mut self.clips);
|
|
// Now you can borrow other fields while processing clips
|
|
```
|
|
|
|
#### Two-Phase Dispatch
|
|
Panes register handlers during render, execution happens after:
|
|
|
|
```rust
|
|
// During render
|
|
shared_state.register_action(Box::new(MyAction { ... }));
|
|
|
|
// After all panes rendered
|
|
for action in shared_state.pending_actions.drain(..) {
|
|
action.execute(&mut document);
|
|
}
|
|
```
|
|
|
|
## Testing
|
|
|
|
### Running Tests
|
|
|
|
```bash
|
|
# Run all tests
|
|
cargo test
|
|
|
|
# Test specific package
|
|
cargo test -p lightningbeam-core
|
|
cargo test -p daw-backend
|
|
|
|
# Run with output
|
|
cargo test -- --nocapture
|
|
```
|
|
|
|
### Audio Testing
|
|
|
|
Test audio functionality:
|
|
```bash
|
|
# Run with audio debug output
|
|
DAW_AUDIO_DEBUG=1 cargo run
|
|
|
|
# Check for audio dropouts or timing issues in the console output
|
|
```
|
|
|
|
## Submitting Changes
|
|
|
|
### Before Submitting
|
|
|
|
1. **Format your code**: `cargo fmt --all`
|
|
2. **Run clippy**: `cargo clippy --all-targets --all-features`
|
|
3. **Run tests**: `cargo test --all`
|
|
4. **Test manually**: Build and run the application to verify your changes work
|
|
5. **Write clear commit messages**: Describe what and why, not just what
|
|
|
|
### Commit Message Format
|
|
|
|
```
|
|
Short summary (50 chars or less)
|
|
|
|
More detailed explanation if needed. Wrap at 72 characters.
|
|
Explain the problem this commit solves and why you chose
|
|
this solution.
|
|
|
|
- Bullet points are fine
|
|
- Use present tense: "Add feature" not "Added feature"
|
|
```
|
|
|
|
### Pull Request Process
|
|
|
|
1. Push your branch to GitHub or Gitea
|
|
2. Open a pull request against `rust-ui` branch
|
|
- GitHub: https://github.com/skykooler/lightningbeam
|
|
- Gitea: https://git.skyler.io/skyler/lightningbeam
|
|
3. Provide a clear description of:
|
|
- What problem does this solve?
|
|
- How does it work?
|
|
- Any testing you've done
|
|
- Screenshots/videos if applicable (especially for UI changes)
|
|
4. Address review feedback
|
|
5. Once approved, a maintainer will merge your PR
|
|
|
|
### PR Checklist
|
|
|
|
- [ ] Code follows project style (`cargo fmt`, `cargo clippy`)
|
|
- [ ] Tests pass (`cargo test`)
|
|
- [ ] New code has appropriate tests (if applicable)
|
|
- [ ] Documentation updated (if needed)
|
|
- [ ] Commit messages are clear
|
|
- [ ] PR description explains the change
|
|
|
|
## Getting Help
|
|
|
|
- **Issues**: Check issues on [GitHub](https://github.com/skykooler/lightningbeam/issues) or [Gitea](https://git.skyler.io/skyler/lightningbeam/issues) for existing discussions
|
|
- **Documentation**: See `ARCHITECTURE.md` and `docs/` folder for technical details
|
|
- **Questions**: Open a discussion or issue with the "question" label on either platform
|
|
|
|
## Additional Resources
|
|
|
|
- [ARCHITECTURE.md](ARCHITECTURE.md) - System architecture overview
|
|
- [docs/AUDIO_SYSTEM.md](docs/AUDIO_SYSTEM.md) - Audio engine details
|
|
- [docs/UI_SYSTEM.md](docs/UI_SYSTEM.md) - UI and pane system
|
|
|
|
## License
|
|
|
|
By contributing, you agree that your contributions will be licensed under the same license as the project.
|