Root/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 */
208

Archive Download this file



interactive