sip-lab 1.33.0 → 1.34.1

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/DEV.md CHANGED
@@ -54,7 +54,7 @@ However the above will build the addon to run on the current OS.
54
54
 
55
55
  Instead we will force the build on debian11 (using docker) using prebuildify-cross. So do this instead:
56
56
 
57
- Make sure you have the docker image built.
57
+ Make sure you have the docker image built (the image must be rebuilt whenever we update build_deps.sh)
58
58
 
59
59
  cd docker-images/debian11/
60
60
  ./build_image.sh
package/build_deps.sh CHANGED
@@ -39,7 +39,7 @@ then
39
39
  git clone https://github.com/MayamaTakeshi/bcg729
40
40
  cd bcg729
41
41
  git checkout faaa895862165acde6df8add722ba4f85a25007d
42
- cmake .
42
+ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .
43
43
  make
44
44
  mkdir -p lib
45
45
  cp -f src/libbcg729.a lib
@@ -70,6 +70,8 @@ EOF
70
70
  #define PJSUA_MAX_ACC (20000)
71
71
  #define PJ_IOQUEUE_MAX_HANDLES (1024)
72
72
  #define PJSUA_MAX_CALLS (20000)
73
+
74
+ #define PJMEDIA_HAS_OPUS_CODEC 1
73
75
  EOF
74
76
  make dep && make clean && make
75
77
  fi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sip-lab",
3
- "version": "1.33.0",
3
+ "version": "1.34.1",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "engines": {
Binary file
Binary file
package/samples/g729.js CHANGED
@@ -77,6 +77,23 @@ async function test() {
77
77
  },
78
78
  ], 1000)
79
79
 
80
+ sip.call.start_record_wav(oc.id, {file: './oc.wav'})
81
+ sip.call.start_record_wav(ic.id, {file: './ic.wav'})
82
+
83
+ sip.call.start_play_wav(oc.id, {file: 'samples/artifacts/yosemitesam.wav', end_of_file_event: true, no_loop: true})
84
+ sip.call.start_play_wav(ic.id, {file: 'samples/artifacts/yosemitesam.wav', end_of_file_event: true, no_loop: true})
85
+
86
+ await z.wait([
87
+ {
88
+ event: 'end_of_file',
89
+ call_id: oc.id,
90
+ },
91
+ {
92
+ event: 'end_of_file',
93
+ call_id: ic.id,
94
+ },
95
+ ], 3000)
96
+
80
97
  sip.call.reinvite(oc.id)
81
98
 
