diff options
Diffstat (limited to 'pjsip/src')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_aud.c | 59 | ||||
-rw-r--r-- | pjsip/src/pjsua2/media.cpp | 61 |
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) |