3.2 KiB
3.2 KiB
PR-005: Host Audio Fallible Init and Headless Tolerance
Briefing
O host desktop atual assume que audio de saida esta sempre disponivel e funcional. Em ambientes headless, CI, VMs remotas ou sistemas sem device compativel, a inicializacao usa expect(...) e encerra o processo.
Este PR torna a pilha de audio tolerante a falhas de infraestrutura. O runtime deve continuar operando sem audio quando o host nao puder inicializar a saida sonora.
Problema
default_output_device()pode retornarNone.build_output_stream(...)pode falhar por formato/configuracao.stream.play()pode falhar por indisponibilidade do backend.- Todas essas falhas hoje derrubam o binario com
panic!.
Escopo
- Trocar inicializacao panica por API fallible.
- Permitir degradacao controlada para "sem audio".
- Manter telemetria/log suficiente para diagnostico.
- Cobrir o fluxo em testes de unidade onde viavel.
Fora de Escopo
- Rework do mixer.
- Selecao automatica de formatos de audio mais sofisticada.
- Hot-reload de device de audio.
- Simulacao de audio em buffer offline.
Abordagem
- Mudar
HostAudio::initpara retornarResult<(), HostAudioError>ou tipo equivalente. - Representar explicitamente o estado "audio indisponivel":
producer = Nonestream = None- stats continuam funcionando sem crash.
- No chamador, registrar aviso e seguir execucao sem audio.
- Garantir que
send_commandseupdate_statssejam no-op seguros quando o audio nao estiver ativo.
Algoritmo
Inicializacao
- Buscar
default_output_device. - Se nao existir:
- retornar erro de inicializacao controlado.
- Tentar construir
StreamConfigebuild_output_stream. - Se falhar:
- retornar erro controlado sem panicar.
- Tentar
play(). - Se falhar:
- retornar erro controlado sem panicar.
- Apenas em caso de sucesso preencher
producer,perf_consumere_stream.
Degradacao
- O host chama
init. - Se
Ok, audio ativo. - Se
Err, loga a falha e continua sem audio. - O loop principal segue responsivo e funcional.
Criterios de Aceite
- O runtime nao entra em
panic!quando nao existe device de audio. - O runtime nao entra em
panic!quandobuild_output_streamfalha. - O runtime nao entra em
panic!quandoplay()falha. send_commandseupdate_statscontinuam seguros sem stream ativo.- O host continua executando cartridge em modo sem audio.
- Logs deixam claro por que o audio foi desativado.
Tests
- Introduzir testes de unidade para o estado sem audio:
send_commandsnao falha quandoproducereNone;update_statsnao falha quandoperf_consumereNone.
- Se a estrutura atual permitir injecao de dependencia:
- testar caminho
no output device; - testar falha na criacao do stream;
- testar falha no
play.
- testar caminho
- Se injecao ainda nao existir, criar uma camada minima de abstracao para tornar esses cenarios testaveis sem depender do hardware real.
- Rodar:
cargo test -p prometeu-host-desktop-winitcargo test --workspace
Risco
Baixo. A mudanca principal e de robustez operacional. O maior cuidado e nao esconder a falha completamente; o modo sem audio precisa ser explicito em logs.