@@ -30,10 +30,10 @@ function MediaElementAudioStream(element, options) {
30
30
// https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/createScriptProcessor
31
31
// Possible values: null, 256, 512, 1024, 2048, 4096, 8192, 16384
32
32
// however, webkitAudioContext (safari) requires it to be set
33
- bufferSize : ( typeof AudioContext != "undefined" ? null : 4096 ) ,
33
+ bufferSize : ( window . AudioContext ? 4096 : null ) ,
34
34
muteSource : false ,
35
35
autoPlay : true ,
36
- crossOrigin : " anonymous" , // required for cross-domain audio playback
36
+ crossOrigin : ' anonymous' , // required for cross-domain audio playback
37
37
objectMode : true // true = emit AudioBuffers w/ audio + some metadata, false = emite node.js Buffers (with binary data only
38
38
} ) ;
39
39
@@ -68,14 +68,14 @@ function MediaElementAudioStream(element, options) {
68
68
// onaudioprocess can be called at least once after we've stopped
69
69
if ( recording ) {
70
70
// todo: interleave channels in binary mode
71
- self . push ( options . objectMode ? e . inputBuffer : new Buffer ( e . inputBuffer . getChannelData ( 0 ) ) ) ;
71
+ self . push ( options . objectMode ? e . inputBuffer : new Buffer ( e . inputBuffer . getChannelData ( 0 ) ) ) ;
72
72
}
73
73
}
74
74
75
75
var AudioContext = window . AudioContext || window . webkitAudioContext ;
76
76
// cache the source node & context since it's not possible to recreate it later
77
77
var context = element . context = element . context || new AudioContext ( ) ;
78
- var audioInput = element . node = element . node || context . createMediaElementSource ( element ) ;
78
+ var audioInput = element . node = element . node || context . createMediaElementSource ( element ) ;
79
79
var scriptProcessor = context . createScriptProcessor ( options . bufferSize , inputChannels , outputChannels ) ;
80
80
81
81
scriptProcessor . onaudioprocess = processAudio ;
@@ -96,41 +96,49 @@ function MediaElementAudioStream(element, options) {
96
96
audioInput . connect ( scriptProcessor ) ;
97
97
// other half of workaround for chrome bugs
98
98
scriptProcessor . connect ( context . destination ) ;
99
- element . removeEventListener ( " playing" , connect ) ;
99
+ element . removeEventListener ( ' playing' , connect ) ;
100
100
}
101
- element . addEventListener ( " playing" , connect ) ;
101
+ element . addEventListener ( ' playing' , connect ) ;
102
102
103
- // https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
104
- // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState
103
+ /**
104
+ * @see https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Media_events
105
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState
106
+ */
105
107
function start ( ) {
106
108
element . play ( ) ;
107
- element . removeEventListener ( " canplaythrough" , start ) ;
109
+ element . removeEventListener ( ' canplaythrough' , start ) ;
108
110
}
109
111
if ( options . autoPlay ) {
110
112
// play immediately if we have enough data, otherwise wait for the canplaythrough event
111
- if ( element . readyState === element . HAVE_ENOUGH_DATA ) {
113
+ if ( element . readyState === element . HAVE_ENOUGH_DATA ) {
112
114
element . play ( ) ;
113
115
} else {
114
- element . addEventListener ( " canplaythrough" , start ) ;
116
+ element . addEventListener ( ' canplaythrough' , start ) ;
115
117
}
116
118
}
117
119
120
+ /**
121
+ * cleanup
122
+ */
118
123
function end ( ) {
119
124
recording = false ;
120
125
scriptProcessor . disconnect ( ) ;
121
126
audioInput . disconnect ( ) ;
122
- //context.close(); // this prevents us from re-using the same audio element until the page is refreshed
127
+ // context.close(); // this prevents us from re-using the same audio element until the page is refreshed
123
128
self . push ( null ) ;
124
129
self . emit ( 'close' ) ;
125
130
}
126
- element . addEventListener ( " ended" , end ) ;
131
+ element . addEventListener ( ' ended' , end ) ;
127
132
133
+ /**
134
+ * external API
135
+ */
128
136
this . stop = function ( ) {
129
137
element . pause ( ) ;
130
138
end ( ) ;
131
139
} ;
132
140
133
- element . addEventListener ( " error" , this . emit . bind ( this , 'error' ) ) ;
141
+ element . addEventListener ( ' error' , this . emit . bind ( this , 'error' ) ) ;
134
142
135
143
process . nextTick ( function ( ) {
136
144
// this is more useful for binary mode than object mode, but it won't hurt either way
0 commit comments