M2-02: Playback — hear a memo #42
No reviewers
Labels
No labels
area/agent
area/capture
area/editor
area/geo
area/security
area/sync
area/transcription
area/ui
area/vault
area/voice-memos
blocked
milestone/M1
milestone/M2
milestone/M3
milestone/M4
needs-decision
needs-hardware
p0
p1
p2
type/bug
type/enhancement
type/feature
type/idea
type/infrastructure
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Stash/stash-ios!42
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "m2-02-playback"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #29.
A transport at the bottom of the memo detail screen — play/pause, a scrubber, elapsed and
remaining. It hangs off a safe area inset rather than the transcript list, because three of that
screen's four branches are not lists and playback must not depend on a transcript existing: a
memo whose words were deleted from the Files app is exactly one somebody wants to hear.
The substance is the audio session. Capture and playback hand it over and never share it —
PlaybackSessionmirrorsRecordingSession, each states its category on every activation, andneither inherits anything from the other. Playback refuses while a capture runs and answers with a
sentence rather than a dead button. A capture starting while a memo plays stops the playback on the
first line of
start(), synchronously, before the session is touched.One player for the app, like the recorder and the library, because two windows over one session is
two memos playing at once.
The decision record is
2026-08-09-handing-the-audio-session-between-capture-and-playback.mdinstash-docs, on the branch PR #5 carries.What the reviews changed
Four Codex passes, with every disposition in
.agent/m2-02-playback/SUMMARY.md. The four thatchanged the design rather than a detail:
delivers that change whenever it schedules the update, which can be after the session has already
been reconfigured for capture — and the pause would then deactivate the recording's session.
played the other window's recording.
releaseForCapture()gave up ownership and then declined to deactivate, so a start that failedat the microphone prompt left the playback session active with nobody able to release it.
What was validated
In the simulator, before this branch was pushed: a memo plays, pauses and resumes; a memo played to
its end rewinds and plays again from the start; tapping play during a recording says why; a
recording starts after a memo has been played; a memo plays after a recording has been stopped; a
memo whose audio will not decode says so, with no scrubber and no total, and goes on saying so when
play is tapped.
318 unit tests pass.
AudioDuration'sCMTimevalidation is the memo list's existing rule, whichhad never had a test until now.
What was NOT validated
around it are unexercised. This is the largest gap in the claim.
The build is on the device; those five are the on-device pass.