6 pontos por GN⁺ 2025-02-17 | 1 comentários | Compartilhar no WhatsApp
  • Descoberta do problema: Foi identificado em um notebook novo um problema de ruído branco intermitente saindo dos alto-falantes. Só era possível ouvir em um ambiente silencioso.

  • Análise da causa: Ao verificar o estado do sink de áudio do PulseAudio, foi constatado que não havia som no estado SUSPENDED, mas que o ruído branco ocorria nos estados IDLE ou RUNNING.

  • Problema no Firefox: O Firefox aparecia como o programa que estava usando o sink de áudio, e o ruído branco ocorria mesmo sem nenhuma aba aberta reproduzindo som.

  • Causa: Descobriu-se que o som de notificação do outlook.office.com era a causa do problema. Sempre que um e-mail chegava, o ruído branco começava e só parava ao recarregar a aba ou reiniciar o Firefox.

  • Consumo de bateria: Quando o ruído branco ocorria, o consumo de CPU e bateria aumentava.

  • Tentativa de solução: Tentou-se resolver o problema desativando as notificações de e-mail, mas problemas semelhantes também aconteciam em outros websites.

  • Processamento de áudio em HTML/JavaScript: Há a tag `` e a WebAudio API como formas de reproduzir áudio. Foi confirmado que a causa do problema ocorre ao criar um AudioContext.

  • Diferença entre Firefox e Chrome: O Chrome interrompe automaticamente o desperdício de bateria/CPU depois de certo tempo, mas o Firefox não.

  • Solução: Foi desenvolvida uma extensão que interrompe automaticamente o AudioContext e o reinicia quando necessário. Não é perfeita, mas é eficaz o suficiente.

1 comentários

 
GN⁺ 2025-02-17
Comentários do Hacker News
  • Esse problema é conhecido e importante. Deve ser resolvido em breve. Pedem desculpas por ainda não ter sido corrigido por uma questão de prioridade. Pessoalmente, é uma prioridade alta

    • É mais complexo do que parar o contexto de áudio após certo tempo, mas dá para resolver. Como outras pessoas já fizeram isso, é possível. Estão dispostos a aceitar compromissos
    • Fonte: implementador do Firefox e editor do padrão da Web Audio API
  • Um site que abre um contexto de áudio e não reproduz nada provavelmente está fazendo detecção de bots

    • Outros motores de navegador e sistemas operacionais implementam o processamento de áudio de formas diferentes. Reproduzir um som totalmente inaudível e gravá-lo de volta gera uma assinatura
    • Essa assinatura pode ser usada para verificar se o navegador está mentindo sobre o user agent, se está rodando em modo headless ou se não é um usuário real
  • Fico curioso se o mesmo problema também acontece em dispositivos Android

  • Esse ruído branco me deixou maluco por muito tempo, mas eu não conseguia rastrear a origem

    • O ícone de "reproduzindo" não aparece na aba, e silenciar a aba não faz o ruído parar
    • Mesmo silenciando o Firefox pelo mixer de volume do Windows, o ruído não para
    • Edit: para usuários de desktop, o ruído branco fica iniciando e parando o tempo todo, o que é muito irritante
  • Quando a saída fica ociosa, o sinal digital SPDIF perde a sincronização. Quando a reprodução começa, ele volta a sincronizar, mas isso leva tempo, e você perde os primeiros segundos do áudio. Já escrevi um programa que mantém a saída aberta sem despejar dados na linha para evitar que a saída fique ociosa

    • Em notebooks, economizar energia é mais importante
  • Isso talvez explique um problema no Firefox para Android em que, às vezes, o celular consumia 10 GB de dados por dia. Um site de notícias reproduzia áudio e recarregava anúncios repetidamente, e a aba não entrava em modo de economia de energia por causa do áudio. Tive que mudar para o Chrome por causa das cobranças recorrentes de dados

  • No Chromium, o código que lida com essa interrupção está aqui

    • Basicamente, depois de detectar cerca de 30 segundos de silêncio, ele troca do sink suportado pelo dispositivo de áudio do SO para um null sink
    • Observação: como ele usa um relógio diferente do dispositivo de áudio, pode haver distorção em certos tons quando o contexto finalmente for usado. A solução alternativa é o site usar a API de suspend/resume mencionada no artigo
  • Também notei um problema parecido no macOS (consumo de energia induzido por áudio, sem ruído branco)

    • No momento, o coreaudiod do Mac está usando 20% da CPU mesmo sem reproduzir nada. Estou pensando em mudar para outro navegador até isso ser corrigido, mas não quero abandonar o Firefox
    • Atualização: parece ser um bug relacionado, mas diferente
  • Esse problema corrige a página inicial de https://www.dr.dk/

  • Não entendo bem como o audioContext é implementado, mas ele é muito inteligente e dinâmico. Reproduzir um som de notificação é como desenhar SVG com D3. Fico pensando se existe algum hook de serviceWorker em uma API mais eficiente que permita registrar tarefas repetitivas simples, como um manipulador de notificações