Transcriptie 19 — providerneutrale audiobron van een OciDeck-call #2527

Closed
opened 2026-10-22 20:05:30 +00:00 by brenno · 3 comments
Owner

Bovenliggend callticket: #2526 · Epic: #2508
Afhankelijk van: een echte in-app calladapter, #2509, #2510, #2535 en de echte callproef #2538

Gebruikersdoel

Een opname van mijn OciDeck-call bevat mijn daadwerkelijk uitgezonden stem en de hoorbare andere deelnemers, zonder luidsprekerloopback of dubbele bronnen.

Basis en afhankelijkheid

Er is nog geen productieadapter voor het werkelijk deelnemen aan een call: meeting_session_provider.dart houdt daarom in de draaiende app geen echte sessie vast. MeetingParticipant.audio is een opaque MeetingTrack met id/kind, geen PCM- of Opus-leesinterface. MeetingCapabilities.audio betekent callaudio, niet opnamerecht of een beschikbare tap. Dit issue volgt op een werkende in-app adapter die de relevante mediatacks kan leveren.

Werk

  • Ontwerp en implementeer de kleinste providerneutrale audio-uitvoer achter MeetingSession/MeetingMediaCore voor opname: expliciet lokale uitgaande audio na mute en ontvangen remote audio na decodering, met tijdstempels en bronidentiteit. Houd de concrete WebRTC-track buiten de UI en buiten het bestaande opaque MeetingTrack-presentatiecontract.
  • Bepaal en toets per adapter/platform of deze uitvoer echt kan worden verkregen; voeg een aparte opname-capability met reden toe. Verwar een provideropname-indicator niet met toegang tot audiobytes.
  • Behandel join/leave, mute/unmute, nieuwe/wegvallende deelnemers, track replacement, reconnect en eventuele media-E2EE zonder een stille backdoor. Bij niet beschikbare remote audio is de hele-call-knop niet beschikbaar; een alleen-microfoon-opname mag niet als hele call worden gelabeld.

Acceptatie

  • Fake- en integratietests tonen lokale post-mute en remote bronnen afzonderlijk, juiste tijdlijn, geen dubbeltelling, geen feedback en geen ongewenste opname van een gedempte microfoon.
  • Bij trackwissel/verlies verandert de capability/status direct; een test bewijst dat een opaque track-id alleen geen opname start.
  • Een echte tweepersoonscall op iedere geclaimde adapter/platform levert de audiobronnen aantoonbaar; ontbrekende adapters blijven expliciet niet ondersteund.

Code/ontwerp

lib/meetings/meeting_provider.dart, meeting_participant.dart, meeting_media_core.dart, meeting_media_core_webrtc.dart; docs/design/NATIVE_CALLS.md §3, §7.

