2016-10-03 9 views
0

Я работаю с Node.js (V4.4.7) и написал несколько строк, чтобы играть звук ...Node.js и возобновлять потоки с SetTimeout()

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); 

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

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

+0

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

+0

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

+0

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

ответ

0

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

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

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

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