Sounds: Japanese-house sound set in the app, layout demo removed

Eleven sounds for events that carry news (ready, unready, everyone ready,
join, leave, kick, new video, others' chat, idle warning, connection
lost/back); none for what the video already says. New voices: koto
(Karplus-Strong, bendable), furin chime, rin bowl, bamboo, hyoshigi,
shoji slide, in the Yo scale on D. Played by SynthSfx at the Settings
volume with per-sound switches and previews. The debug layout mock is
gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
foxyzandClaude Opus 5.5 committed 2026-10-09 06:23:22 +03:00
1 parent d8fd464e33
commit fce392e425
19 files changed
+546 -6306

No files matched your search

@@ -260,6 +260,8 @@ class SessionCoordinator {
int _toastId = 0;
ConnectParams? _params;
bool _everConnected = false;
/// The connection-lost sound played; the reconnected one answers it once.
bool _lostSounded = false;
Map<String, String>? _openHeaders;
// Jellyfin: the resolved ref, the mediaId it belongs to, a generation
@@ -356,6 +358,7 @@ class SessionCoordinator {
_restoringReady = false;
_wasPlayAllowed = false;
_everConnected = false;
_lostSounded = false;
_resumeToken = '';
_seekGate.reset();
_clearPendingSeek();
@@ -423,6 +426,7 @@ class SessionCoordinator {
if (s == SyncStatus.closed && !_manualClose && kickReason.peek() == null) {
health.value = const HealthStatus(
HealthSeverity.warn, 'connection lost — retrying…');
_soundLost();
_scheduleReconnect();
}
});
@@ -727,7 +731,9 @@ class SessionCoordinator {
];
}
final kind = sfxForFeedAction(f.action);
if (kind != null) {
// Your own message needs no sound.
final own = f.action == 'chat' && f.actor == selfMember.peek()?.name;
if (kind != null && !own) {
var readyIndex = 0;
if (f.action == 'ready') {
readyIndex = serverState.peek()?.members.where((m) => m.ready).length ?? 0;
@@ -813,6 +819,7 @@ class SessionCoordinator {
if (!reconnecting.peek()) {
health.value = const HealthStatus(
HealthSeverity.warn, 'connection lost — retrying…');
_soundLost();
_scheduleReconnect();
}
}
@@ -1507,6 +1514,10 @@ class SessionCoordinator {
if (stale()) return;
reconnecting.value = false;
_everConnected = true;
if (_lostSounded) {
_lostSounded = false;
unawaited(sfx.play(const SfxCue(SfxKind.back)));
}
_resumeToken = sync.token;
_lastStateAt = DateTime.now().toUtc();
health.value = const HealthStatus(HealthSeverity.ok, 'connected');
@@ -1531,6 +1542,12 @@ class SessionCoordinator {
}
}
void _soundLost() {
if (!_everConnected || _lostSounded) return;
_lostSounded = true;
unawaited(sfx.play(const SfxCue(SfxKind.lost)));
}
void _invalidateAttempts() {
_epoch++;
_reconnectTimer?.cancel();