Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
551767f9f5 | ||
|
|
fa90cd3ce9 | ||
|
|
660261a9a5 | ||
|
|
3a74fd0230 | ||
|
|
2dbb1ea316 | ||
|
|
c902db2e90 | ||
|
|
83e5881768 | ||
|
|
8424b44dec | ||
|
|
33e49a8ca7 |
@@ -0,0 +1,42 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
# Runs on the self-hosted host-mode runner on the desktop (label `arch`). The
|
||||||
|
# gitbutter VPS only queues the job; all compile/test compute happens locally.
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check:
|
||||||
|
runs-on: arch
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Toolchain versions
|
||||||
|
run: |
|
||||||
|
rustc --version
|
||||||
|
cargo --version
|
||||||
|
cargo clippy --version
|
||||||
|
cargo deny --version
|
||||||
|
cargo audit --version
|
||||||
|
|
||||||
|
- name: Format check
|
||||||
|
run: cargo fmt --all -- --check
|
||||||
|
|
||||||
|
- name: Clippy (all targets, warnings as errors)
|
||||||
|
run: cargo clippy --all-targets -- -D warnings
|
||||||
|
|
||||||
|
- name: Tests
|
||||||
|
run: cargo test --all-targets
|
||||||
|
|
||||||
|
- name: Doc tests
|
||||||
|
run: cargo test --doc
|
||||||
|
|
||||||
|
- name: cargo-deny (advisories, bans, licenses, sources)
|
||||||
|
run: cargo deny check
|
||||||
|
|
||||||
|
- name: cargo-audit
|
||||||
|
run: cargo audit
|
||||||
Generated
+4
-4
@@ -200,9 +200,9 @@ checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.102"
|
version = "1.0.103"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arbitrary"
|
name = "arbitrary"
|
||||||
@@ -3682,9 +3682,9 @@ checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memmap2"
|
name = "memmap2"
|
||||||
version = "0.9.10"
|
version = "0.9.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3"
|
checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("cargo:rerun-if-changed=.git/HEAD");
|
||||||
|
if let Ok(head) = std::fs::read_to_string(".git/HEAD") {
|
||||||
|
if let Some(reference) = head.strip_prefix("ref: ") {
|
||||||
|
println!("cargo:rerun-if-changed=.git/{}", reference.trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let short = Command::new("git")
|
||||||
|
.args(["rev-parse", "--short=8", "HEAD"])
|
||||||
|
.output()
|
||||||
|
.ok()
|
||||||
|
.filter(|output| output.status.success())
|
||||||
|
.and_then(|output| String::from_utf8(output.stdout).ok())
|
||||||
|
.map(|value| value.trim().to_string())
|
||||||
|
.filter(|value| !value.is_empty())
|
||||||
|
.unwrap_or_else(|| "unknown".to_string());
|
||||||
|
|
||||||
|
println!("cargo:rustc-env=PEERSPEAK_GIT_SHORT={short}");
|
||||||
|
}
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
# Maintainer: mollusk <jitty+lc1iz0dc@protonmail.com>
|
# Maintainer: mollusk <jitty+lc1iz0dc@protonmail.com>
|
||||||
pkgname=peerspeak-git
|
pkgname=peerspeak-git
|
||||||
_pkgname=peerspeak
|
_pkgname=peerspeak
|
||||||
pkgver=0.5.0.r0.g0000000
|
pkgver=0.6.1.r310.g660261a
|
||||||
pkgrel=1
|
pkgrel=1
|
||||||
pkgdesc="Decentralized peer-to-peer voice chat (Rust/iroh/PipeWire/Opus/iced)"
|
pkgdesc="Decentralized peer-to-peer voice chat (Rust/iroh/PipeWire/Opus/iced)"
|
||||||
arch=('x86_64')
|
arch=('x86_64')
|
||||||
|
|||||||
+16
-7
@@ -34,6 +34,17 @@ use tokio::sync::Mutex;
|
|||||||
|
|
||||||
static UI_RX: OnceLock<Mutex<Option<tokio::sync::mpsc::Receiver<UiEvent>>>> = OnceLock::new();
|
static UI_RX: OnceLock<Mutex<Option<tokio::sync::mpsc::Receiver<UiEvent>>>> = OnceLock::new();
|
||||||
|
|
||||||
|
const APP_VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
|
const GIT_SHORT: &str = env!("PEERSPEAK_GIT_SHORT");
|
||||||
|
|
||||||
|
fn app_build_label() -> String {
|
||||||
|
if GIT_SHORT == "unknown" {
|
||||||
|
format!("PeerSpeak v{APP_VERSION}")
|
||||||
|
} else {
|
||||||
|
format!("PeerSpeak v{APP_VERSION} ({GIT_SHORT})")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub enum Screen {
|
pub enum Screen {
|
||||||
Home,
|
Home,
|
||||||
@@ -1100,7 +1111,7 @@ fn effective_background_bytes(
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_gui() -> iced::Result {
|
pub fn run_gui() -> iced::Result {
|
||||||
crate::log_msg(&format!("PeerSpeak v{} starting", env!("CARGO_PKG_VERSION")));
|
crate::log_msg(&format!("{} starting", app_build_label()));
|
||||||
// Restore the last window size (saved on close). Position is restored too,
|
// Restore the last window size (saved on close). Position is restored too,
|
||||||
// but only on X11 — Wayland's xdg-shell gives clients no way to set their own
|
// but only on X11 — Wayland's xdg-shell gives clients no way to set their own
|
||||||
// position, so we center there and leave placement to the compositor.
|
// position, so we center there and leave placement to the compositor.
|
||||||
@@ -3807,6 +3818,7 @@ fn connect_card(state: &AppState) -> Element<'_, AppMessage> {
|
|||||||
let subtitle = text("NAT-traversing full-mesh voice chat")
|
let subtitle = text("NAT-traversing full-mesh voice chat")
|
||||||
.size(16)
|
.size(16)
|
||||||
.color(color_subtext);
|
.color(color_subtext);
|
||||||
|
let build_label = text(app_build_label()).size(11).color(color_subtext);
|
||||||
|
|
||||||
let nickname_input = column![
|
let nickname_input = column![
|
||||||
text("Nickname").size(14).color(color_subtext),
|
text("Nickname").size(14).color(color_subtext),
|
||||||
@@ -3862,6 +3874,7 @@ fn connect_card(state: &AppState) -> Element<'_, AppMessage> {
|
|||||||
column![
|
column![
|
||||||
logo,
|
logo,
|
||||||
subtitle,
|
subtitle,
|
||||||
|
build_label,
|
||||||
vertical_space(20.0),
|
vertical_space(20.0),
|
||||||
nickname_input,
|
nickname_input,
|
||||||
vertical_space(16.0),
|
vertical_space(16.0),
|
||||||
@@ -5243,9 +5256,7 @@ fn view(state: &AppState) -> Element<'_, AppMessage> {
|
|||||||
}
|
}
|
||||||
settings_nav = settings_nav
|
settings_nav = settings_nav
|
||||||
.push(iced::widget::Space::new().height(iced::Length::Fill))
|
.push(iced::widget::Space::new().height(iced::Length::Fill))
|
||||||
.push(text(format!("PeerSpeak v{}", env!("CARGO_PKG_VERSION")))
|
.push(text(app_build_label()).size(11).color(color_subtext));
|
||||||
.size(11)
|
|
||||||
.color(color_subtext));
|
|
||||||
let settings_nav = container(settings_nav)
|
let settings_nav = container(settings_nav)
|
||||||
.padding(12)
|
.padding(12)
|
||||||
.width(iced::Length::Fixed(220.0))
|
.width(iced::Length::Fixed(220.0))
|
||||||
@@ -5265,9 +5276,7 @@ fn view(state: &AppState) -> Element<'_, AppMessage> {
|
|||||||
vertical_space(10.0),
|
vertical_space(10.0),
|
||||||
settings_body,
|
settings_body,
|
||||||
vertical_space(10.0),
|
vertical_space(10.0),
|
||||||
text(format!("PeerSpeak v{}", env!("CARGO_PKG_VERSION")))
|
text(app_build_label()).size(11).color(color_subtext),
|
||||||
.size(11)
|
|
||||||
.color(color_subtext),
|
|
||||||
]
|
]
|
||||||
.spacing(8)
|
.spacing(8)
|
||||||
.width(iced::Length::Fill),
|
.width(iced::Length::Fill),
|
||||||
|
|||||||
+13
-3
@@ -380,7 +380,11 @@ impl MultitrackRecorder {
|
|||||||
let batch = CycleBatch {
|
let batch = CycleBatch {
|
||||||
new_peers: pending.new_peers,
|
new_peers: pending.new_peers,
|
||||||
mic_frame,
|
mic_frame,
|
||||||
mix_frame: if self.with_mix { pending.mix_frame } else { None },
|
mix_frame: if self.with_mix {
|
||||||
|
pending.mix_frame
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
},
|
||||||
peer_frames: pending.peer_frames,
|
peer_frames: pending.peer_frames,
|
||||||
};
|
};
|
||||||
match self.batch_tx.try_send(batch) {
|
match self.batch_tx.try_send(batch) {
|
||||||
@@ -560,9 +564,15 @@ mod tests {
|
|||||||
assert_eq!(state.cycles_written, 3);
|
assert_eq!(state.cycles_written, 3);
|
||||||
assert_eq!(state.mic.samples.len(), 3 * frame);
|
assert_eq!(state.mic.samples.len(), 3 * frame);
|
||||||
assert_eq!(state.mix.as_ref().unwrap().samples.len(), 3 * frame);
|
assert_eq!(state.mix.as_ref().unwrap().samples.len(), 3 * frame);
|
||||||
assert_eq!(&state.mix.as_ref().unwrap().samples[2 * frame..], &[0, 0, 0]);
|
assert_eq!(
|
||||||
|
&state.mix.as_ref().unwrap().samples[2 * frame..],
|
||||||
|
&[0, 0, 0]
|
||||||
|
);
|
||||||
assert_eq!(state.peers.get(&early).unwrap().samples.len(), 3 * frame);
|
assert_eq!(state.peers.get(&early).unwrap().samples.len(), 3 * frame);
|
||||||
assert_eq!(&state.peers.get(&early).unwrap().samples[2 * frame..], &[2, 2, 2]);
|
assert_eq!(
|
||||||
|
&state.peers.get(&early).unwrap().samples[2 * frame..],
|
||||||
|
&[2, 2, 2]
|
||||||
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
state.peers.get(&late).unwrap().samples,
|
state.peers.get(&late).unwrap().samples,
|
||||||
vec![0, 0, 0, 0, 0, 0, 7, 7, 7],
|
vec![0, 0, 0, 0, 0, 0, 7, 7, 7],
|
||||||
|
|||||||
Reference in New Issue
Block a user