82
99
  await z.wait([
@@ -173,6 +190,9 @@ async function test() {
173
190
  assert(oc_stat.CodecInfo == 'G729/8000/1')
174
191
  assert(ic_stat.CodecInfo == 'G729/8000/1')
175
192
 
193
+ sip.call.stop_record_wav(oc.id)
194
+ sip.call.stop_record_wav(ic.id)
195
+
176
196
  sip.call.terminate(oc.id)
177
197
 
178
198
  await z.wait([
@@ -0,0 +1,236 @@
1
+ var sip = require ('../index.js')
2
+ var Zeq = require('@mayama/zeq')
3
+ var z = new Zeq()
4
+ var m = require('data-matching')
5
+ var sip_msg = require('sip-matching')
6
+ var sdp = require('sdp-matching')
7
+
8
+ var assert = require('assert')
9
+
10
+ async function test() {
11
+ //sip.set_log_level(6)
12
+ sip.dtmf_aggregation_on(500)
13
+
14
+ z.trap_events(sip.event_source, 'event', (evt) => {
15
+ var e = evt.args[0]
16
+ return e
17
+ })
18
+
19
+ console.log(sip.start((data) => { console.log(data)} ))
20
+
21
+ t1 = sip.transport.create({address: "127.0.0.1", type: 'udp'})
22
+ t2 = sip.transport.create({address: "127.0.0.1", type: 'udp'})
23
+
24
+ console.log("t1", t1)
25
+ console.log("t2", t2)
26
+
27
+ console.log(sip.get_codecs())
28
+ sip.set_codecs("opus/48000/2:128")
29
+
30
+ flags = 0
31
+
32
+ oc = sip.call.create(t1.id, {from_uri: 'sip:alice@test.com', to_uri: `sip:bob@${t2.address}:${t2.port}`})
33
+
34
+ await z.wait([
35
+ {
36
+ event: "incoming_call",
37
+ call_id: m.collect("call_id"),
38
+ },
39
+ {
40
+ event: 'response',
41
+ call_id: oc.id,
42
+ method: 'INVITE',
43
+ msg: sip_msg({
44
+ $rs: '100',
45
+ $rr: 'Trying',
46
+ }),
47
+ },
48
+ ], 1000)
49
+
50
+ ic = {
51
+ id: z.store.call_id,
52
+ sip_call_id: z.store.sip_call_id,
53
+ }
54
+
55
+ sip.call.respond(ic.id, {code: 200, reason: 'OK'})
56
+
57
+ await z.wait([
58
+ {
59
+ event: 'media_update',
60
+ call_id: oc.id,
61
+ status: 'ok',
62
+ },
63
+ {
64
+ event: 'media_update',
65
+ call_id: ic.id,
66
+ status: 'ok',
67
+ },
68
+ {
69
+ event: 'response',
70
+ call_id: oc.id,
71
+ method: 'INVITE',
72
+ msg: sip_msg({
73
+ $rs: '200',
74
+ $rr: 'OK',
75
+ 'hdr_content_type': 'application/sdp',
76
+ $rb: '!{_}a=sendrecv',
77
+ }),
78
+ },
79
+ ], 1000)
80
+
81
+ sip.call.start_record_wav(oc.id, {file: './oc.wav'})
82
+ sip.call.start_record_wav(ic.id, {file: './ic.wav'})
83
+
84
+ sip.call.start_play_wav(oc.id, {file: 'samples/artifacts/yosemitesam.wav', end_of_file_event: true, no_loop: true})
85
+ sip.call.start_play_wav(ic.id, {file: 'samples/artifacts/yosemitesam.wav', end_of_file_event: true, no_loop: true})
86
+
87
+ await z.wait([
88
+ {
89
+ event: 'end_of_file',
90
+ call_id: oc.id,
91
+ },
92
+ {
93
+ event: 'end_of_file',
94
+ call_id: ic.id,
95
+ },
96
+ ], 3000)
97
+
98
+ sip.call.reinvite(oc.id)
99
+
100
+ await z.wait([
101
+ {
102
+ event: 'reinvite',
103
+ call_id: ic.id
104
+ },
105
+ ], 1000)
106
+
107
+ sip.call.respond(ic.id, {code: 200, reason: 'OK'})
108
+
109
+ await z.wait([
110
+ {
111
+ event: 'response',
112
+ call_id: oc.id,
113
+ method: 'INVITE',
114
+ msg: sip_msg({
115
+ $rs: '100',
116
+ }),
117
+ },
118
+ {
119
+ event: 'response',
120
+ call_id: oc.id,
121
+ method: 'INVITE',
122
+ msg: sip_msg({
123
+ $rs: '200',
124
+ $rr: 'OK',
125
+ $rb: '!{_}a=sendrecv',
126
+ }),
127
+ },
128
+ {
129
+ event: 'media_update',
130
+ call_id: oc.id,
131
+ status: 'ok',
132
+ },
133
+ {
134
+ event: 'media_update',
135
+ call_id: ic.id,
136
+ status: 'ok',
137
+ },
138
+ ], 500)
139
+
140
+ sip.call.reinvite(oc.id, false, 0)
141
+
142
+ await z.wait([
143
+ {
144
+ event: 'reinvite',
145
+ call_id: ic.id
146
+ },
147
+ ], 1000)
148
+
149
+ sip.call.respond(ic.id, {code: 200, reason: 'OK'})
150
+
151
+ await z.wait([
152
+ {
153
+ event: 'response',
154
+ call_id: oc.id,
155
+ method: 'INVITE',
156
+ msg: sip_msg({
157
+ $rs: '100',
158
+ }),
159
+ },
160
+ {
161
+ event: 'response',
162
+ call_id: oc.id,
163
+ method: 'INVITE',
164
+ msg: sip_msg({
165
+ $rs: '200',
166
+ $rr: 'OK',
167
+ $rb: '!{_}a=sendrecv',
168
+ }),
169
+ },
170
+ {
171
+ event: 'media_update',
172
+ call_id: oc.id,
173
+ status: 'ok',
174
+ },
175
+ {
176
+ event: 'media_update',
177
+ call_id: ic.id,
178
+ status: 'ok',
179
+ },
180
+ ], 500)
181
+
182
+ oc_stat = sip.call.get_stream_stat(oc.id, {media_id: 0})
183
+ ic_stat = sip.call.get_stream_stat(ic.id, {media_id: 0})
184
+
185
+ console.log(oc_stat)
186
+ console.log(ic_stat)
187
+
188
+ oc_stat = JSON.parse(oc_stat)
189
+ ic_stat = JSON.parse(ic_stat)
190
+
191
+ assert(oc_stat.CodecInfo == 'opus/8000/1')
192
+ assert(ic_stat.CodecInfo == 'opus/8000/1')
193
+
194
+ await z.sleep(100)
195
+
196
+ sip.call.send_dtmf(oc.id, {digits: '12', mode: 1})
197
+ sip.call.send_dtmf(ic.id, {digits: '21', mode: 1})
198
+
199
+ await z.sleep(1000)
200
+
201
+ sip.call.stop_record_wav(oc.id)
202
+ sip.call.stop_record_wav(ic.id)
203
+
204
+ sip.call.terminate(oc.id)
205
+
206
+ await z.wait([
207
+ {
208
+ event: 'call_ended',
209
+ call_id: oc.id,
210
+ },
211
+ {
212
+ event: 'call_ended',
213
+ call_id: ic.id,
214
+ },
215
+ {
216
+ event: 'response',
217
+ call_id: oc.id,
218
+ method: 'BYE',
219
+ msg: sip_msg({
220
+ $rs: '200',
221
+ $rr: 'OK',
222
+ }),
223
+ },
224
+ ], 1000)
225
+
226
+ console.log("Success")
227
+
228
+ sip.stop()
229
+ process.exit(0)
230
+ }
231
+
232
+ test()
233
+ .catch(e => {
234
+ console.error(e)
235
+ process.exit(1)
236
+ })
package/src/sip.cpp CHANGED
@@ -1558,6 +1558,29 @@ int __pjw_init() {
1558
1558
  addon_log(L_DBG, "pjmedia_codec_opus_init failed\n");
1559
1559
  return 1;
1560
1560
  }
1561
+ pjmedia_codec_param param;
1562
+ pjmedia_codec_opus_config opus_cfg;
1563
+
1564
+ pjmedia_codec_mgr *codec_mgr;
1565
+ codec_mgr = pjmedia_endpt_get_codec_mgr(g_med_endpt);
1566
+
1567
+ unsigned cnt = 1;
1568
+ const pjmedia_codec_info *pci;
1569
+
1570
+ pj_str_t codec_id = pj_str((char*)"opus/48000/2");
1571
+ pjmedia_codec_mgr_find_codecs_by_id(codec_mgr, &codec_id, &cnt, &pci, NULL);
1572
+ pjmedia_codec_mgr_get_default_param(codec_mgr, pci, &param);
1573
+ pjmedia_codec_opus_get_config(&opus_cfg);
1574
+
1575
+ opus_cfg.sample_rate = 8000;
1576
+ opus_cfg.channel_cnt = 1;
1577
+ opus_cfg.bit_rate = 8000;
1578
+ status = pjmedia_codec_opus_set_default_param(&opus_cfg, &param);
1579
+ if(status != PJ_SUCCESS)
1580
+ {
1581
+ addon_log(L_DBG, "pjmedia_codec_opus_set_default_param failed\n");
1582
+ return 1;
1583
+ }
1561
1584
  #endif
1562
1585
 
1563
1586
  #if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)