summaryrefslogtreecommitdiffstats
path: root/package/pjsip/patches/0003-adds-PJ_DEF-pj_status_t-pjsua_add_snd_port-int-id.patch
blob: 8e9b604147d77d51e7f38721c9ad8f21ff21c8bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
From 1e0d5dbf8b7714dfd490add0e2b507fd513414f3 Mon Sep 17 00:00:00 2001
From: John Crispin <blogic@openwrt.org>
Date: Fri, 3 Feb 2012 21:45:08 +0100
Subject: [PATCH 3/3] adds PJ_DEF(pj_status_t) pjsua_add_snd_port(int id)

---
 pjproject-1.12/pjsip/include/pjsua-lib/pjsua.h     |    2 +
 .../pjsip/include/pjsua-lib/pjsua_internal.h       |    4 +-
 pjproject-1.12/pjsip/src/pjsua-lib/pjsua_media.c   |   69 ++++++++++++++------
 3 files changed, 54 insertions(+), 21 deletions(-)

diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h
index 85dbbbb..ad3e020 100644
--- a/pjsip/include/pjsua-lib/pjsua.h
+++ b/pjsip/include/pjsua-lib/pjsua.h
@@ -1543,6 +1543,8 @@ PJ_DECL(pjmedia_endpt*) pjsua_get_pjmedia_endpt(void);
 PJ_DECL(pj_pool_factory*) pjsua_get_pool_factory(void);
 
 
+PJ_DECL(pj_status_t) pjsua_add_snd_port(int id, pjsua_conf_port_id *p_id);
+
 
 /*****************************************************************************
  * Utilities.
diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h
index 6c27826..4ba91ed 100644
--- a/pjsip/include/pjsua-lib/pjsua_internal.h
+++ b/pjsip/include/pjsua-lib/pjsua_internal.h
@@ -261,6 +261,8 @@ typedef struct pjsua_stun_resolve
 } pjsua_stun_resolve;
 
 
+#define MAX_PORT	2
+
 /**
  * Global pjsua application data.
  */
@@ -336,7 +338,7 @@ struct pjsua_data
     pj_bool_t		 aud_open_cnt;/**< How many # device is opened	*/
     pj_bool_t		 no_snd;    /**< No sound (app will manage it)	*/
     pj_pool_t		*snd_pool;  /**< Sound's private pool.		*/
-    pjmedia_snd_port	*snd_port;  /**< Sound port.			*/
+    pjmedia_snd_port	*snd_port[MAX_PORT];  /**< Sound port.			*/
     pj_timer_entry	 snd_idle_timer;/**< Sound device idle timer.	*/
     pjmedia_master_port	*null_snd;  /**< Master port for null sound.	*/
     pjmedia_port	*null_port; /**< Null port.			*/
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 7d53cad..8a882f3 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -588,7 +588,7 @@ static void check_snd_dev_idle()
      * It is idle when there is no port connection in the bridge and
      * there is no active call.
      */
