Fixed Symbian APS auddev that Stop() should wait until initialization completed (if initialization is on progress).
git-svn-id: https://svn.pjsip.org/repos/pjproject/branches/projects/aps-direct@2504 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp b/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp
index 693b294..bfdec1e 100644
--- a/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp
+++ b/pjmedia/src/pjmedia-audiodev/symb_aps_dev.cpp
@@ -359,8 +359,10 @@
enum State
{
STATE_NULL,
+ STATE_INITIALIZING,
STATE_READY,
- STATE_STREAMING
+ STATE_STREAMING,
+ STATE_PENDING_STOP
};
~CPjAudioEngine();
@@ -481,13 +483,12 @@
iWriteQ.Close();
iWriteCommQ.Close();
}
+
+ TRACE_((THIS_FILE, "Sound device destroyed"));
}
TInt CPjAudioEngine::InitPlayL()
{
- if (state_ == STATE_STREAMING || state_ == STATE_READY)
- return 0;
-
TInt err = iSession.InitializePlayer(iPlaySettings);
if (err != KErrNone) {
snd_perror("Failed to initialize player", err);
@@ -517,9 +518,6 @@
TInt CPjAudioEngine::InitRecL()
{
- if (state_ == STATE_STREAMING || state_ == STATE_READY)
- return 0;
-
// Initialize input stream device
TInt err = iSession.InitializeRecorder(iRecSettings);
if (err != KErrNone && err != KErrAlreadyExists) {
@@ -557,8 +555,12 @@
if (state_ == STATE_READY)
return StartStreamL();
+ PJ_ASSERT_RETURN(state_ == STATE_NULL, PJMEDIA_EAUD_INVOP);
+
// Even if only capturer are opened, playback thread of APS Server need
// to be run(?). Since some messages will be delivered via play comm queue.
+ state_ = STATE_INITIALIZING;
+
return InitPlayL();
}
@@ -568,6 +570,14 @@
iSession.Stop();
state_ = STATE_READY;
TRACE_((THIS_FILE, "Sound device stopped"));
+ } else if (state_ == STATE_INITIALIZING) {
+ // Initialization is on progress, so let's set the state to
+ // STATE_PENDING_STOP to prevent it starting the stream.
+ state_ = STATE_PENDING_STOP;
+
+ // Then wait until initialization done.
+ while (state_ != STATE_READY)
+ pj_symbianos_poll(-1, 100);
}
}
@@ -595,9 +605,8 @@
TInt CPjAudioEngine::StartStreamL()
{
- if (state_ == STATE_STREAMING)
- return 0;
-
+ pj_assert(state_==STATE_READY || state_==STATE_INITIALIZING);
+
iSession.SetCng(setting_.cng);
iSession.SetVadMode(setting_.vad);
iSession.SetPlc(setting_.plc);
@@ -618,6 +627,7 @@
}
state_ = STATE_STREAMING;
+
return 0;
}
@@ -625,9 +635,13 @@
{
TRACE_((THIS_FILE, "Recorder initialized, err=%d", aStatus));
- state_ = STATE_READY;
if (aStatus == KErrNone) {
- StartStreamL();
+ // Don't start the stream since Stop() has been requested.
+ if (state_ != STATE_PENDING_STOP) {
+ StartStreamL();
+ } else {
+ state_ = STATE_READY;
+ }
}
}
@@ -637,9 +651,12 @@
if (aStatus == KErrNone) {
if (parentStrm_->param.dir == PJMEDIA_DIR_PLAYBACK) {
- state_ = STATE_READY;
- // Only playback, start directly
- StartStreamL();
+ // Don't start the stream since Stop() has been requested.
+ if (state_ != STATE_PENDING_STOP) {
+ StartStreamL();
+ } else {
+ state_ = STATE_READY;
+ }
} else
InitRecL();
}