@@ -18,6 +18,75 @@ eventer(messageEvent,function(e) {
18
18
}
19
19
} , false ) ;
20
20
21
+ //// PCM player ////
22
+ var buffer = [ ] ;
23
+ var playing = false ;
24
+ var lock = false ;
25
+ // Check for audio stop to reset buffer
26
+ setInterval ( function ( ) {
27
+ if ( playing ) {
28
+ if ( ! lock ) {
29
+ buffer = [ ] ;
30
+ playing = false ;
31
+ }
32
+ lock = false ;
33
+ }
34
+ } , 100 ) ;
35
+ function PCM ( ) {
36
+ this . init ( )
37
+ }
38
+ // Player Init
39
+ PCM . prototype . init = function ( ) {
40
+ // Establish audio context
41
+ this . audioCtx = new ( window . AudioContext || window . webkitAudioContext ) ( {
42
+ sampleRate : 44100
43
+ } )
44
+ this . audioCtx . resume ( )
45
+ this . gainNode = this . audioCtx . createGain ( )
46
+ this . gainNode . gain . value = 1
47
+ this . gainNode . connect ( this . audioCtx . destination )
48
+ this . startTime = this . audioCtx . currentTime
49
+ }
50
+ // Stereo player
51
+ PCM . prototype . feed = function ( data ) {
52
+ lock = true ;
53
+ // Convert bytes to typed array then float32 array
54
+ let i16Array = new Int16Array ( data , 0 , data . length ) ;
55
+ let f32Array = Float32Array . from ( i16Array , x => x / 32767 ) ;
56
+ buffer = new Float32Array ( [ ...buffer , ...f32Array ] ) ;
57
+ let buffAudio = this . audioCtx . createBuffer ( 2 , buffer . length , 44100 ) ;
58
+ let duration = buffAudio . duration / 2 ;
59
+ if ( ( duration > .05 ) || ( playing ) ) {
60
+ playing = true ;
61
+ let buffSource = this . audioCtx . createBufferSource ( ) ;
62
+ let arrLength = buffer . length / 2 ;
63
+ let left = buffAudio . getChannelData ( 0 ) ;
64
+ let right = buffAudio . getChannelData ( 1 ) ;
65
+ let byteCount = 0 ;
66
+ let offset = 1 ;
67
+ for ( let count = 0 ; count < arrLength ; count ++ ) {
68
+ left [ count ] = buffer [ byteCount ] ;
69
+ byteCount += 2 ;
70
+ right [ count ] = buffer [ offset ] ;
71
+ offset += 2 ;
72
+ }
73
+ buffer = [ ] ;
74
+ if ( this . startTime < this . audioCtx . currentTime ) {
75
+ this . startTime = this . audioCtx . currentTime ;
76
+ }
77
+ buffSource . buffer = buffAudio ;
78
+ buffSource . connect ( this . gainNode ) ;
79
+ buffSource . start ( this . startTime ) ;
80
+ this . startTime += duration ;
81
+ }
82
+ }
83
+ // Destroy player
84
+ PCM . prototype . destroy = function ( ) {
85
+ buffer = [ ] ;
86
+ playing = false ;
87
+ this . audioCtx . close ( ) ;
88
+ this . audioCtx = null ;
89
+ } ;
21
90
22
91
// Handle Toggle divs
23
92
function openToggle ( id ) {
@@ -76,7 +145,7 @@ function audio() {
76
145
return ;
77
146
}
78
147
socket . emit ( 'open' , '' ) ;
79
- player = new PCMPlayer ( ) ;
148
+ player = new PCM ( ) ;
80
149
$ ( '#audioButton' ) . addClass ( "icons-selected" ) ;
81
150
}
82
151
0 commit comments