**Bovenliggend callticket:** [#2526](https://pawprint.vigilis.online/LibreKAT/Ocideck/issues/2526) · **Epic:** [#2508](https://pawprint.vigilis.online/LibreKAT/Ocideck/issues/2508) **Afhankelijk van:** een echte in-app calladapter, [#2509](https://pawprint.vigilis.online/LibreKAT/Ocideck/issues/2509), [#2510](https://pawprint.vigilis.online/LibreKAT/Ocideck/issues/2510), [#2535](https://pawprint.vigilis.online/LibreKAT/Ocideck/issues/2535) en de echte callproef [#2538](https://pawprint.vigilis.online/LibreKAT/Ocideck/issues/2538) ## Gebruikersdoel Een opname van mijn OciDeck-call bevat mijn daadwerkelijk uitgezonden stem en de hoorbare andere deelnemers, zonder luidsprekerloopback of dubbele bronnen. ## Basis en afhankelijkheid Er is nog geen productieadapter voor het werkelijk deelnemen aan een call: `meeting_session_provider.dart` houdt daarom in de draaiende app geen echte sessie vast. `MeetingParticipant.audio` is een opaque `MeetingTrack` met id/kind, geen PCM- of Opus-leesinterface. `MeetingCapabilities.audio` betekent callaudio, niet opnamerecht of een beschikbare tap. Dit issue volgt op een werkende in-app adapter die de relevante mediatacks kan leveren. ## Werk - Ontwerp en implementeer de kleinste providerneutrale audio-uitvoer achter `MeetingSession`/`MeetingMediaCore` voor opname: expliciet lokale uitgaande audio na mute en ontvangen remote audio na decodering, met tijdstempels en bronidentiteit. Houd de concrete WebRTC-track buiten de UI en buiten het bestaande opaque `MeetingTrack`-presentatiecontract. - Bepaal en toets per adapter/platform of deze uitvoer echt kan worden verkregen; voeg een aparte opname-capability met reden toe. Verwar een provideropname-indicator niet met toegang tot audiobytes. - Behandel join/leave, mute/unmute, nieuwe/wegvallende deelnemers, track replacement, reconnect en eventuele media-E2EE zonder een stille backdoor. Bij niet beschikbare remote audio is de hele-call-knop niet beschikbaar; een alleen-microfoon-opname mag niet als hele call worden gelabeld. ## Acceptatie - [ ] Fake- en integratietests tonen lokale post-mute en remote bronnen afzonderlijk, juiste tijdlijn, geen dubbeltelling, geen feedback en geen ongewenste opname van een gedempte microfoon. - [ ] Bij trackwissel/verlies verandert de capability/status direct; een test bewijst dat een opaque track-id alleen geen opname start. - [ ] Een echte tweepersoonscall op iedere geclaimde adapter/platform levert de audiobronnen aantoonbaar; ontbrekende adapters blijven expliciet niet ondersteund. ## Code/ontwerp `lib/meetings/meeting_provider.dart`, `meeting_participant.dart`, `meeting_media_core.dart`, `meeting_media_core_webrtc.dart`; `docs/design/NATIVE_CALLS.md` §3, §7.
Author
Owner

De naad staat op main (PR #2588, cd5e12fbcfab).

call_audio_source.dart is de providerneutrale tap: lokale uitgaande audio ná mute en remote audio ná decodering, met tijdstip en bron. flutter_webrtc 1.6 levert die samples niet (MediaRecorder schrijft een INPUT/OUTPUT-mix). De capability meldt daarom noPerSourceTap. startCallAudioCapture geeft niets terug. Een track-id en het opname-lampje starten geen opname, en alleen de microfoon is geen hele call.

Dit issue blijft open. De acceptatie vraagt een echte tweepersoonscall op elk platform dat de tap beweert te kunnen; die proef is niet gedaan.

De naad staat op main (PR #2588, `cd5e12fbcfab`). `call_audio_source.dart` is de providerneutrale tap: lokale uitgaande audio ná mute en remote audio ná decodering, met tijdstip en bron. flutter_webrtc 1.6 levert die samples niet (`MediaRecorder` schrijft een INPUT/OUTPUT-mix). De capability meldt daarom `noPerSourceTap`. `startCallAudioCapture` geeft niets terug. Een track-id en het opname-lampje starten geen opname, en alleen de microfoon is geen hele call. Dit issue blijft open. De acceptatie vraagt een echte tweepersoonscall op elk platform dat de tap beweert te kunnen; die proef is niet gedaan.
Author
Owner

De naad staat op main (PR #2588, cd5e12fbc). De capability meldt dat de huidige binding geen audiotap per deelnemer heeft, en een track-id of het lampje van de vergadering start niets.

De echte tweepersoonsproef wordt los gedaan, in #2531 en #2545–#2548. Dit ticket gaat daarom dicht. Een opname van een echte vergadering is niet bewezen.

De naad staat op main (PR #2588, `cd5e12fbc`). De capability meldt dat de huidige binding geen audiotap per deelnemer heeft, en een track-id of het lampje van de vergadering start niets. De echte tweepersoonsproef wordt los gedaan, in #2531 en #2545–#2548. Dit ticket gaat daarom dicht. Een opname van een echte vergadering is niet bewezen.
Author
Owner

Geland via #2595 (merge cb597ae8ce).

Wat de bron nu is. De binding kon het niet → eigen fork van flutter_webrtc (audioTrackFrames(track) → per-track s16le PCM over een event-channel, gemerged in fork-main via LibreKAT/flutter_webrtc#1, upstream-patch flutter-webrtc/flutter-webrtc#2250). OciDeck: openCallAudioCapture(fact, taps) met concurrente merge — asyncExpand pauzeerde de taps-bron zolang een framestroom liep, dus eigen merge met één subscription per tap; resample 16k mono; post-mute onderdrukking in de tap zelf; sessie stempelt participantId via de roster.

Bewijs (echte tweepersoonscalls, testbed stable-11248).

  • macOS integratietest: TAP-PROEF remote=6 local=6 remoteMaxAmp=9 mutedLocal=0 unmuteLocal=400 — remote gedecodeerde PCM met amplitude, lokale frames stoppen bij setMicrophone(false) en hervatten na unmute, tijdstempels monotoon.
  • web (echte Chrome + Playwright, gebouwde bundle): ~13 brok/s remote-only gedempt → ~23/s na unmute → ~12/s na re-mute; opname-indicator + live teller zichtbaar.

Eerlijke grens. wholeCall wordt alleen geclaimd op macOS en web; Windows, Linux, iOS en Android melden noPerSourceTap tot een echte proef het tegendeel zegt — geen dode opnameknop.

Vrijgave vraagde een binding met per-bron audio-access — die is er nu.

Geland via #2595 (merge `cb597ae8ce`). **Wat de bron nu is.** De binding kon het niet → eigen fork van `flutter_webrtc` (`audioTrackFrames(track)` → per-track s16le PCM over een event-channel, gemerged in fork-main via LibreKAT/flutter_webrtc#1, upstream-patch flutter-webrtc/flutter-webrtc#2250). OciDeck: `openCallAudioCapture(fact, taps)` met concurrente merge — `asyncExpand` pauzeerde de taps-bron zolang een framestroom liep, dus eigen merge met één subscription per tap; resample 16k mono; post-mute onderdrukking in de tap zelf; sessie stempelt participantId via de roster. **Bewijs (echte tweepersoonscalls, testbed stable-11248).** - macOS integratietest: `TAP-PROEF remote=6 local=6 remoteMaxAmp=9 mutedLocal=0 unmuteLocal=400` — remote gedecodeerde PCM met amplitude, lokale frames stoppen bij `setMicrophone(false)` en hervatten na unmute, tijdstempels monotoon. - web (echte Chrome + Playwright, gebouwde bundle): ~13 brok/s remote-only gedempt → ~23/s na unmute → ~12/s na re-mute; opname-indicator + live teller zichtbaar. **Eerlijke grens.** `wholeCall` wordt alleen geclaimd op macOS en web; Windows, Linux, iOS en Android melden `noPerSourceTap` tot een echte proef het tegendeel zegt — geen dode opnameknop. Vrijgave vraagde een binding met per-bron audio-access — die is er nu.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2527
No description provided.