1
resposta

[Dúvida] Desafio do Áudio

Estou com uma questão, adicionei os áudios de uma maneira diferente do professor e tive problema com o de pause. Quando se clica para dar pause, as vezes ele funciona e as vezes não. Alguém para tirar minha dúvida? Meu código está assim =

const html = document.querySelector ('html'); const focoBt = document.querySelector ('.app__card-button--foco'); const curtoBt = document.querySelector ('.app__card-button--curto'); const longoBt = document.querySelector ('.app__card-button--longo'); const banner = document.querySelector ('.app__image'); const titulo = document.querySelector ('.app__title'); const botoes = document.querySelectorAll ('.app__card-button');

const startPauseBt = document.querySelector ('#start-pause'); const inicioContador = new Audio ('./sons/play.wav'); const pauseContador = new Audio ('./sons/pause.mp3')

startPauseBt.addEventListener ('click', () => { if (inicioContador.paused) { inicioContador.play() } else { pauseContador.play(); inicioContador.pause(); } if (startPauseBt.innerText === 'Começar') { startPauseBt.innerText = 'Pausar' } else { startPauseBt.innerText = 'Começar' } });

const musicaFocoInput = document.querySelector ('#alternar-musica'); const musica = new Audio('./sons/luna-rise-part-one.mp3');

let tempoDecorridoEmSegundos = 5; let intervaloId = null;

musica.loop = true;

musicaFocoInput.addEventListener ('change', () => { if (musica.paused) { musica.play() } else { musica.pause() } });

focoBt.addEventListener('click', () => { alterarContexto ('foco') focoBt.classList.add('active') });

curtoBt.addEventListener ('click', () => { alterarContexto ('descanso-curto') curtoBt.classList.add('active') });

longoBt.addEventListener ('click', () => { alterarContexto ('descanso-longo') longoBt.classList.add('active') });

function alterarContexto(contexto) { botoes.forEach(function(contexto) { contexto.classList.remove('active') }) html.setAttribute('data-contexto', contexto) banner.setAttribute('src', ./imagens/${contexto}.png) switch (contexto) { case "foco": titulo.innerHTML = Otimize sua produtividade,<br> <strong class="app__title-strong">mergulhe no que importa.</strong>

        break;

    case "descanso-curto":
        titulo.innerHTML = `Que tal dar uma respirada?<br>
        <strong class="app__title-strong">Faça uma pausa curta!</strong>`

        break;

    case "descanso-longo":
        titulo.innerHTML = `Hora de voltar à superfície.<br>
        <strong class="app__title-strong">Faça uma pausa longa!</strong>`

    default:
        break;
}

};

const fimDoContador = new Audio ('./sons/beep.mp3') const contagemRegressiva = () => { if (tempoDecorridoEmSegundos <= 0) { fimDoContador.play () zerar() return } tempoDecorridoEmSegundos -= 1 };

startPauseBt.addEventListener ('click', iniciarOuPausar)

function iniciarOuPausar () { if (intervaloId) { zerar() return } intervaloId = setInterval(contagemRegressiva, 1000) };

function zerar () { clearInterval(intervaloId) intervaloId = null }

1 resposta

Pelo que você descreveu, parece que o problema está relacionado à maneira como você está tentando pausar e retomar os áudios. Um ponto de atenção no seu código é a lógica para alternar entre pausar e reproduzir o áudio de início (inicioContador) e pausa (pauseContador). Vamos refinar essa lógica:

Problema Potencial com o Áudio de Pausa

O trecho de código que controla a reprodução e a pausa dos sons de início e de pausa está projetado para sempre tocar o som de pausa quando não está pausado, o que pode não ser o comportamento desejado, especialmente se você pretende que pauseContador toque apenas uma vez quando o usuário clica para pausar.

Melhorando a Lógica de Reprodução/Pausa

Para resolver o problema descrito, você pode ajustar a lógica para garantir que o áudio de pausa (pauseContador) seja tratado corretamente. Uma maneira de fazer isso é garantir que o áudio de pausa seja tocado somente quando você efetivamente pausa o contador, e não a cada clique que alternadamente toca os sons de início e pausa.

Exemplo de Código Refinado

Aqui está uma maneira refinada de manipular os cliques no botão de iniciar/pausar, simplificando a lógica de decisão e focando na alternância entre estados de reprodução e pausa:

startPauseBt.addEventListener('click', () => {
    // Toggle entre começar e pausar
    if (startPauseBt.innerText === 'Começar') {
        if (inicioContador.paused) {
            inicioContador.play();
        }
        startPauseBt.innerText = 'Pausar';
        // Inicia a música de fundo se estiver pausada
        if (musica.paused) {
            musica.play();
        }
        // Continuar o contador
        iniciarOuPausar();
    } else {
        // Toca o som de pause somente se estava tocando o som de iniciar
        if (!inicioContador.paused) {
            pauseContador.play();
            inicioContador.pause(); // Certifique-se de pausar o som de iniciar
        }
        startPauseBt.innerText = 'Começar';
        // Pausa a música de fundo
        if (!musica.paused) {
            musica.pause();
        }
        // Pausa o contador
        iniciarOuPausar();
    }
});

Nesse ajuste, eu foquei em garantir que a música de fundo e o contador também sejam pausados e retomados juntamente com a alternância do texto do botão. Além disso, a lógica foi simplificada para tornar mais clara a intenção de cada parte do código. Essa abordagem deve ajudar a resolver o problema de inconsistência ao tentar pausar o áudio.

Observações Adicionais

  • Certifique-se de que os áudios inicioContador e pauseContador sejam gerenciados corretamente para não sobrepor um ao outro de maneiras não intencionais.
  • É uma boa prática verificar se o áudio terminou antes de tentar tocá-lo novamente, especialmente se você está lidando com áudios curtos que podem ser acionados várias vezes rapidamente.

Espero que essa solução ajude a resolver o problema que você está enfrentando com o botão de pausa. Se houver mais alguma coisa com a qual você precise de ajuda, fique à vontade para perguntar!

Insira aqui a descrição dessa imagem para ajudar na acessibilidade