1
1
importScripts ( "libopus.js" ) ;
2
2
var handle_ = null ;
3
3
var encoding_ = false , decoding_ = false ;
4
- var in_ = null , out_ = null , max_packet_size_ = null ;
4
+ var in_ = null , out_ = null , out2_ = null , max_packet_size_ = null ;
5
5
var sampling_ = null , channels_ = null , framesize_ = null ;
6
- var float_ = false ;
6
+ var float_ = false , deinterleave = false ;
7
7
onmessage = function ( ev ) {
8
8
const OPUS_OK = 0 ;
9
9
const OPUS_APPLICATION_AUDIO = 2049 ;
@@ -15,6 +15,7 @@ onmessage = function(ev) {
15
15
channels_ = data . channels ;
16
16
framesize_ = data . framesize ;
17
17
if ( data . float ) float_ = true ;
18
+ if ( data . deinterleave ) deinterleave = true ;
18
19
if ( ! sampling_ || ! channels_ || ( data . type !== 'encoder' && data . type !== 'decoder' ) ) {
19
20
postMessage ( "argument error" ) ;
20
21
return ;
@@ -31,6 +32,8 @@ onmessage = function(ev) {
31
32
in_ = _malloc ( max_packet_size_ ) ;
32
33
framesize_ = 120 /*[ms]*/ * sampling_ / 1000 ;
33
34
out_ = _malloc ( framesize_ * channels_ * ( float_ ? 4 : 2 ) ) ;
35
+ if ( deinterleave )
36
+ out2_ = _malloc ( framesize_ * channels_ * ( float_ ? 4 : 2 ) ) ;
34
37
}
35
38
if ( getValue ( i32ptr , 'i32' ) != OPUS_OK ) {
36
39
postMessage ( "opus_" + ( encoding_ ? "encoder" : "decoder" ) + "_create: failed. err=" + getValue ( i32ptr , 'i32' ) ) ;
@@ -80,7 +83,18 @@ onmessage = function(ev) {
80
83
postMessage ( "opus_decode failed. err=" + ret ) ;
81
84
return ;
82
85
}
83
- ret *= channels_ * ( float_ ? 4 : 2 ) ;
84
- postMessage ( HEAPU8 . buffer . slice ( out_ , out_ + ret ) ) ;
86
+ var bytes_per_sample = ( float_ ? 4 : 2 ) ;
87
+ if ( deinterleave && channels_ === 2 && float_ ) {
88
+ var l = out2_ >>> 2 ;
89
+ var r = l + ret ;
90
+ var m = out_ >>> 2 ;
91
+ for ( var i = 0 ; i < ret ; i ++ ) {
92
+ HEAPF32 [ l + i ] = HEAPF32 [ m + i * 2 + 0 ] ;
93
+ HEAPF32 [ r + i ] = HEAPF32 [ m + i * 2 + 1 ] ;
94
+ }
95
+ postMessage ( HEAPU8 . buffer . slice ( out2_ , out2_ + ( ret * channels_ * bytes_per_sample ) ) ) ;
96
+ } else {
97
+ postMessage ( HEAPU8 . buffer . slice ( out_ , out_ + ( ret * channels_ * bytes_per_sample ) ) ) ;
98
+ }
85
99
}
86
100
} ;
0 commit comments