sip-lab 1.2.4

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.
Files changed (41) hide show
  1. package/README.md +38 -0
  2. package/a.js +280 -0
  3. package/binding.gyp +101 -0
  4. package/devjournal +435 -0
  5. package/index.js +68 -0
  6. package/install.sh +32 -0
  7. package/package.json +30 -0
  8. package/samples/late_negotiation.js +278 -0
  9. package/samples/simple.js +280 -0
  10. package/samples/sip_cancel.js +111 -0
  11. package/src/Makefile +42 -0
  12. package/src/README +3 -0
  13. package/src/addon.cpp +1418 -0
  14. package/src/event_templates.cpp +55 -0
  15. package/src/event_templates.hpp +27 -0
  16. package/src/idmanager.cpp +76 -0
  17. package/src/idmanager.hpp +26 -0
  18. package/src/log.cpp +18 -0
  19. package/src/log.hpp +15 -0
  20. package/src/packetdumper.cpp +234 -0
  21. package/src/packetdumper.hpp +67 -0
  22. package/src/pjmedia/Makefile +37 -0
  23. package/src/pjmedia/devjournal +26 -0
  24. package/src/pjmedia/include/chainlink/README +3 -0
  25. package/src/pjmedia/include/chainlink/chainlink.h +11 -0
  26. package/src/pjmedia/include/chainlink/chainlink_dtmfdet.h +56 -0
  27. package/src/pjmedia/include/chainlink/chainlink_tonegen.h +178 -0
  28. package/src/pjmedia/include/chainlink/chainlink_wav_port.h +231 -0
  29. package/src/pjmedia/include/chainlink/chainlink_wire_port.h +50 -0
  30. package/src/pjmedia/include/pjmedia/README +3 -0
  31. package/src/pjmedia/include/pjmedia/dtmfdet.h +74 -0
  32. package/src/pjmedia/src/chainlink/chainlink_dtmfdet.c +125 -0
  33. package/src/pjmedia/src/chainlink/chainlink_tonegen.c +901 -0
  34. package/src/pjmedia/src/chainlink/chainlink_wav_player.c +688 -0
  35. package/src/pjmedia/src/chainlink/chainlink_wav_writer.c +442 -0
  36. package/src/pjmedia/src/chainlink/chainlink_wire_port.c +93 -0
  37. package/src/pjmedia/src/pjmedia/dtmfdet.c +129 -0
  38. package/src/pjmedia/src/pjmedia/simpleua_dtmfdet.c +753 -0
  39. package/src/pjmedia/src/pjmedia/tonegen_dtmfdet.c +263 -0
  40. package/src/sip.cpp +4891 -0
  41. package/src/sip.hpp +64 -0
