summaryrefslogtreecommitdiff
path: root/pjsip/src
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_aud.c59
-rw-r--r--pjsip/src/pjsua2/media.cpp61
2 files changed, 115 insertions, 5 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_aud.c b/pjsip/src/pjsua-lib/pjsua_aud.c
index 0f5172e9..f4f93a09 100644
--- a/pjsip/src/pjsua-lib/pjsua_aud.c
+++ b/pjsip/src/pjsua-lib/pjsua_aud.c
@@ -1192,7 +1192,7 @@ on_error:
*/
PJ_DEF(pjsua_conf_port_id) pjsua_player_get_conf_port(pjsua_player_id id)
{
- PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player), PJ_EINVAL);
+ PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player),PJ_EINVAL);
PJ_ASSERT_RETURN(pjsua_var.player[id].port != NULL, PJ_EINVAL);
return pjsua_var.player[id].slot;
@@ -1204,7 +1204,7 @@ PJ_DEF(pjsua_conf_port_id) pjsua_player_get_conf_port(pjsua_player_id id)
PJ_DEF(pj_status_t) pjsua_player_get_port( pjsua_player_id id,
pjmedia_port **p_port)
{
- PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player), PJ_EINVAL);
+ PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player),PJ_EINVAL);
PJ_ASSERT_RETURN(pjsua_var.player[id].port != NULL, PJ_EINVAL);
PJ_ASSERT_RETURN(p_port != NULL, PJ_EINVAL);
@@ -1214,16 +1214,65 @@ PJ_DEF(pj_status_t) pjsua_player_get_port( pjsua_player_id id,
}
/*
+ * Get player info.
+ */
+PJ_DEF(pj_status_t) pjsua_player_get_info(pjsua_player_id id,
+ pjmedia_wav_player_info *info)
+{
+ PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player),
+ -PJ_EINVAL);
+ PJ_ASSERT_RETURN(pjsua_var.player[id].port != NULL, PJ_EINVAL);
+ PJ_ASSERT_RETURN(pjsua_var.player[id].type == 0, PJ_EINVAL);
+
+ return pjmedia_wav_player_get_info(pjsua_var.player[id].port, info);
+}
+
+/*
+ * Get playback position.
+ */
+PJ_DEF(pj_ssize_t) pjsua_player_get_pos( pjsua_player_id id )
+{
+ pj_ssize_t pos_bytes;
+ pjmedia_wav_player_info info;
+ pj_status_t status;
+
+ PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player),
+ -PJ_EINVAL);
+ PJ_ASSERT_RETURN(pjsua_var.player[id].port != NULL, -PJ_EINVAL);
+ PJ_ASSERT_RETURN(pjsua_var.player[id].type == 0, -PJ_EINVAL);
+
+ pos_bytes = pjmedia_wav_player_port_get_pos(pjsua_var.player[id].port);
+ if (pos_bytes < 0)
+ return pos_bytes;
+
+ status = pjmedia_wav_player_get_info(pjsua_var.player[id].port, &info);
+ if (status != PJ_SUCCESS)
+ return -status;
+
+ return pos_bytes / (info.payload_bits_per_sample / 8);
+}
+
+/*
* Set playback position.
*/
PJ_DEF(pj_status_t) pjsua_player_set_pos( pjsua_player_id id,
pj_uint32_t samples)
{
- PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player), PJ_EINVAL);
+ pjmedia_wav_player_info info;
+ pj_uint32_t pos_bytes;
+ pj_status_t status;
+
+ PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player),PJ_EINVAL);
PJ_ASSERT_RETURN(pjsua_var.player[id].port != NULL, PJ_EINVAL);
PJ_ASSERT_RETURN(pjsua_var.player[id].type == 0, PJ_EINVAL);
- return pjmedia_wav_player_port_set_pos(pjsua_var.player[id].port, samples);
+ status = pjmedia_wav_player_get_info(pjsua_var.player[id].port, &info);
+ if (status != PJ_SUCCESS)
+ return status;
+
+ pos_bytes = samples * (info.payload_bits_per_sample / 8);
+ return pjmedia_wav_player_port_set_pos(pjsua_var.player[id].port,
+ pos_bytes);
}
@@ -1233,7 +1282,7 @@ PJ_DEF(pj_status_t) pjsua_player_set_pos( pjsua_player_id id,
*/
PJ_DEF(pj_status_t) pjsua_player_destroy(pjsua_player_id id)
{
- PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player), PJ_EINVAL);
+ PJ_ASSERT_RETURN(id>=0&&id<(int)PJ_ARRAY_SIZE(pjsua_var.player),PJ_EINVAL);
PJ_ASSERT_RETURN(pjsua_var.player[id].port != NULL, PJ_EINVAL);
PJ_LOG(4,(THIS_FILE, "Destroying player %d..", id));
diff --git a/pjsip/src/pjsua2/media.cpp b/pjsip/src/pjsua2/media.cpp
index a5676399..a6255ec2 100644
--- a/pjsip/src/pjsua2/media.cpp
+++ b/pjsip/src/pjsua2/media.cpp
@@ -262,6 +262,21 @@ void AudioMediaPlayer::createPlayer(const string &file_name,
options,
&playerId) );
+ /* Register EOF callback */
+ pjmedia_port *port;
+ pj_status_t status;
+
+ status = pjsua_player_get_port(playerId, &port);
+ if (status != PJ_SUCCESS) {
+ pjsua_player_destroy(playerId);
+ PJSUA2_RAISE_ERROR2(status, "AudioMediaPlayer::createPlayer()");
+ }
+ status = pjmedia_wav_player_set_eof_cb(port, this, &eof_cb);
+ if (status != PJ_SUCCESS) {
+ pjsua_player_destroy(playerId);
+ PJSUA2_RAISE_ERROR2(status, "AudioMediaPlayer::createPlayer()");
+ }
+
/* Get media port id. */
id = pjsua_player_get_conf_port(playerId);
@@ -280,6 +295,7 @@ void AudioMediaPlayer::createPlaylist(const StringVector &file_names,
pj_str_t pj_files[MAX_FILE_NAMES];
unsigned i, count = 0;
pj_str_t pj_lbl = str2Pj(label);
+ pj_status_t status;
count = PJ_ARRAY_SIZE(pj_files);
@@ -296,12 +312,50 @@ void AudioMediaPlayer::createPlaylist(const StringVector &file_names,
options,
&playerId) );
+ /* Register EOF callback */
+ pjmedia_port *port;
+ status = pjsua_player_get_port(playerId, &port);
+ if (status != PJ_SUCCESS) {
+ pjsua_player_destroy(playerId);
+ PJSUA2_RAISE_ERROR2(status, "AudioMediaPlayer::createPlaylist()");
+ }
+ status = pjmedia_wav_playlist_set_eof_cb(port, this, &eof_cb);
+ if (status != PJ_SUCCESS) {
+ pjsua_player_destroy(playerId);
+ PJSUA2_RAISE_ERROR2(status, "AudioMediaPlayer::createPlaylist()");
+ }
+
/* Get media port id. */
id = pjsua_player_get_conf_port(playerId);
registerMediaPort(NULL);
}
+AudioMediaPlayerInfo AudioMediaPlayer::getInfo() const throw(Error)
+{
+ AudioMediaPlayerInfo info;
+ pjmedia_wav_player_info pj_info;
+
+ PJSUA2_CHECK_EXPR( pjsua_player_get_info(playerId, &pj_info) );
+
+ pj_bzero(&info, sizeof(info));
+ info.formatId = pj_info.fmt_id;
+ info.payloadBitsPerSample = pj_info.payload_bits_per_sample;
+ info.sizeBytes = pj_info.size_bytes;
+ info.sizeSamples = pj_info.size_samples;
+
+ return info;
+}
+
+pj_uint32_t AudioMediaPlayer::getPos() const throw(Error)
+{
+ pj_ssize_t pos = pjsua_player_get_pos(playerId);
+ if (pos < 0) {
+ PJSUA2_RAISE_ERROR2(-pos, "AudioMediaPlayer::getPos()");
+ }
+ return (pj_uint32_t)pos;
+}
+
void AudioMediaPlayer::setPos(pj_uint32_t samples) throw(Error)
{
PJSUA2_CHECK_EXPR( pjsua_player_set_pos(playerId, samples) );
@@ -313,6 +367,13 @@ AudioMediaPlayer* AudioMediaPlayer::typecastFromAudioMedia(
return static_cast<AudioMediaPlayer*>(media);
}
+pj_status_t AudioMediaPlayer::eof_cb(pjmedia_port *port,
+ void *usr_data)
+{
+ AudioMediaPlayer *player = (AudioMediaPlayer*)usr_data;
+ return player->onEof() ? PJ_SUCCESS : PJ_EEOF;
+}
+
///////////////////////////////////////////////////////////////////////////////
AudioMediaRecorder::AudioMediaRecorder()
: recorderId(PJSUA_INVALID_ID)