**Regression fix**: when synthesis of segment N+1 ran longer than the playback of segment N (e.g. 5 s synth for a 1.5 s "Bonjour !"), the previous MediaPlayer was already in the Completed state by the time we queued the next one. setNextMediaPlayer() on a Completed player is a documented silent no-op — so the second sentence never started and the user only heard the first part of the reply. Rewrote playChainedMediaPlayers with per-player CompletableDeferred tracking: before calling setNext we check whether current's done has fired; after awaiting completion we verify next really auto-started (checking isPlaying / currentPosition) and call start() explicitly if the chain missed. Belt-and-suspenders against the race either way. Removed the now-unused waitForPlaybackCompletion helper. **Visual change**: in-sphere spectrum bars replaced with three superimposed Bézier "deforming lines", mirrored above/below a central baseline, with a soft cosine taper so the curves decay to zero at the sphere's left/right edges (matches the circular mask). Each line has its own slow-moving phase + gain + thickness + alpha so the three overlap to give depth — closer to an oscilloscope trace than an EQ. Low-level sin jitter keeps the lines alive during quiet passages, amplitude-gated so true silence is a flat line. User-facing change: no bars anymore. The sphere now "breathes" with flowing waveforms matching its voice. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| app | ||
| gradle/wrapper | ||
| COMPILE_WHISPER_NPU.md | ||
| RAPPORT_TTS_NPU.md | ||
| RAPPORT_TTS_QWEN3_TESTS.md | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| settings.gradle.kts | ||