summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-07-17 16:25:45 +0000
committerBenny Prijono <bennylp@teluu.com>2007-07-17 16:25:45 +0000
commit0961698e492095c815992a3bc6a5e2fcf3e8ce70 (patch)
tree8ec0e3257a73df431f300fec99efe2273a6dbdf1 /pjsip
parent62932f60662ec8cb2196b27aa922e81ce3082423 (diff)
Ticket #353: memory leak with pjsua WAV file player/recorder
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1403 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/include/pjsua-lib/pjsua_internal.h1
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c58
2 files changed, 54 insertions, 5 deletions
diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h
index 67b190a8..ca9ea658 100644
--- a/pjsip/include/pjsua-lib/pjsua_internal.h
+++ b/pjsip/include/pjsua-lib/pjsua_internal.h
@@ -147,6 +147,7 @@ typedef struct pjsua_file_data
{
pj_bool_t type; /* 0=player, 1=playlist */
pjmedia_port *port;
+ pj_pool_t *pool;
unsigned slot;
} pjsua_file_data;
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 129e3aa7..2105a061 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -1105,6 +1105,19 @@ PJ_DEF(pj_status_t) pjsua_conf_get_signal_level(pjsua_conf_port_id slot,
* File player.
*/
+static char* get_basename(const char *path, unsigned len)
+{
+ char *p = ((char*)path) + len;
+
+ if (len==0)
+ return p;
+
+ for (--p; p!=path && *p!='/' && *p!='\\'; --p);
+
+ return (p==path) ? p : p+1;
+}
+
+
/*
* Create a file player, and automatically connect this player to
* the conference bridge.
@@ -1115,6 +1128,7 @@ PJ_DEF(pj_status_t) pjsua_player_create( const pj_str_t *filename,
{
unsigned slot, file_id;
char path[PJ_MAXPATH];
+ pj_pool_t *pool;
pjmedia_port *port;
pj_status_t status;
@@ -1137,13 +1151,21 @@ PJ_DEF(pj_status_t) pjsua_player_create( const pj_str_t *filename,
pj_memcpy(path, filename->ptr, filename->slen);
path[filename->slen] = '\0';
- status = pjmedia_wav_player_port_create(pjsua_var.pool, path,
+
+ pool = pjsua_pool_create(get_basename(path, filename->slen), 1000, 1000);
+ if (!pool) {
+ PJSUA_UNLOCK();
+ return PJ_ENOMEM;
+ }
+
+ status = pjmedia_wav_player_port_create(pool, path,
pjsua_var.mconf_cfg.samples_per_frame *
1000 / pjsua_var.media_cfg.clock_rate,
options, 0, &port);
if (status != PJ_SUCCESS) {
PJSUA_UNLOCK();
pjsua_perror(THIS_FILE, "Unable to open file for playback", status);
+ pj_pool_release(pool);
return status;
}
@@ -1154,10 +1176,12 @@ PJ_DEF(pj_status_t) pjsua_player_create( const pj_str_t *filename,
PJSUA_UNLOCK();
pjsua_perror(THIS_FILE, "Unable to add file to conference bridge",
status);
+ pj_pool_release(pool);
return status;
}
pjsua_var.player[file_id].type = 0;
+ pjsua_var.player[file_id].pool = pool;
pjsua_var.player[file_id].port = port;
pjsua_var.player[file_id].slot = slot;
@@ -1181,6 +1205,7 @@ PJ_DEF(pj_status_t) pjsua_playlist_create( const pj_str_t file_names[],
pjsua_player_id *p_id)
{
unsigned slot, file_id, ptime;
+ pj_pool_t *pool;
pjmedia_port *port;
pj_status_t status;
@@ -1205,25 +1230,34 @@ PJ_DEF(pj_status_t) pjsua_playlist_create( const pj_str_t file_names[],
ptime = pjsua_var.mconf_cfg.samples_per_frame * 1000 /
pjsua_var.media_cfg.clock_rate;
- status = pjmedia_wav_playlist_create(pjsua_var.pool, label,
+ pool = pjsua_pool_create("playlist", 1000, 1000);
+ if (!pool) {
+ PJSUA_UNLOCK();
+ return PJ_ENOMEM;
+ }
+
+ status = pjmedia_wav_playlist_create(pool, label,
file_names, file_count,
ptime, options, 0, &port);
if (status != PJ_SUCCESS) {
PJSUA_UNLOCK();
pjsua_perror(THIS_FILE, "Unable to create playlist", status);
+ pj_pool_release(pool);
return status;
}
- status = pjmedia_conf_add_port(pjsua_var.mconf, pjsua_var.pool,
+ status = pjmedia_conf_add_port(pjsua_var.mconf, pool,
port, &port->info.name, &slot);
if (status != PJ_SUCCESS) {
pjmedia_port_destroy(port);
PJSUA_UNLOCK();
pjsua_perror(THIS_FILE, "Unable to add port", status);
+ pj_pool_release(pool);
return status;
}
pjsua_var.player[file_id].type = 1;
+ pjsua_var.player[file_id].pool = pool;
pjsua_var.player[file_id].port = port;
pjsua_var.player[file_id].slot = slot;
@@ -1294,6 +1328,8 @@ PJ_DEF(pj_status_t) pjsua_player_destroy(pjsua_player_id id)
pjmedia_port_destroy(pjsua_var.player[id].port);
pjsua_var.player[id].port = NULL;
pjsua_var.player[id].slot = 0xFFFF;
+ pj_pool_release(pjsua_var.player[id].pool);
+ pjsua_var.player[id].pool = NULL;
pjsua_var.player_cnt--;
}
@@ -1328,6 +1364,7 @@ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename,
char path[PJ_MAXPATH];
pj_str_t ext;
int file_format;
+ pj_pool_t *pool;
pjmedia_port *port;
pj_status_t status;
@@ -1375,8 +1412,14 @@ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename,
pj_memcpy(path, filename->ptr, filename->slen);
path[filename->slen] = '\0';
+ pool = pjsua_pool_create(get_basename(path, filename->slen), 1000, 1000);
+ if (!pool) {
+ PJSUA_UNLOCK();
+ return PJ_ENOMEM;
+ }
+
if (file_format == FMT_WAV) {
- status = pjmedia_wav_writer_port_create(pjsua_var.pool, path,
+ status = pjmedia_wav_writer_port_create(pool, path,
pjsua_var.media_cfg.clock_rate,
pjsua_var.mconf_cfg.channel_count,
pjsua_var.mconf_cfg.samples_per_frame,
@@ -1391,19 +1434,22 @@ PJ_DEF(pj_status_t) pjsua_recorder_create( const pj_str_t *filename,
if (status != PJ_SUCCESS) {
PJSUA_UNLOCK();
pjsua_perror(THIS_FILE, "Unable to open file for recording", status);
+ pj_pool_release(pool);
return status;
}
- status = pjmedia_conf_add_port(pjsua_var.mconf, pjsua_var.pool,
+ status = pjmedia_conf_add_port(pjsua_var.mconf, pool,
port, filename, &slot);
if (status != PJ_SUCCESS) {
pjmedia_port_destroy(port);
PJSUA_UNLOCK();
+ pj_pool_release(pool);
return status;
}
pjsua_var.recorder[file_id].port = port;
pjsua_var.recorder[file_id].slot = slot;
+ pjsua_var.recorder[file_id].pool = pool;
if (p_id) *p_id = file_id;
@@ -1458,6 +1504,8 @@ PJ_DEF(pj_status_t) pjsua_recorder_destroy(pjsua_recorder_id id)
pjmedia_port_destroy(pjsua_var.recorder[id].port);
pjsua_var.recorder[id].port = NULL;
pjsua_var.recorder[id].slot = 0xFFFF;
+ pj_pool_release(pjsua_var.recorder[id].pool);
+ pjsua_var.recorder[id].pool = NULL;
pjsua_var.rec_cnt--;
}