@@ -0,0 +1,278 @@
1
+ var sip = require ('../index.js')
2
+ var z = require('zester')
3
+ var m = require('data-matching')
4
+ var sip_msg = require('sip-matching')
5
+
6
+ //sip.set_log_level(6)
7
+ sip.dtmf_aggregation_on(500)
8
+
9
+ z.trap_events(sip.event_source, 'event', (evt) => {
10
+ var e = evt.args[0]
11
+ return e
12
+ })
13
+
14
+ console.log(sip.start((data) => { console.log(data)} ))
15
+
16
+ t1 = sip.transport.create("127.0.0.1", 5090, 1)
17
+ t2 = sip.transport.create("127.0.0.1", 5092, 1)
18
+
19
+ console.log("t1", t1)
20
+ console.log("t2", t2)
21
+
22
+ flags = 1 // late negotiation
23
+
24
+ oc = sip.call.create(t1.id, flags, 'sip:a@t', 'sip:b@127.0.0.1:5092')
25
+
26
+ z.wait([
27
+ {
28
+ event: "incoming_call",
29
+ call_id: m.collect("call_id"),
30
+ },
31
+ {
32
+ event: 'response',
33
+ call_id: oc.id,
34
+ method: 'INVITE',
35
+ msg: sip_msg({
36
+ $rs: '100',
37
+ $rr: 'Trying',
38
+ '$(hdrcnt(via))': 1,
39
+ '$hdr(call-id)': m.collect('sip_call_id'),
40
+ $fU: 'a',
41
+ $fd: 't',
42
+ $tU: 'b',
43
+ '$hdr(l)': '0',
44
+ }),
45
+ },
46
+ ], 1000)
47
+
48
+ ic = {
49
+ id: z.store.call_id,
50
+ sip_call_id: z.store.sip_call_id,
51
+ }
52
+
53
+ sip.call.respond(ic.id, 200, 'OK')
54
+
55
+ z.wait([
56
+ {
57
+ event: 'media_status',
58
+ call_id: oc.id,
59
+ status: 'setup_ok',
60
+ local_mode: 'sendrecv',
61
+ remote_mode: 'sendrecv',
62
+ },
63
+ {
64
+ event: 'media_status',
65
+ call_id: ic.id,
66
+ status: 'setup_ok',
67
+ local_mode: 'sendrecv',
68
+ remote_mode: 'sendrecv',
69
+ },
70
+ {
71
+ event: 'response',
72
+ call_id: oc.id,
73
+ method: 'INVITE',
74
+ msg: sip_msg({
75
+ $rs: '200',
76
+ $rr: 'OK',
77
+ '$(hdrcnt(VIA))': 1,
78
+ $fU: 'a',
79
+ $fd: 't',
80
+ $tU: 'b',
81
+ '$hdr(content-type)': 'application/sdp',
82
+ $rb: '!{_}a=sendrecv',
83
+ }),
84
+ },
85
+ ], 1000)
86
+
87
+ sip.call.send_dtmf(oc.id, '1234', 0)
88
+ sip.call.send_dtmf(ic.id, '4321', 1)
89
+
90
+ z.wait([
91
+ {
92
+ event: 'dtmf',
93
+ call_id: ic.id,
94
+ digits: '1234',
95
+ mode: 0,
96
+ },
97
+ {
98
+ event: 'dtmf',
99
+ call_id: oc.id,
100
+ digits: '4321',
101
+ mode: 1,
102
+ },
103
+ ], 2000)
104
+
105
+
106
+ sip.call.reinvite(oc.id, true, flags)
107
+
108
+ z.wait([
109
+ {
110
+ event: 'response',
111
+ call_id: oc.id,
112
+ method: 'INVITE',
113
+ msg: sip_msg({
114
+ $rs: '200',
115
+ $rr: 'OK',
116
+ $rb: '!{_}a=sendrecv',
117
+ }),
118
+ },
119
+ {
120
+ event: 'media_status',
121
+ call_id: oc.id,
122
+ status: 'setup_ok',
123
+ local_mode: 'sendonly',
124
+ remote_mode: 'sendrecv',
125
+ },
126
+ {
127
+ event: 'media_status',
128
+ call_id: ic.id,
129
+ status: 'setup_ok',
130
+ local_mode: 'recvonly',
131
+ remote_mode: 'sendonly',
132
+ },
133
+ ], 500)
134
+
135
+ sip.call.send_dtmf(oc.id, '1234', 0)
136
+ sip.call.send_dtmf(ic.id, '4321', 1) // This will not generate event 'dtmf'
137
+
138
+ z.wait([
139
+ {
140
+ event: 'dtmf',
141
+ call_id: ic.id,
142
+ digits: '1234',
143
+ mode: 0,
144
+ },
145
+ ], 2000)
146
+
147
+ sip.call.reinvite(ic.id, false, flags)
148
+
149
+ z.wait([
150
+ {
151
+ event: 'response',
152
+ call_id: ic.id,
153
+ method: 'INVITE',
154
+ msg: sip_msg({
155
+ $rs: '200',
156
+ $rr: 'OK',
157
+ $rb: '!{_}a=sendonly',
158
+ }),
159
+ },
160
+ {
161
+ event: 'media_status',
162
+ call_id: oc.id,
163
+ status: 'setup_ok',
164
+ local_mode: 'sendonly',
165
+ remote_mode: 'recvonly',
166
+ },
167
+ {
168
+ event: 'media_status',
169
+ call_id: ic.id,
170
+ status: 'setup_ok',
171
+ local_mode: 'recvonly',
172
+ remote_mode: 'sendonly',
173
+ },
174
+ ], 500)
175
+
176
+ sip.call.send_dtmf(oc.id, '1234', 0)
177
+ sip.call.send_dtmf(ic.id, '4321', 1) // This will not generate event 'dtmf'
178
+
179
+ z.wait([
180
+ {
181
+ event: 'dtmf',
182
+ call_id: ic.id,
183
+ digits: '1234',
184
+ mode: 0,
185
+ },
186
+ ], 2000)
187
+
188
+ sip.call.send_request(oc.id, 'INFO')
189
+
190
+ z.wait([
191
+ {
192
+ event: 'request',
193
+ call_id: ic.id,
194
+ msg: sip_msg({
195
+ $rm: 'INFO',
196
+ }),
197
+ },
198
+ {
199
+ event: 'response',
200
+ call_id: oc.id,
201
+ method: 'INFO',
202
+ msg: sip_msg({
203
+ $rs: '200',
204
+ $rr: 'OK',
205
+ }),
206
+ },
207
+ ], 500)
208
+
209
+ z.sleep(100)
210
+
211
+ sip.call.reinvite(oc.id, false, flags)
212
+
213
+ z.wait([
214
+ {
215
+ event: 'response',
216
+ call_id: oc.id,
217
+ method: 'INVITE',
218
+ msg: sip_msg({
219
+ $rs: '200',
220
+ $rr: 'OK',
221
+ $rb: '!{_}a=recvonly',
222
+ }),
223
+ },
224
+ {
225
+ event: 'media_status',
226
+ call_id: oc.id,
227
+ status: 'setup_ok',
228
+ local_mode: 'sendonly',
229
+ remote_mode: 'recvonly',
230
+ },
231
+ {
232
+ event: 'media_status',
233
+ call_id: ic.id,
234
+ status: 'setup_ok',
235
+ local_mode: 'recvonly',
236
+ remote_mode: 'sendonly',
237
+ },
238
+ ], 500)
239
+
240
+
241
+ sip.call.send_dtmf(oc.id, '1234', 0)
242
+ sip.call.send_dtmf(ic.id, '4321', 1) // This will not generate event 'dtmf'
243
+
244
+ z.wait([
245
+ {
246
+ event: 'dtmf',
247
+ call_id: ic.id,
248
+ digits: '1234',
249
+ mode: 0,
250
+ },
251
+ ], 2000)
252
+
253
+
254
+ sip.call.terminate(oc.id)
255
+
256
+ z.wait([
257
+ {
258
+ event: 'call_ended',
259
+ call_id: oc.id,
260
+ },
261
+ {
262
+ event: 'call_ended',
263
+ call_id: ic.id,
264
+ },
265
+ {
266
+ event: 'response',
267
+ call_id: oc.id,
268
+ method: 'BYE',
269
+ msg: sip_msg({
270
+ $rs: '200',
271
+ $rr: 'OK',
272
+ }),
273
+ },
274
+ ], 1000)
275
+
276
+ z.sleep(1000)
277
+
278
+ sip.stop()
@@ -0,0 +1,280 @@
1
+ var sip = require ('../index.js')
2
+ var z = require('zester')
3
+ var m = require('data-matching')
4
+ var sip_msg = require('sip-matching')
5
+
6
+ //sip.set_log_level(6)
7
+ sip.dtmf_aggregation_on(500)
8
+
9
+ z.trap_events(sip.event_source, 'event', (evt) => {
10
+ var e = evt.args[0]
11
+ return e
12
+ })
13
+
14
+ console.log(sip.start((data) => { console.log(data)} ))
15
+
16
+ t1 = sip.transport.create("127.0.0.1", 5090, 1)
17
+ t2 = sip.transport.create("127.0.0.1", 5092, 1)
18
+
19
+ console.log("t1", t1)
20
+ console.log("t2", t2)
21
+
22
+ flags = 0
23
+
24
+ oc = sip.call.create(t1.id, flags, 'sip:a@t', 'sip:b@127.0.0.1:5092')
25
+
26
+ z.wait([
27
+ {
28
+ event: "incoming_call",
29
+ call_id: m.collect("call_id"),
30
+ },
31
+ {
32
+ event: 'response',
33
+ call_id: oc.id,
34
+ method: 'INVITE',
35
+ msg: sip_msg({
36
+ $rs: '100',
37
+ $rr: 'Trying',
38
+ '$(hdrcnt(via))': 1,
39
+ '$hdr(call-id)': m.collect('sip_call_id'),
40
+ $fU: 'a',
41
+ $fd: 't',
42
+ $tU: 'b',
43
+ '$hdr(l)': '0',
44
+ }),
45
+ },
46
+ ], 1000)
47
+
48
+ ic = {
49
+ id: z.store.call_id,
50
+ sip_call_id: z.store.sip_call_id,
51
+ }
52
+
53
+ sip.call.respond(ic.id, 200, 'OK')
54
+
55
+ z.wait([
56
+ {
57
+ event: 'media_status',
58
+ call_id: oc.id,
59
+ status: 'setup_ok',
60
+ local_mode: 'sendrecv',
61
+ remote_mode: 'sendrecv',
62
+ },
63
+ {
64
+ event: 'media_status',
65
+ call_id: ic.id,
66
+ status: 'setup_ok',
67
+ local_mode: 'sendrecv',
68
+ remote_mode: 'sendrecv',
69
+ },
70
+ {
71
+ event: 'response',
72
+ call_id: oc.id,
73
+ method: 'INVITE',
74
+ msg: sip_msg({
75
+ $rs: '200',
76
+ $rr: 'OK',
77
+ '$(hdrcnt(VIA))': 1,
78
+ $fU: 'a',
79
+ $fd: 't',
80
+ $tU: 'b',
81
+ '$hdr(content-type)': 'application/sdp',
82
+ $rb: '!{_}a=sendrecv',
83
+ }),
84
+ },
85
+ ], 1000)
86
+
87
+ sip.call.send_dtmf(oc.id, '1234', 0)
88
+ sip.call.send_dtmf(ic.id, '4321', 1)
89
+
90
+ z.wait([
91
+ {
92
+ event: 'dtmf',
93
+ call_id: ic.id,
94
+ digits: '1234',
95
+ mode: 0,
96
+ },
97
+ {
98
+ event: 'dtmf',
99
+ call_id: oc.id,
100
+ digits: '4321',
101
+ mode: 1,
102
+ },
103
+ ], 2000)
104
+
105
+
106
+ sip.call.reinvite(oc.id, true, 0)
107
+
108
+ z.wait([
109
+ {
110
+ event: 'response',
111
+ call_id: oc.id,
112
+ method: 'INVITE',
113
+ msg: sip_msg({
114
+ $rs: '200',
115
+ $rr: 'OK',
116
+ $rb: '!{_}a=recvonly',
117
+ }),
118
+ },
119
+ {
120
+ event: 'media_status',
121
+ call_id: oc.id,
122
+ status: 'setup_ok',
123
+ local_mode: 'sendonly',
124
+ remote_mode: 'recvonly',
125
+ },
126
+ {
127
+ event: 'media_status',
128
+ call_id: ic.id,
129
+ status: 'setup_ok',
130
+ local_mode: 'recvonly',
131
+ remote_mode: 'sendonly',
132
+ },
133
+ ], 500)
134
+
135
+ sip.call.send_dtmf(oc.id, '1234', 0)
136
+ sip.call.send_dtmf(ic.id, '4321', 1) // this will not generate event 'dtmf' as the call is on hold
137
+
138
+ z.wait([
139
+ {
140
+ event: 'dtmf',
141
+ call_id: ic.id,
142
+ digits: '1234',
143
+ mode: 0,
144
+ },
145
+ ], 2000)
146
+
147
+ sip.call.reinvite(ic.id, false, 0)
148
+
149
+ z.wait([
150
+ {
151
+ event: 'response',
152
+ call_id: ic.id,
153
+ method: 'INVITE',
154
+ msg: sip_msg({
155
+ $rs: '200',
156
+ $rr: 'OK',
157
+ $rb: '!{_}a=sendonly',
158
+ }),
159
+ },
160
+ {
161
+ event: 'media_status',
162
+ call_id: oc.id,
163
+ status: 'setup_ok',
164
+ local_mode: 'sendonly',
165
+ remote_mode: 'recvonly',
166
+ },
167
+ {
168
+ event: 'media_status',
169
+ call_id: ic.id,
170
+ status: 'setup_ok',
171
+ local_mode: 'recvonly',
172
+ remote_mode: 'sendonly',
173
+ },
174
+ ], 500)
175
+
176
+ sip.call.send_dtmf(oc.id, '1234', 0)
177
+ sip.call.send_dtmf(ic.id, '4321', 1) // this will not generate event 'dtmf' as the call is on hold
178
+
179
+ z.wait([
180
+ {
181
+ event: 'dtmf',
182
+ call_id: ic.id,
183
+ digits: '1234',
184
+ mode: 0,
185
+ },
186
+ ], 2000)
187
+
188
+ sip.call.send_request(oc.id, 'INFO')
189
+
190
+ z.wait([
191
+ {
192
+ event: 'request',
193
+ call_id: ic.id,
194
+ msg: sip_msg({
195
+ $rm: 'INFO',
196
+ }),
197
+ },
198
+ {
199
+ event: 'response',
200
+ call_id: oc.id,
201
+ method: 'INFO',
202
+ msg: sip_msg({
203
+ $rs: '200',
204
+ $rr: 'OK',
205
+ }),
206
+ },
207
+ ], 500)
208
+
209
+ sip.call.reinvite(oc.id, false, 0)
210
+
211
+ z.wait([
212
+ {
213
+ event: 'response',
214
+ call_id: oc.id,
215
+ method: 'INVITE',
216
+ msg: sip_msg({
217
+ $rs: '200',
218
+ $rr: 'OK',
219
+ $rb: '!{_}a=sendrecv',
220
+ }),
221
+ },
222
+ {
223
+ event: 'media_status',
224
+ call_id: oc.id,
225
+ status: 'setup_ok',
226
+ local_mode: 'sendrecv',
227
+ remote_mode: 'sendrecv',
228
+ },
229
+ {
230
+ event: 'media_status',
231
+ call_id: ic.id,
232
+ status: 'setup_ok',
233
+ local_mode: 'sendrecv',
234
+ remote_mode: 'sendrecv',
235
+ },
236
+ ], 500)
237
+
238
+ sip.call.send_dtmf(oc.id, '1234', 0)
239
+ sip.call.send_dtmf(ic.id, '4321', 1)
240
+
241
+ z.wait([
242
+ {
243
+ event: 'dtmf',
244
+ call_id: ic.id,
245
+ digits: '1234',
246
+ mode: 0,
247
+ },
248
+ {
249
+ event: 'dtmf',
250
+ call_id: oc.id,
251
+ digits: '4321',
252
+ mode: 1,
253
+ },
254
+ ], 2000)
255
+
256
+ sip.call.terminate(oc.id)
257
+
258
+ z.wait([
259
+ {
260
+ event: 'call_ended',
261
+ call_id: oc.id,
262
+ },
263
+ {
264
+ event: 'call_ended',
265
+ call_id: ic.id,
266
+ },
267
+ {
268
+ event: 'response',
269
+ call_id: oc.id,
270
+ method: 'BYE',
271
+ msg: sip_msg({
272
+ $rs: '200',
273
+ $rr: 'OK',
274
+ }),
275
+ },
276
+ ], 1000)
277
+
278
+ z.sleep(1000)
279
+
280
+ sip.stop()
@@ -0,0 +1,111 @@
1
+ var sip = require ('../index.js')
2
+ var z = require('zester')
3
+ var m = require('data-matching')
4
+ var sip_msg = require('sip-matching')
5
+
6
+ //sip.set_log_level(6)
7
+ sip.dtmf_aggregation_on(500)
8
+
9
+ z.trap_events(sip.event_source, 'event', (evt) => {
10
+ var e = evt.args[0]
11
+ return e
12
+ })
13
+
14
+ console.log(sip.start((data) => { console.log(data)} ))
15
+
16
+ t1 = sip.transport.create("127.0.0.1", 5090, 1)
17
+ t2 = sip.transport.create("127.0.0.1", 5092, 1)
18
+
19
+ console.log("t1", t1)
20
+ console.log("t2", t2)
21
+
22
+ flags = 0
23
+
24
+ oc = sip.call.create(t1.id, flags, 'sip:a@t', 'sip:b@127.0.0.1:5092')
25
+
26
+ z.wait([
27
+ {
28
+ event: "incoming_call",
29
+ call_id: m.collect("call_id"),
30
+ },
31
+ {
32
+ event: 'response',
33
+ call_id: oc.id,
34
+ method: 'INVITE',
35
+ msg: sip_msg({
36
+ $rs: '100',
37
+ $rr: 'Trying',
38
+ '$(hdrcnt(via))': 1,
39
+ '$hdr(call-id)': m.collect('sip_call_id'),
40
+ $fU: 'a',
41
+ $fd: 't',
42
+ $tU: 'b',
43
+ '$hdr(l)': '0',
44
+ }),
45
+ },
46
+ ], 1000)
47
+
48
+ ic = {
49
+ id: z.store.call_id,
50
+ sip_call_id: z.store.sip_call_id,
51
+ }
52
+
53
+ sip.call.respond(ic.id, 180, 'Ringing')
54
+
55
+ z.wait([
56
+ {
57
+ event: 'response',
58
+ call_id: oc.id,
59
+ method: 'INVITE',
60
+ msg: sip_msg({
61
+ $rs: '180',
62
+ $rr: 'Ringing',
63
+ '$(hdrcnt(VIA))': 1,
64
+ $fU: 'a',
65
+ $fd: 't',
66
+ $tU: 'b',
67
+ }),
68
+ },
69
+ ], 1000)
70
+
71
+ sip.call.terminate(oc.id)
72
+
73
+ z.wait([
74
+ {
75
+ event: 'request',
76
+ call_id: ic.id,
77
+ msg: sip_msg({
78
+ $rm: 'CANCEL',
79
+ }),
80
+ },
81
+ {
82
+ event: 'response',
83
+ call_id: oc.id,
84
+ method: 'CANCEL',
85
+ msg: sip_msg({
86
+ $rs: '200',
87
+ $rr: 'OK',
88
+ }),
89
+ },
90
+ {
91
+ event: 'response',
92
+ call_id: oc.id,
93
+ method: 'INVITE',
94
+ msg: sip_msg({
95
+ $rs: '487',
96
+ $rr: 'Request Terminated',
97
+ })
98
+ },
99
+ {
100
+ event: 'call_ended',
101
+ call_id: oc.id,
102
+ },
103
+ {
104
+ event: 'call_ended',
105
+ call_id: ic.id,
106
+ },
107
+ ], 1000)
108
+
109
+ z.sleep(1000)
110
+
111
+ sip.stop()
package/src/Makefile ADDED
@@ -0,0 +1,42 @@
1
+ #Modify this to point to the PJSIP location.
2
+ PJBASE=/usr/local/src/svn/pjproject
3
+
4
+ include $(PJBASE)/build.mak
5
+
6
+ CC = $(APP_CC)
7
+ LDFLAGS = $(APP_LDFLAGS)
8
+ LDLIBS = -lstdc++ $(APP_LDLIBS)
9
+ CFLAGS = $(APP_CFLAGS)
10
+
11
+ # CFLAGS is APP_CFLAGS that comes from /user/local/src/svn/pjproject. In it, we have -02. So since we want to disable optimization by setting -O0
12
+ # we set -O0 before and after it to ensure -O0 has the final say.
13
+ CPPFLAGS= -g -O0 ${CFLAGS} $(LDFLAGS) -O0 -I /usr/local/src/boost_1_51_0 -I pjmedia/include/chainlink
14
+
15
+ VPATH = pjmedia
16
+
17
+ .PHONY : clean install
18
+
19
+ all: sip.so
20
+
21
+ chainlink:
22
+ make -C pjmedia
23
+
24
+ idmanager.o: idmanager.cpp idmanager.hpp
25
+ $(CC) -fPIC -c -o idmanager.o idmanager.cpp $(CPPFLAGS)
26
+
27
+ packetdumper.o: packetdumper.cpp packetdumper.hpp
28
+ $(CC) -fPIC -c -o packetdumper.o packetdumper.cpp $(CPPFLAGS)
29
+
30
+ event_templates.o: event_templates.cpp event_templates.hpp
31
+ $(CC) -fPIC -c -o event_templates.o event_templates.cpp $(CPPFLAGS)
32
+
33
+ sip.o: sip.cpp sip.hpp
34
+ $(CC) -fPIC -c -o sip.o sip.cpp $(CPPFLAGS)
35
+
36
+ sip.so: sip.o idmanager.o packetdumper.o event_templates.o chainlink
37
+ $(CC) -fPIC -shared -o sip.so sip.o idmanager.o packetdumper.o event_templates.o pjmedia/libchainlink.a -Wl,-E -lm -ldl -lspandsp -lpcap $(CPPFLAGS) $(LDFLAGS) $(LDLIBS)
38
+
39
+ clean:
40
+ rm -f *.o *.so
41
+ make -C pjmedia clean
42
+
package/src/README ADDED
@@ -0,0 +1,3 @@
1
+
2
+ # install boost library
3
+ sudo apt install libboost-all-dev