-    if ((pjsua_var.snd_port!=NULL || pjsua_var.null_snd!=NULL) && 
+    if ((pjsua_var.snd_port[0]!=NULL || pjsua_var.null_snd!=NULL) && 
 	pjsua_var.snd_idle_timer.id == PJ_FALSE &&
 	pjmedia_conf_get_connect_count(pjsua_var.mconf) == 0 &&
 	call_cnt == 0 &&
@@ -2009,7 +2009,7 @@ PJ_DEF(pj_status_t) pjsua_conf_connect( pjsua_conf_port_id source,
 	pj_assert(status == PJ_SUCCESS);
 
 	/* Check if sound device is instantiated. */
-	need_reopen = (pjsua_var.snd_port==NULL && pjsua_var.null_snd==NULL && 
+	need_reopen = (pjsua_var.snd_port[0]==NULL && pjsua_var.null_snd==NULL && 
 		      !pjsua_var.no_snd);
 
 	/* Check if sound device need to reopen because it needs to modify 
@@ -2067,7 +2067,7 @@ PJ_DEF(pj_status_t) pjsua_conf_connect( pjsua_conf_port_id source,
 	/* The bridge version */
 
 	/* Create sound port if none is instantiated */
-	if (pjsua_var.snd_port==NULL && pjsua_var.null_snd==NULL && 
+	if (pjsua_var.snd_port[0]==NULL && pjsua_var.null_snd==NULL && 
 	    !pjsua_var.no_snd) 
 	{
 	    pj_status_t status;
@@ -2679,9 +2679,9 @@ static pj_status_t update_initial_aud_param()
     pjmedia_aud_param param;
     pj_status_t status;
 
-    PJ_ASSERT_RETURN(pjsua_var.snd_port != NULL, PJ_EBUG);
+    PJ_ASSERT_RETURN(pjsua_var.snd_port[0] != NULL, PJ_EBUG);
 
-    strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
+    strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
 
     status = pjmedia_aud_stream_get_param(strm, &param);
     if (status != PJ_SUCCESS) {
@@ -2747,7 +2747,7 @@ static pj_status_t open_snd_dev(pjmedia_snd_port_param *param)
 	      1000 / param->base.clock_rate));
 
     status = pjmedia_snd_port_create2( pjsua_var.snd_pool, 
-				       param, &pjsua_var.snd_port);
+				       param, &pjsua_var.snd_port[0]);
     if (status != PJ_SUCCESS)
 	return status;
 
@@ -2805,13 +2805,13 @@ static pj_status_t open_snd_dev(pjmedia_snd_port_param *param)
     }
 
     /* Connect sound port to the bridge */
-    status = pjmedia_snd_port_connect(pjsua_var.snd_port, 	 
+    status = pjmedia_snd_port_connect(pjsua_var.snd_port[0], 	 
 				      conf_port ); 	 
     if (status != PJ_SUCCESS) { 	 
 	pjsua_perror(THIS_FILE, "Unable to connect conference port to "
 			        "sound device", status); 	 
-	pjmedia_snd_port_destroy(pjsua_var.snd_port); 	 
-	pjsua_var.snd_port = NULL; 	 
+	pjmedia_snd_port_destroy(pjsua_var.snd_port[0]); 	 
+	pjsua_var.snd_port[0] = NULL; 	 
 	return status; 	 
     }
 
@@ -2826,7 +2826,7 @@ static pj_status_t open_snd_dev(pjmedia_snd_port_param *param)
 	pjmedia_aud_param si;
         pj_str_t tmp;
 
-	strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
+	strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
 	status = pjmedia_aud_stream_get_param(strm, &si);
 	if (status == PJ_SUCCESS)
 	    status = pjmedia_aud_dev_get_info(si.rec_id, &rec_info);
@@ -2869,12 +2869,12 @@ static pj_status_t open_snd_dev(pjmedia_snd_port_param *param)
 static void close_snd_dev(void)
 {
     /* Close sound device */
-    if (pjsua_var.snd_port) {
+    if (pjsua_var.snd_port[0]) {
 	pjmedia_aud_dev_info cap_info, play_info;
 	pjmedia_aud_stream *strm;
 	pjmedia_aud_param param;
 
-	strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
+	strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
 	pjmedia_aud_stream_get_param(strm, &param);
 
 	if (pjmedia_aud_dev_get_info(param.rec_id, &cap_info) != PJ_SUCCESS)
@@ -2886,9 +2886,9 @@ static void close_snd_dev(void)
 			     "%s sound capture device",
 			     play_info.name, cap_info.name));
 
-	pjmedia_snd_port_disconnect(pjsua_var.snd_port);
-	pjmedia_snd_port_destroy(pjsua_var.snd_port);
-	pjsua_var.snd_port = NULL;
+	pjmedia_snd_port_disconnect(pjsua_var.snd_port[0]);
+	pjmedia_snd_port_destroy(pjsua_var.snd_port[0]);
+	pjsua_var.snd_port[0] = NULL;
     }
 
     /* Close null sound device */
@@ -2968,6 +2968,35 @@ PJ_DEF(pj_status_t) pjsua_set_snd_dev( int capture_dev,
     return PJ_SUCCESS;
 }
 
+PJ_DEF(pj_status_t) pjsua_add_snd_port(int id, pjsua_conf_port_id *p_id)
+{
+	unsigned alt_cr_cnt = 1;
+	unsigned alt_cr = 0;
+	pj_status_t status = -1;
+	pjmedia_snd_port_param param;
+	unsigned samples_per_frame;
+	pjmedia_port *port;
+	const pj_str_t name = pj_str("tapi2");
+	alt_cr = pjsua_var.media_cfg.clock_rate;
+	samples_per_frame = alt_cr *
+			    pjsua_var.media_cfg.audio_frame_ptime *
+			    pjsua_var.media_cfg.channel_count / 1000;
+	status = create_aud_param(&param.base,
+				pjsua_var.play_dev,
+				pjsua_var.cap_dev,
+				alt_cr,
+				pjsua_var.media_cfg.channel_count,
+				samples_per_frame, 16);
+	if (status != PJ_SUCCESS)
+		return status;
+	param.base.rec_id = id;
+	param.base.play_id = id;
+	param.options = 0;
+	status = pjmedia_snd_port_create2(pjsua_var.snd_pool,
+				       &param, &pjsua_var.snd_port[id]);
+	return PJ_SUCCESS;
+}
+
 
 /*
  * Get currently active sound devices. If sound devices has not been created
@@ -3054,8 +3083,8 @@ PJ_DEF(pj_status_t) pjsua_set_ec(unsigned tail_ms, unsigned options)
 {
     pjsua_var.media_cfg.ec_tail_len = tail_ms;
 
-    if (pjsua_var.snd_port)
-	return pjmedia_snd_port_set_ec( pjsua_var.snd_port, pjsua_var.pool,
+    if (pjsua_var.snd_port[0])
+	return pjmedia_snd_port_set_ec( pjsua_var.snd_port[0], pjsua_var.pool,
 					tail_ms, options);
     
     return PJ_SUCCESS;
@@ -3077,7 +3106,7 @@ PJ_DEF(pj_status_t) pjsua_get_ec_tail(unsigned *p_tail_ms)
  */
 PJ_DEF(pj_bool_t) pjsua_snd_is_active(void)
 {
-    return pjsua_var.snd_port != NULL;
+    return pjsua_var.snd_port[0] != NULL;
 }
 
 
@@ -3099,7 +3128,7 @@ PJ_DEF(pj_status_t) pjsua_snd_set_setting( pjmedia_aud_dev_cap cap,
     if (pjsua_snd_is_active()) {
 	pjmedia_aud_stream *strm;
 	
-	strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
+	strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
 	status = pjmedia_aud_stream_set_cap(strm, cap, pval);
     } else {
 	status = PJ_SUCCESS;
@@ -3137,7 +3166,7 @@ PJ_DEF(pj_status_t) pjsua_snd_get_setting( pjmedia_aud_dev_cap cap,
 	/* Sound is active, retrieve from device directly */
 	pjmedia_aud_stream *strm;
 	
-	strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port);
+	strm = pjmedia_snd_port_get_snd_stream(pjsua_var.snd_port[0]);
 	return pjmedia_aud_stream_get_cap(strm, cap, pval);
     } else {
 	/* Otherwise retrieve from internal param */
-- 
1.7.7.1