From ac131cb38e62d9b73fc857e270430c0f9ecab27c Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Thu, 4 Mar 2010 15:47:25 +0000 Subject: Ticket #1008: - Applied VAS AMR playback solution from Forum Nokia. - Fixed AMR playback for VAS and APS in composing DTX/NO_DATA (frame type 15) frame header. - Modified symbsndtest test application to support non-PCM audio. - Minor check fix in pjmedia_codec_mgr_destroy(), caught assertion when VAS factory init failed and media endpoint tried to destroy codec manager (codec mgr hasn't been init-ed). git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3116 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip-apps/src/symsndtest/app_main.cpp | 56 +++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 11 deletions(-) (limited to 'pjsip-apps') diff --git a/pjsip-apps/src/symsndtest/app_main.cpp b/pjsip-apps/src/symsndtest/app_main.cpp index e58be081..c43a5566 100644 --- a/pjsip-apps/src/symsndtest/app_main.cpp +++ b/pjsip-apps/src/symsndtest/app_main.cpp @@ -40,9 +40,27 @@ static pj_caching_pool cp; static pjmedia_aud_stream *strm; static unsigned rec_cnt, play_cnt; static pj_time_val t_start; +static pjmedia_aud_param param; +static pj_pool_t *pool; +static pjmedia_delay_buf *delaybuf; +static char frame_buf[256]; -pj_pool_t *pool; -pjmedia_delay_buf *delaybuf; +static void copy_frame_ext(pjmedia_frame_ext *f_dst, + const pjmedia_frame_ext *f_src) +{ + pj_bzero(f_dst, sizeof(*f_dst)); + if (f_src->subframe_cnt) { + f_dst->base.type = PJMEDIA_FRAME_TYPE_EXTENDED; + for (unsigned i = 0; i < f_src->subframe_cnt; ++i) { + pjmedia_frame_ext_subframe *sf; + sf = pjmedia_frame_ext_get_subframe(f_src, i); + pjmedia_frame_ext_append_subframe(f_dst, sf->data, sf->bitlen, + param.samples_per_frame); + } + } else { + f_dst->base.type = PJMEDIA_FRAME_TYPE_NONE; + } +} /* Logging callback */ static void log_writer(int level, const char *buf, unsigned len) @@ -137,11 +155,18 @@ static pj_status_t rec_cb(void *user_data, { PJ_UNUSED_ARG(user_data); - pjmedia_delay_buf_put(delaybuf, (pj_int16_t*)frame->buf); - - if (frame->size != SAMPLES_PER_FRAME*2) { - PJ_LOG(3, (THIS_FILE, "Size captured = %u", - frame->size)); + if (param.ext_fmt.id == PJMEDIA_FORMAT_PCM) { + pjmedia_delay_buf_put(delaybuf, (pj_int16_t*)frame->buf); + + if (frame->size != SAMPLES_PER_FRAME*2) { + PJ_LOG(3, (THIS_FILE, "Size captured = %u", + frame->size)); + } + } else { + pjmedia_frame_ext *f_src = (pjmedia_frame_ext*)frame; + pjmedia_frame_ext *f_dst = (pjmedia_frame_ext*)frame_buf; + + copy_frame_ext(f_dst, f_src); } ++rec_cnt; @@ -154,9 +179,16 @@ static pj_status_t play_cb(void *user_data, { PJ_UNUSED_ARG(user_data); - pjmedia_delay_buf_get(delaybuf, (pj_int16_t*)frame->buf); - frame->size = SAMPLES_PER_FRAME*2; - frame->type = PJMEDIA_FRAME_TYPE_AUDIO; + if (param.ext_fmt.id == PJMEDIA_FORMAT_PCM) { + pjmedia_delay_buf_get(delaybuf, (pj_int16_t*)frame->buf); + frame->size = SAMPLES_PER_FRAME*2; + frame->type = PJMEDIA_FRAME_TYPE_AUDIO; + } else { + pjmedia_frame_ext *f_src = (pjmedia_frame_ext*)frame_buf; + pjmedia_frame_ext *f_dst = (pjmedia_frame_ext*)frame; + + copy_frame_ext(f_dst, f_src); + } ++play_cnt; return PJ_SUCCESS; @@ -165,7 +197,6 @@ static pj_status_t play_cb(void *user_data, /* Start sound */ static pj_status_t snd_start(unsigned flag) { - pjmedia_aud_param param; pj_status_t status; if (strm != NULL) { @@ -178,6 +209,9 @@ static pj_status_t snd_start(unsigned flag) param.clock_rate = CLOCK_RATE; param.samples_per_frame = SAMPLES_PER_FRAME; param.dir = (pjmedia_dir) flag; + param.ext_fmt.id = PJMEDIA_FORMAT_AMR; + param.ext_fmt.bitrate = 12200; + param.output_route = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER; status = pjmedia_aud_stream_create(¶m, &rec_cb, &play_cb, NULL, &strm); if (status != PJ_SUCCESS) { -- cgit v1.2.3