From 2068f13bc42cf3a47374aa2765f82724a5782028 Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Mon, 24 Oct 2011 09:28:13 +0000 Subject: Re #1395: Backport of PJSIP 1.x branch into PJSIP 2.0 trunk * Backport of r3557:r3832 TODO: ticket #1268 (Option for automatic/manual sending of RTCP SDES/BYE for the stream) for video stream. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3841 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia-audiodev/audiodev.c | 10 ++-- pjmedia/src/pjmedia-audiodev/coreaudio_dev.c | 12 +++- pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp | 4 +- pjmedia/src/pjmedia-audiodev/symb_mda_dev.cpp | 84 ++++++++++++++++++++++++--- pjmedia/src/pjmedia-audiodev/symb_vas_dev.cpp | 25 ++++---- 5 files changed, 111 insertions(+), 24 deletions(-) (limited to 'pjmedia/src/pjmedia-audiodev') diff --git a/pjmedia/src/pjmedia-audiodev/audiodev.c b/pjmedia/src/pjmedia-audiodev/audiodev.c index 437ee584..067fc78f 100644 --- a/pjmedia/src/pjmedia-audiodev/audiodev.c +++ b/pjmedia/src/pjmedia-audiodev/audiodev.c @@ -490,11 +490,13 @@ PJ_DEF(pj_status_t) pjmedia_aud_subsys_shutdown(void) } --aud_subsys.init_count; - for (i=0; idata, len); } else { enum {NO_DATA_FT = 15 }; - pj_uint8_t amr_header = 4 || (NO_DATA_FT << 3); + pj_uint8_t amr_header = 4 | (NO_DATA_FT << 3); buf.iBuffer.Append(amr_header); } @@ -1095,7 +1095,7 @@ static void PlayCb(TAPSCommBuffer &buf, void *user_data) } else { /* PJMEDIA_FRAME_TYPE_NONE */ enum {NO_DATA_FT = 15 }; - pj_uint8_t amr_header = 4 || (NO_DATA_FT << 3); + pj_uint8_t amr_header = 4 | (NO_DATA_FT << 3); buf.iBuffer.Append(amr_header); diff --git a/pjmedia/src/pjmedia-audiodev/symb_mda_dev.cpp b/pjmedia/src/pjmedia-audiodev/symb_mda_dev.cpp index d0e66bdc..645ed394 100644 --- a/pjmedia/src/pjmedia-audiodev/symb_mda_dev.cpp +++ b/pjmedia/src/pjmedia-audiodev/symb_mda_dev.cpp @@ -239,6 +239,7 @@ private: TPtr8 iFramePtr_; TInt lastError_; pj_uint32_t timeStamp_; + CActiveSchedulerWait startAsw_; // cache variable // to avoid calculating frame length repeatedly @@ -363,6 +364,13 @@ pj_status_t CPjAudioInputEngine::StartRecord() lastError_ = KRequestPending; iInputStream_->Open(&iStreamSettings); +#if defined(PJMEDIA_AUDIO_DEV_MDA_USE_SYNC_START) && \ + PJMEDIA_AUDIO_DEV_MDA_USE_SYNC_START != 0 + + startAsw_.Start(); + +#endif + // Success PJ_LOG(4,(THIS_FILE, "Sound capture started.")); return PJ_SUCCESS; @@ -386,6 +394,10 @@ void CPjAudioInputEngine::Stop() iInputStream_ = NULL; } + if (startAsw_.IsStarted()) { + startAsw_.AsyncStop(); + } + state_ = STATE_INACTIVE; } @@ -399,12 +411,25 @@ TPtr8 & CPjAudioInputEngine::GetFrame() void CPjAudioInputEngine::MaiscOpenComplete(TInt aError) { + if (startAsw_.IsStarted()) { + startAsw_.AsyncStop(); + } + lastError_ = aError; if (aError != KErrNone) { snd_perror("Error in MaiscOpenComplete()", aError); return; } + /* Apply input volume setting if specified */ + if (parentStrm_->param.flags & + PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING) + { + stream_set_cap(&parentStrm_->base, + PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING, + &parentStrm_->param.input_vol); + } + // set stream priority to normal and time sensitive iInputStream_->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime); @@ -414,7 +439,12 @@ void CPjAudioInputEngine::MaiscOpenComplete(TInt aError) TRAPD(err2, iInputStream_->ReadL(frm)); if (err2) { PJ_LOG(4,(THIS_FILE, "Exception in iInputStream_->ReadL()")); + lastError_ = err2; + return; } + + // input stream opened succesfully, set status to Active + state_ = STATE_ACTIVE; } void CPjAudioInputEngine::MaiscBufferCopied(TInt aError, @@ -547,6 +577,7 @@ private: TPtrC8 frame_; TInt lastError_; unsigned timestamp_; + CActiveSchedulerWait startAsw_; CPjAudioOutputEngine(struct mda_stream *parent_strm, pjmedia_aud_play_cb play_cb, @@ -638,6 +669,13 @@ pj_status_t CPjAudioOutputEngine::StartPlay() // Open stream. lastError_ = KRequestPending; iOutputStream_->Open(&iStreamSettings); + +#if defined(PJMEDIA_AUDIO_DEV_MDA_USE_SYNC_START) && \ + PJMEDIA_AUDIO_DEV_MDA_USE_SYNC_START != 0 + + startAsw_.Start(); + +#endif // Success PJ_LOG(4,(THIS_FILE, "Sound playback started")); @@ -662,17 +700,22 @@ void CPjAudioOutputEngine::Stop() iOutputStream_ = NULL; } + if (startAsw_.IsStarted()) { + startAsw_.AsyncStop(); + } + state_ = STATE_INACTIVE; } void CPjAudioOutputEngine::MaoscOpenComplete(TInt aError) { + if (startAsw_.IsStarted()) { + startAsw_.AsyncStop(); + } + lastError_ = aError; if (aError==KErrNone) { - // output stream opened succesfully, set status to Active - state_ = STATE_ACTIVE; - // set stream properties, 16bit 8KHz mono TMdaAudioDataSettings iSettings; iSettings.iChannels = @@ -683,8 +726,17 @@ void CPjAudioOutputEngine::MaoscOpenComplete(TInt aError) iOutputStream_->SetAudioPropertiesL(iSettings.iSampleRate, iSettings.iChannels); - // set volume to 1/2th of stream max volume - iOutputStream_->SetVolume(iOutputStream_->MaxVolume()/2); + /* Apply output volume setting if specified */ + if (parentStrm_->param.flags & + PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING) + { + stream_set_cap(&parentStrm_->base, + PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING, + &parentStrm_->param.output_vol); + } else { + // set volume to 1/2th of stream max volume + iOutputStream_->SetVolume(iOutputStream_->MaxVolume()/2); + } // set stream priority to normal and time sensitive iOutputStream_->SetPriority(EPriorityNormal, @@ -718,6 +770,9 @@ void CPjAudioOutputEngine::MaoscOpenComplete(TInt aError) // until whole data buffer is written. frame_.Set(frameBuf_, frameBufSize_); iOutputStream_->WriteL(frame_); + + // output stream opened succesfully, set status to Active + state_ = STATE_ACTIVE; } else { snd_perror("Error in MaoscOpenComplete()", aError); } @@ -881,7 +936,8 @@ static pj_status_t factory_default_param(pjmedia_aud_dev_factory *f, param->channel_count = 1; param->samples_per_frame = af->dev_info.default_samples_per_sec * 20 / 1000; param->bits_per_sample = BITS_PER_SAMPLE; - param->flags = af->dev_info.caps; + // Don't set the flags without specifying the flags value. + //param->flags = af->dev_info.caps; return PJ_SUCCESS; } @@ -956,6 +1012,20 @@ static pj_status_t stream_get_param(pjmedia_aud_stream *s, pj_memcpy(pi, &strm->param, sizeof(*pi)); + /* Update the output volume setting */ + if (stream_get_cap(s, PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING, + &pi->output_vol) == PJ_SUCCESS) + { + pi->flags |= PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING; + } + + /* Update the input volume setting */ + if (stream_get_cap(s, PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING, + &pi->input_vol) == PJ_SUCCESS) + { + pi->flags |= PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING; + } + return PJ_SUCCESS; } @@ -1034,7 +1104,7 @@ static pj_status_t stream_set_cap(pjmedia_aud_stream *s, } break; case PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING: - if (strm->param.dir & PJMEDIA_DIR_CAPTURE) { + if (strm->param.dir & PJMEDIA_DIR_PLAYBACK) { PJ_ASSERT_RETURN(strm->out_engine, PJ_EINVAL); TInt max_vol = strm->out_engine->GetMaxVolume(); diff --git a/pjmedia/src/pjmedia-audiodev/symb_vas_dev.cpp b/pjmedia/src/pjmedia-audiodev/symb_vas_dev.cpp index fd4d0806..bcd9d75a 100644 --- a/pjmedia/src/pjmedia-audiodev/symb_vas_dev.cpp +++ b/pjmedia/src/pjmedia-audiodev/symb_vas_dev.cpp @@ -1130,7 +1130,7 @@ static void PlayCb(CVoIPDataBuffer *buf, void *user_data) buffer.Append((TUint8*)sf->data, len); } else { enum {NO_DATA_FT = 15 }; - pj_uint8_t amr_header = 4 || (NO_DATA_FT << 3); + pj_uint8_t amr_header = 4 | (NO_DATA_FT << 3); buffer.Append(amr_header); } @@ -1139,7 +1139,7 @@ static void PlayCb(CVoIPDataBuffer *buf, void *user_data) } else { /* PJMEDIA_FRAME_TYPE_NONE */ enum {NO_DATA_FT = 15 }; - pj_uint8_t amr_header = 4 || (NO_DATA_FT << 3); + pj_uint8_t amr_header = 4 | (NO_DATA_FT << 3); buffer.Append(amr_header); @@ -1746,12 +1746,6 @@ static pj_status_t factory_create_stream(pjmedia_aud_dev_factory *f, return PJ_RETURN_OS_ERROR(err); } - /* Apply output volume setting if specified */ - if (param->flags & PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING) { - stream_set_cap(&strm->base, PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING, - ¶m->output_vol); - } - /* Done */ strm->base.op = &stream_op; *p_aud_strm = &strm->base; @@ -1945,10 +1939,21 @@ static pj_status_t stream_start(pjmedia_aud_stream *strm) } while (!stream->engine->IsStarted() && (now.MicroSecondsFrom(start) < VAS_WAIT_START * 1000)); - if (stream->engine->IsStarted()) + if (stream->engine->IsStarted()) { + + /* Apply output volume setting if specified */ + if (stream->param.flags & + PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING) + { + stream_set_cap(strm, + PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING, + &stream->param.output_vol); + } + return PJ_SUCCESS; - else + } else { return PJ_ETIMEDOUT; + } } return PJ_EINVALIDOP; -- cgit v1.2.3