Node.js приостановка и возобновление потоков с помощью функции setTimeout()

#javascript #node.js #settimeout #node.js-stream

#javascript #node.js #settimeout #node.js-поток

Вопрос:

Я работаю с Node.js (v4.4.7) и написали несколько строк для воспроизведения звука…

 const Speaker = require('audio-speaker/stream');
const Generator = require('audio-generator/stream');

const speaker = new Speaker({
        channels: 1,          // 1 channel 
        bitDepth: 16,         // 16-bit samples 
        sampleRate: 44100     // 44,100 Hz sample rate 
      });

// Streams sample values...
const sound = new Generator(
        //Generator function, returns sample values
        function (time) {
               return Math.sin(Math.PI * 2 * time * 2000);
        },
        {
        //Duration of generated stream, in seconds, after which stream will end. 
        duration: Infinity,

        //Periodicity of the time. 
        period: Infinity
       });

// Pipe value stream to speaker
sound.pipe(speaker);
  

…ура, это работает! Теперь давайте попробуем приостановить звук и возобновить его через 3 секунды …

 sound.pause();

setTimeout(()=>{
        sound.resume();
        console.log(sound.isPaused());   //  => false
}, 3000);
  

… блестяще, это тоже работает! А теперь давайте попробуем наоборот и приостановим звук через 3 секунды…

 setTimeout(()=>{
        sound.pause();
        console.log(sound.isPaused()); // => true / although sound is still playing 
}, 3000);
  

… подождите, почему это не работает? И почему это звучит.isPaused() показывает «true», хотя звук все еще воспроизводится. Это ошибка или я делаю что-то не так?

Я прошел через Node.js документация и несколько руководств о потоках в Node.js и не мог найти объяснения.В этом руководстве они используют только setTimout() для возобновления потоков, но они ничего не говорят о том, почему вы не можете приостановить поток таким образом.

Комментарии:

1. Поделитесь полным исходным кодом, который не работает

2. Что вы имеете в виду? Это полный код.

3. Это буферная вещь? Вы ждете 3 секунды, чтобы сделать паузу, может быть, в течение этого времени происходит буферизация данных, поэтому звук продолжается? Останавливается ли это в конечном итоге?

4. Я сократил время ожидания всего до 10 мс, но звук продолжает звучать даже через несколько минут. В итоге я вызвал метод .cork() / uncork для динамика, который обеспечивает желаемый результат. Но мне все еще интересно, почему .pause()/.resume() не работает. Есть ли способ сразу удалить возможные буферизованные данные, просто чтобы убедиться, что звук пустой?

Ответ №1:

На данный момент я не знаю, почему вызов .pause()/.resume() в читаемом потоке работает не так, как ожидалось. В итоге я вызвал .cork()/.uncork() в записываемом потоке, что позволило достичь желаемого результата.

 setTimeout(()=>{
    speaker.cork();
}, 3000);

setTimeout(()=>{
    speaker.uncork();
}, 3000);
  

Я обновлю этот ответ, как только у меня будет объяснение такого поведения.