ringcentral-softphone 0.11.5 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/demos/inbound-call.ts +10 -2
- package/demos/outbound-call.ts +5 -2
- package/dist/demos/inbound-call.js +10 -2
- package/dist/demos/inbound-call.js.map +1 -1
- package/dist/demos/outbound-call.js +5 -2
- package/dist/demos/outbound-call.js.map +1 -1
- package/dist/src/call-session/streamer.d.ts +2 -1
- package/dist/src/call-session/streamer.js +13 -3
- package/dist/src/call-session/streamer.js.map +1 -1
- package/package.json +10 -10
- package/src/call-session/streamer.ts +9 -3
package/README.md
CHANGED
|
@@ -84,7 +84,10 @@ play -b 8 -r 8000 -e mu-law test.raw
|
|
|
84
84
|
- do not hard code `domain` and `outboundProxy`
|
|
85
85
|
- I tried `sip10.ringcentral.com:5096` as `outboundProxy`, it requires TLS instead of TCP
|
|
86
86
|
- I made TLS work, however for inbound call there is no INVITE message coming in, for outbound call "488 Not Acceptable Here"
|
|
87
|
+
- change the codec list in SDP could solve the 488 issue.
|
|
87
88
|
- check the code of PJSIP and refactor the code.
|
|
89
|
+
- with PJSIP 2.10, I have made TCP & TLS work.
|
|
90
|
+
- TLS is too complicated, next step is to copy PJSIP TCP example.
|
|
88
91
|
- Provide an easy way for developers to check the call info, such as who is calling, who is being called, etc.
|
|
89
92
|
|
|
90
93
|
## Dev Notes
|
package/demos/inbound-call.ts
CHANGED
|
@@ -29,10 +29,18 @@ const main = async () => {
|
|
|
29
29
|
writeStream.write(rtpPacket.payload);
|
|
30
30
|
});
|
|
31
31
|
|
|
32
|
-
// //
|
|
32
|
+
// // send audio to remote peer
|
|
33
33
|
// const streamer = callSession.streamAudio(fs.readFileSync('demos/test.raw'));
|
|
34
|
+
// // You may subscribe to the 'finished' event of the streamer to know when the audio sending is finished
|
|
35
|
+
// streamer.once('finished', () => {
|
|
36
|
+
// console.log('audio sending finished');
|
|
37
|
+
// });
|
|
38
|
+
// // you may pause/resume/stop audio sending at any time
|
|
34
39
|
// await waitFor({ interval: 3000 });
|
|
35
|
-
//
|
|
40
|
+
// streamer.pause();
|
|
41
|
+
// await waitFor({ interval: 3000 });
|
|
42
|
+
// streamer.resume();
|
|
43
|
+
// await waitFor({ interval: 2000 });
|
|
36
44
|
// streamer.stop();
|
|
37
45
|
|
|
38
46
|
// either you or the peer hang up
|
package/demos/outbound-call.ts
CHANGED
|
@@ -34,10 +34,13 @@ const main = async () => {
|
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
// // send audio to remote peer
|
|
37
|
-
// await waitFor({ interval: 2000 });
|
|
38
37
|
// const streamer = callSession.streamAudio(fs.readFileSync('demos/test.raw'));
|
|
39
|
-
//
|
|
38
|
+
// // You may subscribe to the 'finished' event of the streamer to know when the audio sending is finished
|
|
39
|
+
// streamer.once('finished', () => {
|
|
40
|
+
// console.log('audio sending finished');
|
|
41
|
+
// });
|
|
40
42
|
// // you may pause/resume/stop audio sending at any time
|
|
43
|
+
// await waitFor({ interval: 3000 });
|
|
41
44
|
// streamer.pause();
|
|
42
45
|
// await waitFor({ interval: 3000 });
|
|
43
46
|
// streamer.resume();
|
|
@@ -36,10 +36,18 @@ const main = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
36
36
|
callSession.on('audioPacket', (rtpPacket) => {
|
|
37
37
|
writeStream.write(rtpPacket.payload);
|
|
38
38
|
});
|
|
39
|
-
// //
|
|
39
|
+
// // send audio to remote peer
|
|
40
40
|
// const streamer = callSession.streamAudio(fs.readFileSync('demos/test.raw'));
|
|
41
|
+
// // You may subscribe to the 'finished' event of the streamer to know when the audio sending is finished
|
|
42
|
+
// streamer.once('finished', () => {
|
|
43
|
+
// console.log('audio sending finished');
|
|
44
|
+
// });
|
|
45
|
+
// // you may pause/resume/stop audio sending at any time
|
|
41
46
|
// await waitFor({ interval: 3000 });
|
|
42
|
-
//
|
|
47
|
+
// streamer.pause();
|
|
48
|
+
// await waitFor({ interval: 3000 });
|
|
49
|
+
// streamer.resume();
|
|
50
|
+
// await waitFor({ interval: 2000 });
|
|
43
51
|
// streamer.stop();
|
|
44
52
|
// either you or the peer hang up
|
|
45
53
|
callSession.once('disposed', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound-call.js","sourceRoot":"","sources":["../../demos/inbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAGpB,iEAAyC;AACzC,wCAAwC;AAExC,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;CACpC,CAAC,CAAC;AACH,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB;AAEtD,MAAM,IAAI,GAAG,GAAS,EAAE;IACtB,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC3B,sBAAsB;IACtB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAO,aAAa,EAAE,EAAE;QAC7C,mBAAmB;QACnB,qCAAqC;QACrC,0CAA0C;QAE1C,kBAAkB;QAClB,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE1D,gBAAgB;QAChB,MAAM,WAAW,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,SAAoB,EAAE,EAAE;YACrD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH
|
|
1
|
+
{"version":3,"file":"inbound-call.js","sourceRoot":"","sources":["../../demos/inbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAGpB,iEAAyC;AACzC,wCAAwC;AAExC,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;CACpC,CAAC,CAAC;AACH,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB;AAEtD,MAAM,IAAI,GAAG,GAAS,EAAE;IACtB,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC3B,sBAAsB;IACtB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAO,aAAa,EAAE,EAAE;QAC7C,mBAAmB;QACnB,qCAAqC;QACrC,0CAA0C;QAE1C,kBAAkB;QAClB,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAE1D,gBAAgB;QAChB,MAAM,WAAW,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,SAAoB,EAAE,EAAE;YACrD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,+BAA+B;QAC/B,+EAA+E;QAC/E,0GAA0G;QAC1G,oCAAoC;QACpC,2CAA2C;QAC3C,MAAM;QACN,yDAAyD;QACzD,qCAAqC;QACrC,oBAAoB;QACpB,qCAAqC;QACrC,qBAAqB;QACrB,qCAAqC;QACrC,mBAAmB;QAEnB,iCAAiC;QACjC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,qCAAqC;QACrC,6BAA6B;QAC7B,qCAAqC;QACrC,6BAA6B;QAE7B,sBAAsB;QACtB,qCAAqC;QACrC,wBAAwB;QAExB,uBAAuB;QACvB,qCAAqC;QACrC,sEAAsE;IACxE,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAA,CAAC;AACF,IAAI,EAAE,CAAC"}
|
|
@@ -39,10 +39,13 @@ const main = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
39
39
|
writeStream.close();
|
|
40
40
|
});
|
|
41
41
|
// // send audio to remote peer
|
|
42
|
-
// await waitFor({ interval: 2000 });
|
|
43
42
|
// const streamer = callSession.streamAudio(fs.readFileSync('demos/test.raw'));
|
|
44
|
-
//
|
|
43
|
+
// // You may subscribe to the 'finished' event of the streamer to know when the audio sending is finished
|
|
44
|
+
// streamer.once('finished', () => {
|
|
45
|
+
// console.log('audio sending finished');
|
|
46
|
+
// });
|
|
45
47
|
// // you may pause/resume/stop audio sending at any time
|
|
48
|
+
// await waitFor({ interval: 3000 });
|
|
46
49
|
// streamer.pause();
|
|
47
50
|
// await waitFor({ interval: 3000 });
|
|
48
51
|
// streamer.resume();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbound-call.js","sourceRoot":"","sources":["../../demos/outbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAEpB,oEAAqC;AAErC,iEAAyC;AAEzC,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;CACpC,CAAC,CAAC;AACH,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB;AAEtD,MAAM,IAAI,GAAG,GAAS,EAAE;IACtB,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC3B,MAAM,IAAA,wBAAO,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,+FAA+F;IAC/F,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,CACtC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAmB,EAAE,EAAE,CAAC,CAE9C,CAAC;IAEF,0BAA0B;IAC1B,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAS,EAAE;QACtC,gBAAgB;QAChB,MAAM,WAAW,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,SAAoB,EAAE,EAAE;YACrD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,iCAAiC;QACjC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,+BAA+B;QAC/B
|
|
1
|
+
{"version":3,"file":"outbound-call.js","sourceRoot":"","sources":["../../demos/outbound-call.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,4CAAoB;AAEpB,oEAAqC;AAErC,iEAAyC;AAEzC,MAAM,SAAS,GAAG,IAAI,mBAAS,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IACvC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;IACtD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;CACpC,CAAC,CAAC;AACH,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB;AAEtD,MAAM,IAAI,GAAG,GAAS,EAAE;IACtB,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC3B,MAAM,IAAA,wBAAO,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,+FAA+F;IAC/F,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,CACtC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAmB,EAAE,EAAE,CAAC,CAE9C,CAAC;IAEF,0BAA0B;IAC1B,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAS,EAAE;QACtC,gBAAgB;QAChB,MAAM,WAAW,GAAG,YAAE,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAAC,MAAM,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,SAAoB,EAAE,EAAE;YACrD,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,iCAAiC;QACjC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,+BAA+B;QAC/B,+EAA+E;QAC/E,0GAA0G;QAC1G,oCAAoC;QACpC,2CAA2C;QAC3C,MAAM;QACN,yDAAyD;QACzD,qCAAqC;QACrC,oBAAoB;QACpB,qCAAqC;QACrC,qBAAqB;QACrB,qCAAqC;QACrC,mBAAmB;QAEnB,eAAe;QACf,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,qCAAqC;QACrC,6BAA6B;QAC7B,qCAAqC;QACrC,6BAA6B;QAE7B,sBAAsB;QACtB,qCAAqC;QACrC,wBAAwB;QAExB,uBAAuB;QACvB,qCAAqC;QACrC,sEAAsE;IACxE,CAAC,CAAA,CAAC,CAAC;IAEH,+CAA+C;IAC/C,qCAAqC;IACrC,wBAAwB;AAC1B,CAAC,CAAA,CAAC;AACF,IAAI,EAAE,CAAC"}
|
|
@@ -8,11 +8,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
const werift_rtp_1 = require("werift-rtp");
|
|
16
|
+
const events_1 = __importDefault(require("events"));
|
|
13
17
|
const utils_1 = require("../utils");
|
|
14
|
-
class Streamer {
|
|
18
|
+
class Streamer extends events_1.default {
|
|
15
19
|
constructor(callSesstion, buffer) {
|
|
20
|
+
super();
|
|
16
21
|
this.paused = false;
|
|
17
22
|
this.sequenceNumber = (0, utils_1.randomInt)();
|
|
18
23
|
this.timestamp = (0, utils_1.randomInt)();
|
|
@@ -50,7 +55,6 @@ class Streamer {
|
|
|
50
55
|
sendPacket() {
|
|
51
56
|
if (!this.callSession.disposed && !this.paused && !this.finished) {
|
|
52
57
|
const temp = this.buffer.subarray(0, 160);
|
|
53
|
-
this.buffer = this.buffer.subarray(160);
|
|
54
58
|
const rtpPacket = new werift_rtp_1.RtpPacket(new werift_rtp_1.RtpHeader({
|
|
55
59
|
version: 2,
|
|
56
60
|
padding: false,
|
|
@@ -74,7 +78,13 @@ class Streamer {
|
|
|
74
78
|
this.sequenceNumber = 0;
|
|
75
79
|
}
|
|
76
80
|
this.timestamp += 160; // inbound audio use this time interval, in my opinion, it should be 20
|
|
77
|
-
|
|
81
|
+
this.buffer = this.buffer.subarray(160);
|
|
82
|
+
if (this.finished) {
|
|
83
|
+
this.emit('finished');
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
setTimeout(() => this.sendPacket(), 20);
|
|
87
|
+
}
|
|
78
88
|
}
|
|
79
89
|
}
|
|
80
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamer.js","sourceRoot":"","sources":["../../../src/call-session/streamer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"streamer.js","sourceRoot":"","sources":["../../../src/call-session/streamer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ringcentral-softphone",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"homepage": "https://github.com/ringcentral/ringcentral-softphone-ts",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/src/softphone.js",
|
|
@@ -12,24 +12,24 @@
|
|
|
12
12
|
"prepublishOnly": "rm -rf *.raw && rm -rf dist && yarn tsc"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@rc-ex/core": "^1.4.
|
|
16
|
-
"wait-for-async": "^0.
|
|
15
|
+
"@rc-ex/core": "^1.4.2",
|
|
16
|
+
"wait-for-async": "^0.7.0",
|
|
17
17
|
"werift-rtp": "^0.8.1"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@types/node": "^22.
|
|
21
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
22
|
-
"@typescript-eslint/parser": "^8.
|
|
20
|
+
"@types/node": "^22.7.9",
|
|
21
|
+
"@typescript-eslint/eslint-plugin": "^8.11.0",
|
|
22
|
+
"@typescript-eslint/parser": "^8.11.0",
|
|
23
23
|
"dotenv-override-true": "^6.2.2",
|
|
24
24
|
"eslint": "^8.57.0",
|
|
25
25
|
"eslint-config-alloy": "^5.1.2",
|
|
26
26
|
"eslint-config-prettier": "^9.1.0",
|
|
27
27
|
"eslint-plugin-prettier": "^5.2.1",
|
|
28
28
|
"prettier": "^3.3.3",
|
|
29
|
-
"sort-package-json": "^2.10.
|
|
30
|
-
"tsx": "^4.
|
|
31
|
-
"ttpt": "^0.
|
|
32
|
-
"typescript": "^5.
|
|
29
|
+
"sort-package-json": "^2.10.1",
|
|
30
|
+
"tsx": "^4.19.1",
|
|
31
|
+
"ttpt": "^0.12.6",
|
|
32
|
+
"typescript": "^5.6.3",
|
|
33
33
|
"yarn-upgrade-all": "^0.7.4"
|
|
34
34
|
},
|
|
35
35
|
"yarn-upgrade-all": {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { RtpHeader, RtpPacket } from 'werift-rtp';
|
|
2
|
+
import EventEmitter from 'events';
|
|
2
3
|
|
|
3
4
|
import type CallSession from '.';
|
|
4
5
|
import { randomInt } from '../utils';
|
|
5
6
|
|
|
6
|
-
class Streamer {
|
|
7
|
+
class Streamer extends EventEmitter {
|
|
7
8
|
public paused = false;
|
|
8
9
|
private callSession: CallSession;
|
|
9
10
|
private buffer: Buffer;
|
|
@@ -13,6 +14,7 @@ class Streamer {
|
|
|
13
14
|
private ssrc = randomInt();
|
|
14
15
|
|
|
15
16
|
public constructor(callSesstion: CallSession, buffer: Buffer) {
|
|
17
|
+
super();
|
|
16
18
|
this.callSession = callSesstion;
|
|
17
19
|
this.buffer = buffer;
|
|
18
20
|
this.originalBuffer = buffer;
|
|
@@ -44,7 +46,6 @@ class Streamer {
|
|
|
44
46
|
private sendPacket() {
|
|
45
47
|
if (!this.callSession.disposed && !this.paused && !this.finished) {
|
|
46
48
|
const temp = this.buffer.subarray(0, 160);
|
|
47
|
-
this.buffer = this.buffer.subarray(160);
|
|
48
49
|
const rtpPacket = new RtpPacket(
|
|
49
50
|
new RtpHeader({
|
|
50
51
|
version: 2,
|
|
@@ -71,7 +72,12 @@ class Streamer {
|
|
|
71
72
|
this.sequenceNumber = 0;
|
|
72
73
|
}
|
|
73
74
|
this.timestamp += 160; // inbound audio use this time interval, in my opinion, it should be 20
|
|
74
|
-
|
|
75
|
+
this.buffer = this.buffer.subarray(160);
|
|
76
|
+
if (this.finished) {
|
|
77
|
+
this.emit('finished');
|
|
78
|
+
} else {
|
|
79
|
+
setTimeout(() => this.sendPacket(), 20);
|
|
80
|
+
}
|
|
75
81
|
}
|
|
76
82
|
}
|
|
77
83
|
}
|