pjsip: update to version 1.14.2
[openwrt/svn-archive/archive.git] / package / pjsip / patches / 0003-adds-PJ_DEF-pj_status_t-pjsua_add_snd_port-int-id.patch
1 --- a/pjsip/include/pjsua-lib/pjsua.h
2 +++ b/pjsip/include/pjsua-lib/pjsua.h
3 @@ -1543,6 +1543,8 @@ PJ_DECL(pjmedia_endpt*) pjsua_get_pjmedi
4 PJ_DECL(pj_pool_factory*) pjsua_get_pool_factory(void);
5
6
7 +PJ_DECL(pj_status_t) pjsua_add_snd_port(int id, pjsua_conf_port_id *p_id);
8 +
9
10 /*****************************************************************************
11 * Utilities.
12 --- a/pjsip/include/pjsua-lib/pjsua_internal.h
13 +++ b/pjsip/include/pjsua-lib/pjsua_internal.h
14 @@ -261,6 +261,8 @@ typedef struct pjsua_stun_resolve
15 } pjsua_stun_resolve;
16
17
18 +#define MAX_PORT 2
19 +
20 /**
21 * Global pjsua application data.
22 */
23 @@ -336,7 +338,7 @@ struct pjsua_data
24 pj_bool_t aud_open_cnt;/**< How many # device is opened */
25 pj_bool_t no_snd; /**< No sound (app will manage it) */
26 pj_pool_t *snd_pool; /**< Sound's private pool. */
27 - pjmedia_snd_port *snd_port; /**< Sound port. */
28 + pjmedia_snd_port *snd_port[MAX_PORT]; /**< Sound port. */
29 pj_timer_entry snd_idle_timer;/**< Sound device idle timer. */
30 pjmedia_master_port *null_snd; /**< Master port for null sound. */
31 pjmedia_port *null_port; /**< Null port. */
32 --- a/pjsip/src/pjsua-lib/pjsua_media.c
33 +++ b/pjsip/src/pjsua-lib/pjsua_media.c
34 @@ -588,7 +588,7 @@ static void check_snd_dev_idle()
35 * It is idle when there is no port connection in the bridge and
36 * there is no active call.
37 */
38 - if ((pjsua_var.snd_port!=NULL || pjsua_var.null_snd!=NULL) &&
39 + if ((pjsua_var.snd_port[0]!=NULL || pjsua_var.null_snd!=NULL) &&
40 pjsua_var.snd_idle_timer.id == PJ_FALSE &&
41 pjmedia_conf_get_connect_count(pjsua_var.mconf) == 0 &&
42 call_cnt == 0 &&
43 @@ -2008,7 +2008,7 @@ PJ_DEF(pj_status_t) pjsua_conf_connect(
44 pj_assert(status == PJ_SUCCESS);
45
46 /* Check if sound device is instantiated. */
47 - need_reopen = (pjsua_var.snd_port==NULL && pjsua_var.null_snd==NULL &&
48 + need_reopen = (pjsua_var.snd_port[0]==NULL && pjsua_var.null_snd==NULL &&
49 !pjsua_var.no_snd);
50
51 /* Check if sound device need to reopen because it needs to modify
52 @@ -2072,7 +2072,7 @@ PJ_DEF(pj_status_t) pjsua_conf_connect(
53 /* The bridge version */
54
55 /* Create sound port if none is instantiated */
56 - if (pjsua_var.snd_port==NULL && pjsua_var.null_snd==NULL &&
57 + if (pjsua_var.snd_port[0]==NULL && pjsua_var.null_snd==NULL &&
58 !pjsua_var.no_snd)
59 {
60 pj_status_t status;
61 @@ -2686,9 +2686,9 @@ static pj_status_t update_initial_aud_pa
62 pjmedia_aud_param param;
63 pj_status_t status;
64
65 - PJ_ASSERT_RETURN(pjsua_var.snd_port != NULL, PJ_EBUG);
66 + PJ_ASSERT_RETURN(pjsua_var.snd_port[0] != NULL, PJ_EBUG);
67
68 - strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
69 + strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
70
71 status = pjmedia_aud_stream_get_param(strm, &param);
72 if (status != PJ_SUCCESS) {
73 @@ -2754,7 +2754,7 @@ static pj_status_t open_snd_dev(pjmedia_
74 1000 / param->base.clock_rate));
75
76 status = pjmedia_snd_port_create2( pjsua_var.snd_pool,
77 - param, &pjsua_var.snd_port);
78 + param, &pjsua_var.snd_port[0]);
79 if (status != PJ_SUCCESS)
80 return status;
81
82 @@ -2812,13 +2812,13 @@ static pj_status_t open_snd_dev(pjmedia_
83 }
84
85 /* Connect sound port to the bridge */
86 - status = pjmedia_snd_port_connect(pjsua_var.snd_port,
87 + status = pjmedia_snd_port_connect(pjsua_var.snd_port[0],
88 conf_port );
89 if (status != PJ_SUCCESS) {
90 pjsua_perror(THIS_FILE, "Unable to connect conference port to "
91 "sound device", status);
92 - pjmedia_snd_port_destroy(pjsua_var.snd_port);
93 - pjsua_var.snd_port = NULL;
94 + pjmedia_snd_port_destroy(pjsua_var.snd_port[0]);
95 + pjsua_var.snd_port[0] = NULL;
96 return status;
97 }
98
99 @@ -2833,7 +2833,7 @@ static pj_status_t open_snd_dev(pjmedia_
100 pjmedia_aud_param si;
101 pj_str_t tmp;
102
103 - strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
104 + strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
105 status = pjmedia_aud_stream_get_param(strm, &si);
106 if (status == PJ_SUCCESS)
107 status = pjmedia_aud_dev_get_info(si.rec_id, &rec_info);
108 @@ -2876,12 +2876,12 @@ static pj_status_t open_snd_dev(pjmedia_
109 static void close_snd_dev(void)
110 {
111 /* Close sound device */
112 - if (pjsua_var.snd_port) {
113 + if (pjsua_var.snd_port[0]) {
114 pjmedia_aud_dev_info cap_info, play_info;
115 pjmedia_aud_stream *strm;
116 pjmedia_aud_param param;
117
118 - strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
119 + strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
120 pjmedia_aud_stream_get_param(strm, &param);
121
122 if (pjmedia_aud_dev_get_info(param.rec_id, &cap_info) != PJ_SUCCESS)
123 @@ -2893,9 +2893,9 @@ static void close_snd_dev(void)
124 "%s sound capture device",
125 play_info.name, cap_info.name));
126
127 - pjmedia_snd_port_disconnect(pjsua_var.snd_port);
128 - pjmedia_snd_port_destroy(pjsua_var.snd_port);
129 - pjsua_var.snd_port = NULL;
130 + pjmedia_snd_port_disconnect(pjsua_var.snd_port[0]);
131 + pjmedia_snd_port_destroy(pjsua_var.snd_port[0]);
132 + pjsua_var.snd_port[0] = NULL;
133 }
134
135 /* Close null sound device */
136 @@ -2984,6 +2984,35 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( i
137 return PJ_SUCCESS;
138 }
139
140 +PJ_DEF(pj_status_t) pjsua_add_snd_port(int id, pjsua_conf_port_id *p_id)
141 +{
142 + unsigned alt_cr_cnt = 1;
143 + unsigned alt_cr = 0;
144 + pj_status_t status = -1;
145 + pjmedia_snd_port_param param;
146 + unsigned samples_per_frame;
147 + pjmedia_port *port;
148 + const pj_str_t name = pj_str("tapi2");
149 + alt_cr = pjsua_var.media_cfg.clock_rate;
150 + samples_per_frame = alt_cr *
151 + pjsua_var.media_cfg.audio_frame_ptime *
152 + pjsua_var.media_cfg.channel_count / 1000;
153 + status = create_aud_param(&param.base,
154 + pjsua_var.play_dev,
155 + pjsua_var.cap_dev,
156 + alt_cr,
157 + pjsua_var.media_cfg.channel_count,
158 + samples_per_frame, 16);
159 + if (status != PJ_SUCCESS)
160 + return status;
161 + param.base.rec_id = id;
162 + param.base.play_id = id;
163 + param.options = 0;
164 + status = pjmedia_snd_port_create2(pjsua_var.snd_pool,
165 + &param, &pjsua_var.snd_port[id]);
166 + return PJ_SUCCESS;
167 +}
168 +
169
170 /*
171 * Get currently active sound devices. If sound devices has not been created
172 @@ -3088,7 +3117,7 @@ PJ_DEF(pj_status_t) pjsua_set_ec(unsigne
173 pjsua_var.media_cfg.ec_options = options;
174
175 if (pjsua_var.snd_port)
176 - status = pjmedia_snd_port_set_ec(pjsua_var.snd_port, pjsua_var.pool,
177 + status = pjmedia_snd_port_set_ec(pjsua_var.snd_port[0], pjsua_var.pool,
178 tail_ms, options);
179
180 PJSUA_UNLOCK();
181 @@ -3111,7 +3140,7 @@ PJ_DEF(pj_status_t) pjsua_get_ec_tail(un
182 */
183 PJ_DEF(pj_bool_t) pjsua_snd_is_active(void)
184 {
185 - return pjsua_var.snd_port != NULL;
186 + return pjsua_var.snd_port[0] != NULL;
187 }
188
189
190 @@ -3135,7 +3164,7 @@ PJ_DEF(pj_status_t) pjsua_snd_set_settin
191 if (pjsua_snd_is_active()) {
192 pjmedia_aud_stream *strm;
193
194 - strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
195 + strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
196 status = pjmedia_aud_stream_set_cap(strm, cap, pval);
197 } else {
198 status = PJ_SUCCESS;
199 @@ -3181,7 +3210,7 @@ PJ_DEF(pj_status_t) pjsua_snd_get_settin
200 /* Sound is active, retrieve from device directly */
201 pjmedia_aud_stream *strm;
202
203 - strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
204 + strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
205 status = pjmedia_aud_stream_get_cap(strm, cap, pval);
206 } else {
207 /* Otherwise retrieve from internal param */