All checks were successful
Intrepid/Prometeu/Runtime/pipeline/head This commit looks good
209 lines
8.3 KiB
Markdown
209 lines
8.3 KiB
Markdown
---
|
|
id: AGD-0048
|
|
ticket: background-service-audio-execution
|
|
title: Agenda - Background Service and Audio Execution
|
|
status: open
|
|
created: 2026-07-05
|
|
resolved:
|
|
decision:
|
|
tags: [runtime, os, lifecycle, service, audio, background, architecture]
|
|
---
|
|
|
|
# Agenda - Background Service and Audio Execution
|
|
|
|
## Contexto
|
|
|
|
O runtime ja tem sinais claros de preparacao para multitarefa controlada:
|
|
|
|
- `TaskState::Background` existe como estado de tarefa;
|
|
- `VmSession` separa estado mutavel de VM por tarefa/processo;
|
|
- `SystemOS` e dono de lifecycle, task/process, VM sessions, filesystem,
|
|
memcard, windows e logging;
|
|
- a spec de eventos separa foreground ownership de execution eligibility;
|
|
- o contrato atual declara que execucao real em background fica fora do v1, mas
|
|
o modelo foi desenhado para permitir servicos ou processos de midia no futuro.
|
|
|
|
O caso motivador e:
|
|
|
|
```text
|
|
Game foreground -> Home -> music player -> escolher musica -> voltar ao Game
|
|
```
|
|
|
|
Depois disso, o Game deve voltar ao foreground enquanto o player continua
|
|
executando e produzindo audio junto com audio do Game.
|
|
|
|
## Problema
|
|
|
|
Hoje o runtime preserva sessoes, mas nao tem contrato para uma sessao continuar
|
|
executando quando nao e foreground.
|
|
|
|
Os pontos atuais que bloqueiam o caso:
|
|
|
|
- `TaskKind` so distingue `Game` e `Shell`;
|
|
- `ProcessKind` so distingue `VmGame`, `VmShell` e `NativeShell`;
|
|
- `ProcessState` nao possui estado normativo de background-running;
|
|
- `GameRunningStep` ticka apenas o Game foreground;
|
|
- `ShellRunningStep` ticka apenas o Shell foreground;
|
|
- `HubHomeStep` nao ticka sessoes VM em background;
|
|
- `Audio` e `AudioMixer` usam vozes globais sem namespace por tarefa/sessao;
|
|
- cada logical frame chama `platform.audio_mut().clear_commands()`, o que torna
|
|
perigoso tickar dois produtores de audio no mesmo frame;
|
|
- pausa de lifecycle hoje emite `MasterPause`, afetando o mixer inteiro.
|
|
|
|
Sem uma decisao, background service pode virar apenas "tickar mais uma VM", mas
|
|
isso quebraria isolamento, audio, debugger, lifecycle e previsibilidade.
|
|
|
|
## Pontos Criticos
|
|
|
|
1. **Execution eligibility nao e foreground.**
|
|
O contrato atual ja separa os conceitos, mas a implementacao ainda so ticka o
|
|
owner foreground. Precisamos introduzir uma politica explicita de quem pode
|
|
executar em background.
|
|
|
|
2. **Servico nao e Shell escondido.**
|
|
Um music player pode ter UI de Shell para escolher musica, mas a reproducao
|
|
continua como servico quando a UI deixa o foreground. Fechar isso como
|
|
`Shell` em background confundiria janela, tarefa, sessao e servico.
|
|
|
|
3. **Audio precisa de origem.**
|
|
Hoje `voice_id` e global no mixer. Se Game e player usam `voice_id = 0`, um
|
|
sobrescreve o outro. Precisamos decidir se o mixer tera namespaces por
|
|
`AudioOwner`, se servicos terao pool dedicado, ou se o player nao usara a
|
|
mesma superficie `audio.*`.
|
|
|
|
4. **Pausa de Game nao pode pausar servico de midia.**
|
|
`MasterPause` global serve para o contrato atual de pausa/debug, mas nao
|
|
expressa "pausar Game audio e manter music player". Pausa precisa virar
|
|
escopo por origem ou politica de mixer.
|
|
|
|
5. **Servico precisa de lifecycle proprio.**
|
|
Deve existir contrato para start, foreground UI, background-running, stop,
|
|
crash, terminate, recurso negado, e talvez wake/resume de UI.
|
|
|
|
6. **Budget e determinismo precisam ser fechados.**
|
|
Se servicos rodam junto com Game, precisamos decidir cota por frame, ordem de
|
|
ticks, starvation, crash isolation, e se background service participa do
|
|
mesmo tempo deterministico da maquina.
|
|
|
|
7. **Sistema de apps precisa descobrir e lancar o player.**
|
|
Hoje Home lista Game cartridges e tem Shells nativos fixos. O caso de music
|
|
player exige decidir se ele e cartridge `System`, app instalado, Shell nativo,
|
|
ou novo perfil `Service`.
|
|
|
|
## Opcoes
|
|
|
|
### Opcao A - Background Service como novo tipo de processo/sessao
|
|
|
|
Criar contrato explicito para `Service`:
|
|
|
|
- `TaskKind::Service` ou entidade equivalente;
|
|
- `ProcessKind::VmService` / `NativeService`;
|
|
- execution eligibility independente de foreground;
|
|
- UI de controle opcional via Shell task associada ao servico;
|
|
- audio com origem por service/session;
|
|
- lifecycle proprio: start, background, foreground-control, stop, crash.
|
|
|
|
**Pros:**
|
|
- modela diretamente music player e futuros servicos;
|
|
- preserva a separacao entre UI foreground e execucao;
|
|
- evita transformar Shell em "processo que tambem e daemon";
|
|
- facilita quotas, permissao e observabilidade.
|
|
|
|
**Contras:**
|
|
- maior mudanca arquitetural;
|
|
- exige novo contrato em specs, SystemOS, firmware, audio e testes;
|
|
- precisa fechar politica de recursos antes de implementar.
|
|
|
|
**Manutencao:**
|
|
- melhor base para crescer com qualidade, desde que o MVP seja pequeno.
|
|
|
|
### Opcao B - Shell em background com audio permitido
|
|
|
|
Permitir que uma VM Shell continue tickando quando sai do foreground e use audio
|
|
normalmente.
|
|
|
|
**Pros:**
|
|
- reaproveita Shell, WindowManager e VM session existentes;
|
|
- menor numero de novos tipos no curto prazo.
|
|
|
|
**Contras:**
|
|
- mistura UI e servico;
|
|
- torna `TaskState::Background` semantico antes de definir `ProcessState`;
|
|
- abre precedente para qualquer Shell continuar executando;
|
|
- nao resolve sozinho namespace de audio, pause por origem, quotas e debugging.
|
|
|
|
**Manutencao:**
|
|
- atraente como atalho, mas tende a espalhar excecoes pela firmware state
|
|
machine.
|
|
|
|
### Opcao C - Audio player como servico nativo OS-owned, sem VM background
|
|
|
|
Implementar music player como servico nativo de SystemOS, controlado por uma
|
|
Shell UI. A reproducao continua no host/OS sem tickar VM em background.
|
|
|
|
**Pros:**
|
|
- entrega o caso de musica com menor risco para scheduler VM;
|
|
- evita abrir execucao arbitraria de background agora;
|
|
- audio service pode ser projetado como recurso OS-owned e depois exposto.
|
|
|
|
**Contras:**
|
|
- nao resolve background VM services em geral;
|
|
- player deixa de ser app userland completo no primeiro ciclo;
|
|
- precisa ainda fechar origem/mixagem de audio e relacao com UI.
|
|
|
|
**Manutencao:**
|
|
- bom MVP se o objetivo imediato for media playback, mas deve ser declarado como
|
|
`media service` nativo, nao como contrato geral de background VM.
|
|
|
|
## Sugestao / Recomendacao
|
|
|
|
Recomendo fechar em duas camadas:
|
|
|
|
1. **Decisao de arquitetura:** introduzir o conceito de service/background
|
|
execution como contrato de SystemOS, separado de foreground Shell e Game.
|
|
Essa decisao deve definir execution eligibility, lifecycle, quotas, crash
|
|
policy, controle de UI e relacao com VM sessions.
|
|
|
|
2. **MVP de media:** implementar primeiro um `media/audio service` com escopo
|
|
reduzido, preferencialmente OS-owned ou `Service` bem delimitado, antes de
|
|
permitir background VM arbitrario.
|
|
|
|
Para excelente qualidade, o primeiro plano nao deve tentar "qualquer app em
|
|
background". O alvo deve ser: um unico servico de audio/midia, com origem de
|
|
audio propria, controle por Hub/Shell, execucao enquanto Game esta foreground,
|
|
e testes end-to-end de mistura e lifecycle.
|
|
|
|
## Perguntas em Aberto
|
|
|
|
- O music player deve ser um cartridge `System`, um novo `Service`, ou um
|
|
servico nativo do OS controlado por Shell?
|
|
- A UI do player e a reproducao pertencem a mesma tarefa ou a tarefas
|
|
separadas?
|
|
- Um servico pode ter janela foreground temporaria e continuar sem janela?
|
|
- Quantos servicos background podem existir no MVP: um media service ou N
|
|
servicos?
|
|
- O background service recebe ticks todo frame, tick rate reduzido, ou apenas
|
|
eventos?
|
|
- O audio mixer deve isolar vozes por `TaskId`, `ProcessId`, `VmSessionId`,
|
|
`AppId`, ou novo `AudioOwner`?
|
|
- Como pausar apenas o audio do Game durante Home/debug sem pausar musica?
|
|
- O debugger inspeciona foreground session apenas ou tambem sessoes background?
|
|
- Como crash de servico e exibido: toast/log, janela de crash, ou parada
|
|
silenciosa com diagnostico?
|
|
- Que capacidades sao necessarias para media service: `audio`, `fs`, `asset`,
|
|
talvez `background_audio`?
|
|
|
|
## Criterio para Encerrar
|
|
|
|
Esta agenda pode virar decisao quando houver resposta escrita para:
|
|
|
|
- modelo de entidade (`Service` novo vs Shell background vs native OS service);
|
|
- execution eligibility e ordem de ticks;
|
|
- lifecycle e estados de task/process;
|
|
- ownership/namespace de audio e politica de pausa por origem;
|
|
- relacao entre UI foreground do player e reproducao background;
|
|
- escopo do MVP e explicitamente o que fica fora;
|
|
- testes obrigatorios de lifecycle, audio mixing, crash isolation e regressao do
|
|
contrato Game/Home/Shell existente.
|
|
|