summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2011-09-09 09:51:10 +0000
committerNanang Izzuddin <nanang@teluu.com>2011-09-09 09:51:10 +0000
commit22eb7f24a0f86a681d2735e9f5705fe7c99bf752 (patch)
tree700f3b339b7e5046e72ab16cec5db1bf465f1093 /pjmedia
parent4803be66dcddff1800717dda2dcc386021eb8570 (diff)
More Symbian MDA fixes (re #1365):
- Added config setting to control sync/async start. Due to problem with async start: any volume query performed immediately after starting the device will always return zero. - Fixed get_default_param() to set the flags to zero (was copied from caps, i.e: input/output volume flags without setting the value). - Fixed stream_get_param() to also check the input and output volume level. git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@3748 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia-audiodev/config.h15
-rw-r--r--pjmedia/src/pjmedia-audiodev/symb_mda_dev.cpp62
2 files changed, 72 insertions, 5 deletions
diff --git a/pjmedia/include/pjmedia-audiodev/config.h b/pjmedia/include/pjmedia-audiodev/config.h
index f450a9ac..c1dbb4ce 100644
--- a/pjmedia/include/pjmedia-audiodev/config.h
+++ b/pjmedia/include/pjmedia-audiodev/config.h
@@ -145,6 +145,21 @@ PJ_BEGIN_DECL
/**
+ * This setting controls whether the Symbian audio with built-in multimedia
+ * framework backend should be started synchronously. Note that synchronous
+ * start will block the application/UI, e.g: about 40ms for each direction
+ * on N95. While asynchronous start may cause invalid value (always zero)
+ * returned in input/output volume query, if the query is performed when
+ * the internal start procedure is not completely finished.
+ *
+ * Default: 1 (yes)
+ */
+#ifndef PJMEDIA_AUDIO_DEV_MDA_USE_SYNC_START
+# define PJMEDIA_AUDIO_DEV_MDA_USE_SYNC_START 1
+#endif
+
+
+/**
* This setting controls whether the Audio Device API should support
* device implementation that is based on the old sound device API
* (sound.h).
diff --git a/pjmedia/src/pjmedia-audiodev/symb_mda_dev.cpp b/pjmedia/src/pjmedia-audiodev/symb_mda_dev.cpp
index 6463b9c9..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,13 +411,17 @@ 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 output volume setting if specified */
+ /* Apply input volume setting if specified */
if (parentStrm_->param.flags &
PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING)
{
@@ -423,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,
@@ -556,6 +577,7 @@ private:
TPtrC8 frame_;
TInt lastError_;
unsigned timestamp_;
+ CActiveSchedulerWait startAsw_;
CPjAudioOutputEngine(struct mda_stream *parent_strm,
pjmedia_aud_play_cb play_cb,
@@ -647,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"));
@@ -671,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 =
@@ -736,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);
}
@@ -899,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;
}
@@ -974,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;
}