Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.3.0-rc.1] - 2026-09-11

### Fixed

- Fixed in-app updater throwing invalid resource ID when installing updates by registering update handles into webview resource tables.
- Fixed version display falling back to "v?" in updater banner and about modal by making cached app info reactive.
- Prevented closed plugin editor windows from reopening during pipeline reconcile when connecting or disconnecting edges.
- Disabled browser context menu and web inspector on right-click across all platforms.
- Prohibited accidental text selection across app buttons and canvas elements while keeping text selectable in modals, error dialogs, and inputs.

## [1.2.0] - 2026-09-11

### Added
Expand All @@ -19,7 +29,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

### Changed

- Network audio nodes (Net Sender and Net Receiver) use a leaner v2 wire protocol with dynamic format detection and configurable sample rates by @Horuse in (#39).
- Network audio nodes (Net Sender and Net Receiver) use a leaner v2 wire protocol with dynamic format detection and configurable sample rates by @Horuse in (#39).
- Audio node specifications use unified styling and a reusable numeric stepper across controls by @Horuse in (#31, #39).
- Real-time speaker pacing and prefill budgets are bounded across all platforms to prevent drift and latency creep by @Horuse in (#41).

Expand Down Expand Up @@ -165,6 +175,7 @@ Initial release.
- Node graph routing with hot reconcile: edit the graph while the pipeline runs without interrupting streams.
- Undo/redo, node copy/paste, pipeline snapshot history, auto-update and the virtual audio driver.

[1.3.0-rc.1]: https://github.com/Horuse/Splitwave/compare/v1.2.0...v1.3.0-rc.1
[1.2.0]: https://github.com/Horuse/Splitwave/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/Horuse/Splitwave/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/Horuse/Splitwave/compare/v0.5.0...v1.0.0
Expand Down
42 changes: 42 additions & 0 deletions announcements.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"announcements": [
{
"id": "notice-updater-resource-id-workaround",
"type": "both",
"severity": "critical",
"priority": 100,
"badge": "NOTICE",
"title": "Manual Update Required for v1.1.0",
"message": "In-app automatic updates are broken in v1.1.0. Please download the latest version manually once from splitwave.app or GitHub.",
"markdown": "### In-App Update Notice\n\nDue to an updater issue in version `1.1.0`, automatic updates fail with `The resource id is invalid`.\n\nTo update to the latest version, please download and install Splitwave manually once:\n- [Official Website](https://splitwave.app)\n- [GitHub Releases](https://github.com/Horuse/Splitwave/releases)\n\nYour existing pipelines, presets, and audio configuration will be preserved automatically.",
"action": {
"label": "Download Latest",
"url": "https://splitwave.app"
},
"dismissible": true,
"filters": {
"versions": "1.1.0",
"platforms": ["macos", "windows", "linux"],
"channels": ["stable", "rc", "beta"]
}
},
{
"id": "notice-testing-v130-rc",
"type": "banner",
"severity": "info",
"priority": 50,
"badge": "RC TEST",
"title": "Testing Splitwave 1.3.0 Release Candidate",
"message": "You are running Splitwave 1.3.0-rc.1. Please report any audio or UI feedback on GitHub.",
"action": {
"label": "Report Issue",
"url": "https://github.com/Horuse/Splitwave/issues"
},
"dismissible": true,
"filters": {
"versions": "^1.3.0-rc.0",
"channels": ["rc"]
}
}
]
}
13 changes: 13 additions & 0 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "splitwave",
"version": "1.2.0",
"version": "1.3.0-rc.1",
"description": "",
"type": "module",
"scripts": {
Expand Down Expand Up @@ -30,6 +30,7 @@
"@xyflow/svelte": "^1.5.2",
"prettier-plugin-svelte": "^3.5.2",
"prettier-plugin-tailwindcss": "^0.8.0",
"semver": "^7.8.5",
"svelte-floating-ui": "^1.6.2",
"svelte-french-toast": "^1.2.0",
"svelte-portal": "^2.2.1",
Expand All @@ -40,6 +41,8 @@
"@sveltejs/kit": "^2.9.0",
"@sveltejs/vite-plugin-svelte": "^7.1.2",
"@tauri-apps/cli": "^2",
"@types/semver": "^7.8.0",
"bun-types": "^1.4.2",
"prettier": "3.8.3",
"svelte": "^5.0.0",
"svelte-check": "^4.0.0",
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "splitwave"
version = "1.2.0"
version = "1.3.0-rc.1"
description = "Audio routing app for macOS, Linux and Windows. Build a node graph of inputs, effects, and outputs"
license = "MIT"
edition = "2021"
Expand Down
10 changes: 10 additions & 0 deletions src-tauri/src/audio/plugins/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,16 @@ pub fn window_for(node_id: &str) -> Option<tauri::Window> {
windows().lock().unwrap().get(node_id).cloned()
}

/// Returns whether this node's editor window currently exists and is visible.
pub fn is_open(node_id: &str) -> bool {
windows()
.lock()
.unwrap()
.get(node_id)
.and_then(|w| w.is_visible().ok())
.unwrap_or(false)
}

/// Closes a node's editor window if one is open. Shared with the format hosts,
/// which have to take the window down alongside the instance it belongs to.
pub fn close_window(node_id: &str) {
Expand Down
8 changes: 4 additions & 4 deletions src-tauri/src/audio/plugins/vst3_registry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ fn activate_on_main(
let same_plugin = old.path == path && old.plugin_id == plugin_id;
GRAVEYARD.with(|g| g.borrow_mut().bury(old.instance, old.alive));

if same_plugin {
// Same plugin, pipeline rebuilt: re-attach to existing window!
if same_plugin && editor::is_open(&node_id) {
// Same plugin, pipeline rebuilt: re-attach to existing open window!
if let Some(window) = editor::window_for(&node_id) {
// IMPORTANT: Drop the old editor view first so its removed() and
// peer teardown happen BEFORE the new view calls attached()!
Expand Down Expand Up @@ -157,8 +157,8 @@ fn activate_on_main(
}
}
} else {
// Different plugin chosen on this node: close the previous editor
// window so the new one opens cleanly with its own UI and geometry.
// Different plugin chosen or editor was closed: close the previous editor
// window so it doesn't reopen unexpectedly during pipeline reconcile.
old.editor = None;
editor::close_window(&node_id);
if let Some(app) = crate::app_handle() {
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Splitwave",
"version": "1.2.0",
"version": "1.3.0-rc.1",
"identifier": "com.horuse.splitwave",
"build": {
"beforeDevCommand": "bun run dev",
Expand Down
3 changes: 2 additions & 1 deletion src-tauri/tauri.linux.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"width": 1200,
"height": 800,
"dragDropEnabled": false,
"decorations": false
"decorations": false,
"devtools": false
}
]
}
Expand Down
3 changes: 2 additions & 1 deletion src-tauri/tauri.macos.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"decorations": true,
"titleBarStyle": "Overlay",
"hiddenTitle": true,
"trafficLightPosition": { "x": 14, "y": 18 }
"trafficLightPosition": { "x": 14, "y": 18 },
"devtools": false
}
]
},
Expand Down
3 changes: 2 additions & 1 deletion src-tauri/tauri.windows.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"width": 1200,
"height": 800,
"dragDropEnabled": false,
"decorations": false
"decorations": false,
"devtools": false
}
]
}
Expand Down
3 changes: 3 additions & 0 deletions src/lib/components/layout/header.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import { pipelineStore } from '$lib/modules/pipeline/stores.svelte';
import { audioStore } from '$lib/modules/audio/stores.svelte';
import { Popover } from '$lib/modules/overlay/ui';
import { AnnouncementBanner } from '$lib/modules/announcements';

interface Props {
left?: Snippet;
Expand Down Expand Up @@ -112,3 +113,5 @@
<button type="button" class="btn-warning px-3 py-0.5 text-xs" onclick={() => (audioStore.safeMode = false)}> Dismiss </button>
</div>
{/if}

<AnnouncementBanner />
6 changes: 4 additions & 2 deletions src/lib/components/waveform_scope.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
// Encoder writes PCM (WAV/AIFF) — the disk-peak source; `null` falls
// back to the path-extension heuristic.
pcm = null,
maxChannels = null
maxChannels = null,
showBufferLimit = false
}: {
nodeId: string;
height?: number;
Expand All @@ -29,6 +30,7 @@
pcm?: boolean | null;
// Caps displayed lanes; phantom multi lanes without a cable are dropped.
maxChannels?: number | null;
showBufferLimit?: boolean;
} = $props();

const SEG_FRAMES = 64;
Expand Down Expand Up @@ -894,7 +896,7 @@
c.stroke();
c.restore();

if (totalSegs > 0) {
if (showBufferLimit && totalSegs > 0) {
c.save();
c.font = '6.5px monospace';
const line1 = 'Live view · Buffer limit';
Expand Down
10 changes: 8 additions & 2 deletions src/lib/modules/about/ui/about_modal.svelte
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
<script lang="ts">
import { openUrl } from '@tauri-apps/plugin-opener';
import { modalManager, type ModalBaseProps } from '$lib/modules/overlay/modal';
import { getCachedAppInfo } from '$lib/modules/app_info';
import { getCachedAppInfo, loadAppInfo } from '$lib/modules/app_info';

let { modalId }: ModalBaseProps = $props();

const REPO = 'Horuse/Splitwave';
const info = getCachedAppInfo();
let info = $derived(getCachedAppInfo());

$effect(() => {
if (!info) {
loadAppInfo().catch(() => {});
}
});

const links = [
{ label: 'Website', url: 'https://splitwave.app/' },
Expand Down
5 changes: 5 additions & 0 deletions src/lib/modules/announcements/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export * from './types';
export * from './matcher';
export * from './stores.svelte';
export * from './methods';
export * from './ui';
Loading
Loading