Merge change 21591 into eclair

* changes:
  Integrate SVOX update that offers two modes to reset the engine: soft and full. Soft reset is lighter-weight than the previous pico_resetEngine() function as it only clears the input (text) and output (audio data) buffers of the synthesis engine. The synthesis loop is now taking advantage of the soft reset whenever it is interrupted, rather than performing a full engine reset after each call to stop().
diff --git a/pico/lib/picoacph.c b/pico/lib/picoacph.c
index 98feb6e..c06e860 100644
--- a/pico/lib/picoacph.c
+++ b/pico/lib/picoacph.c
@@ -157,7 +157,7 @@
 } acph_subobj_t;
 
 
-static pico_status_t acphInitialize(register picodata_ProcessingUnit this) {
+static pico_status_t acphInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode) {
     acph_subobj_t * acph;
     picoos_uint16 i;
 
@@ -193,6 +193,11 @@
         acph->cbuf[i] = 0;
     }
 
+    if (r_mode == PICO_RESET_SOFT) {
+        /*following initializations needed only at startup or after a full reset*/
+        return PICO_OK;
+    }
+
     /* kb tabphones */
     acph->tabphones =
         picoktab_getPhones(this->voice->kbArray[PICOKNOW_KBID_TAB_PHONES]);
@@ -310,7 +315,7 @@
         return NULL;
     }
 
-    acphInitialize(this);
+    acphInitialize(this, PICO_RESET_FULL);
     return this;
 }
 
diff --git a/pico/lib/picoapi.c b/pico/lib/picoapi.c
index c4ef8bf..affd780 100644
--- a/pico/lib/picoapi.c
+++ b/pico/lib/picoapi.c
@@ -660,13 +660,15 @@
 /**
  * pico_resetEngine : Resets the engine
  * @param    engine : pointer to a Pico engine handle
+ * @param    r_mode : reset mode
  * @return  PICO_OK : successful
  * @return     PICO_ERR_INVALID_HANDLE, PICO_ERR_NULLPTR_ACCESS : errors
  * @callgraph
  * @callergraph
 */
 PICO_FUNC pico_resetEngine(
-        pico_Engine engine)
+        pico_Engine engine,
+        pico_Status r_mode)
 {
     pico_Status status = PICO_OK;
 
@@ -674,7 +676,11 @@
         status = PICO_ERR_INVALID_HANDLE;
     } else {
         picoctrl_engResetExceptionManager((picoctrl_Engine) engine);
-        status = picoctrl_engReset((picoctrl_Engine) engine);
+
+        if (r_mode<PICO_RESET_FULL) r_mode = PICO_RESET_FULL;
+        if (r_mode>PICO_RESET_SOFT) r_mode = PICO_RESET_FULL;
+
+        status = picoctrl_engReset((picoctrl_Engine) engine, (picoos_int32)r_mode);
     }
 
     return status;
diff --git a/pico/lib/picoapi.h b/pico/lib/picoapi.h
index 0dad702..8a5725b 100644
--- a/pico/lib/picoapi.h
+++ b/pico/lib/picoapi.h
@@ -422,8 +422,9 @@
    particular text input and signal data output buffers.
 */
 PICO_FUNC pico_resetEngine(
-        pico_Engine engine
-        );
+        pico_Engine engine,
+        pico_Status r_mode
+);
 
 
 /* Engine status and error/warning message retrieval ******************/
diff --git a/pico/lib/picocep.c b/pico/lib/picocep.c
index 2510c13..bb80c3d 100644
--- a/pico/lib/picocep.c
+++ b/pico/lib/picocep.c
@@ -285,7 +285,7 @@
  * @callgraph
  * @callergraph
  */
-static pico_status_t cepInitialize(register picodata_ProcessingUnit this)
+static pico_status_t cepInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode)
 {
     /*pico_status_t nRes;*/
     cep_subobj_t * cep;
@@ -328,35 +328,37 @@
      ------------------------------------------------------------------*/
     cep->activeEndPos = PICOCEP_MAXWINLEN;
 
-    /* kb pdflfz */
-    cep->pdflfz = picokpdf_getPdfMUL(
-            this->voice->kbArray[PICOKNOW_KBID_PDF_LFZ]);
+    if (r_mode == PICO_RESET_FULL) {
+        /* kb pdflfz */
+        cep->pdflfz = picokpdf_getPdfMUL(
+                this->voice->kbArray[PICOKNOW_KBID_PDF_LFZ]);
 
-    /* kb pdfmgc */
-    cep->pdfmgc = picokpdf_getPdfMUL(
-            this->voice->kbArray[PICOKNOW_KBID_PDF_MGC]);
+        /* kb pdfmgc */
+        cep->pdfmgc = picokpdf_getPdfMUL(
+                this->voice->kbArray[PICOKNOW_KBID_PDF_MGC]);
 
-    /* kb tab phones */
-    /* cep->phones =
-     picoktab_getPhones(this->voice->kbArray[PICOKNOW_KBID_TAB_PHONES]); */
+        /* kb tab phones */
+        /* cep->phones =
+         picoktab_getPhones(this->voice->kbArray[PICOKNOW_KBID_TAB_PHONES]); */
 
-    /*---------------------- other working variables ---------------------------*/
-    /* define the (constant) FRAME_PAR item header */
-    cep->framehead.type = PICODATA_ITEM_FRAME_PAR;
-    cep->framehead.info1 = PICOCEP_OUT_DATA_FORMAT;
-    cep->framehead.info2 = cep->pdfmgc->ceporder;
-    cep->framehead.len = sizeof(picoos_uint16) + (cep->framehead.info2 + 4)
-            * sizeof(picoos_uint16);
+        /*---------------------- other working variables ---------------------------*/
+        /* define the (constant) FRAME_PAR item header */
+        cep->framehead.type = PICODATA_ITEM_FRAME_PAR;
+        cep->framehead.info1 = PICOCEP_OUT_DATA_FORMAT;
+        cep->framehead.info2 = cep->pdfmgc->ceporder;
+        cep->framehead.len = sizeof(picoos_uint16) + (cep->framehead.info2 + 4)
+                * sizeof(picoos_uint16);
+        cep->scmeanpowLFZ = cep->pdflfz->bigpow - cep->pdflfz->meanpow;
+        cep->scmeanpowMGC = cep->pdfmgc->bigpow - cep->pdfmgc->meanpow;
 
+        cep->scmeanLFZ = (1 << (picoos_uint32) cep->scmeanpowLFZ);
+
+        cep->scmeanMGC = (1 << (picoos_uint32) cep->scmeanpowMGC);
+
+    }
     /* constants used in makeWUWandWUm */
     initSmoothing(cep);
 
-    cep->scmeanpowLFZ = cep->pdflfz->bigpow - cep->pdflfz->meanpow;
-    cep->scmeanpowMGC = cep->pdfmgc->bigpow - cep->pdfmgc->meanpow;
-
-    cep->scmeanLFZ = (1 << (picoos_uint32) cep->scmeanpowLFZ);
-
-    cep->scmeanMGC = (1 << (picoos_uint32) cep->scmeanpowMGC);
 
     return PICO_OK;
 }/*cepInitialize*/
@@ -461,7 +463,7 @@
         picoos_deallocate(mm, (void*) &this);
         return NULL;
     }
-    cepInitialize(this);
+    cepInitialize(this, PICO_RESET_FULL);
 
     return this;
 }/*picocep_newCepUnit*/
diff --git a/pico/lib/picoctrl.c b/pico/lib/picoctrl.c
index 5af70e3..25550f2 100644
--- a/pico/lib/picoctrl.c
+++ b/pico/lib/picoctrl.c
@@ -90,7 +90,7 @@
  * @callgraph
  * @callergraph
  */
-static pico_status_t ctrlInitialize(register picodata_ProcessingUnit this) {
+static pico_status_t ctrlInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode) {
     register ctrl_subobj_t * ctrl;
     pico_status_t status= PICO_OK;
     picoos_int8 i;
@@ -104,7 +104,7 @@
     status = PICO_OK;
     for (i = 0; i < ctrl->numProcUnits; i++) {
         if (PICO_OK == status) {
-            status = ctrl->procUnit[i]->initialize(ctrl->procUnit[i]);
+            status = ctrl->procUnit[i]->initialize(ctrl->procUnit[i], r_mode);
             PICODBG_DEBUG(("(re-)initializing procUnit[%i] returned status %i",i, status));
         }
         if (PICO_OK == status) {
@@ -521,7 +521,7 @@
  * @callgraph
  * @callergraph
  */
-pico_status_t picoctrl_engReset(picoctrl_Engine this)
+pico_status_t picoctrl_engReset(picoctrl_Engine this, picoos_int32 r_mode)
 {
     pico_status_t status;
 
@@ -532,7 +532,7 @@
 
     status = this->control->terminate(this->control);
     if (PICO_OK == status) {
-        status = this->control->initialize(this->control);
+        status = this->control->initialize(this->control, r_mode);
     }
     if (PICO_OK == status) {
         status = picodata_cbReset(this->cbIn);
diff --git a/pico/lib/picoctrl.h b/pico/lib/picoctrl.h
index 1dfea54..ff85d5a 100644
--- a/pico/lib/picoctrl.h
+++ b/pico/lib/picoctrl.h
@@ -69,8 +69,8 @@
         picoos_int16 * bytesPut);
 
 pico_status_t picoctrl_engReset(
-        picoctrl_Engine engine
-        );
+        picoctrl_Engine engine,
+        picoos_int32 r_mode);
 
 picoos_Common picoctrl_engGetCommon(picoctrl_Engine this);
 
diff --git a/pico/lib/picodata.c b/pico/lib/picodata.c
index 244e4b6..b886959 100644
--- a/pico/lib/picodata.c
+++ b/pico/lib/picodata.c
@@ -574,7 +574,7 @@
     picorsrc_Voice voice;
 } simple_pu_data_t;
 
-static pico_status_t puSimpleInitialize (register picodata_ProcessingUnit this) {
+static pico_status_t puSimpleInitialize (register picodata_ProcessingUnit this, picoos_int32 r_mode) {
     return PICO_OK;
 }
 
diff --git a/pico/lib/picodata.h b/pico/lib/picodata.h
index 637a3ff..2105051 100644
--- a/pico/lib/picodata.h
+++ b/pico/lib/picodata.h
@@ -498,7 +498,7 @@
 pico_status_t picodata_setCbOut(picodata_ProcessingUnit this, picodata_CharBuffer cbOut);
 
 /* protected */
-typedef pico_status_t (* picodata_puInitializeMethod) (register picodata_ProcessingUnit this);
+typedef pico_status_t (* picodata_puInitializeMethod) (register picodata_ProcessingUnit this, picoos_int32 mode);
 typedef pico_status_t (* picodata_puTerminateMethod) (register picodata_ProcessingUnit this);
 typedef picodata_step_result_t (* picodata_puStepMethod) (register picodata_ProcessingUnit this, picoos_int16 mode, picoos_uint16 * numBytesOutput);
 typedef pico_status_t (* picodata_puSubDeallocateMethod) (register picodata_ProcessingUnit this, picoos_MemoryManager mm);
diff --git a/pico/lib/picodefs.h b/pico/lib/picodefs.h
index 6613e84..8c24039 100644
--- a/pico/lib/picodefs.h
+++ b/pico/lib/picodefs.h
@@ -156,6 +156,11 @@
 
 #define PICO_STEP_ERROR                 (pico_Status)  -200
 
+/* Engine reset modes ***********************************************************/
+
+/* general */
+#define PICO_RESET_FULL                 (pico_Status)    0
+#define PICO_RESET_SOFT                 (pico_Status)    0x10
 
 
 /* ********************************************************************/
diff --git a/pico/lib/picopam.c b/pico/lib/picopam.c
index 02e5cc2..f3253a6 100644
--- a/pico/lib/picopam.c
+++ b/pico/lib/picopam.c
@@ -386,7 +386,7 @@
 /*------------------------------------------------------------------
  Service routines :
  ------------------------------------------------------------------*/
-static pico_status_t pam_initialize(register picodata_ProcessingUnit this);
+static pico_status_t pam_initialize(register picodata_ProcessingUnit this, picoos_int32 r_mode);
 static pico_status_t pam_terminate(register picodata_ProcessingUnit this);
 static pico_status_t pam_allocate(picoos_MemoryManager mm, pam_subobj_t *pam);
 static void pam_deallocate(picoos_MemoryManager mm, pam_subobj_t *pam);
@@ -556,7 +556,7 @@
  * @callgraph
  * @callergraph
  */
-static pico_status_t pam_initialize(register picodata_ProcessingUnit this)
+static pico_status_t pam_initialize(register picodata_ProcessingUnit this, picoos_int32 r_mode)
 {
     pico_status_t nI, nJ;
     pam_subobj_t *pam;
@@ -599,6 +599,11 @@
     pam->nLastAttachedItemId = pam->nCurrAttachedItem = 0;
     pam->nAttachedItemsSize = 0;
 
+    if (r_mode == PICO_RESET_SOFT) {
+        /*following initializations needed only at startup or after a full reset*/
+        return PICO_OK;
+    }
+
     /*pitch and duration modifiers*/
     pam->pMod = 1.0f;
     pam->dMod = 1.0f;
@@ -621,6 +626,8 @@
             }
         }
     }
+
+
 /*-----------------------------------------------------------------
      * MANAGE LINGWARE INITIALIZATION IF NEEDED
      ------------------------------------------------------------------*/
@@ -813,7 +820,7 @@
     /*-----------------------------------------------------------------
      * Initialize memory for PAM (this may be re-used elsewhere, e.g.Reset)
      * ------------------------------------------------------------------*/
-    if (PICO_OK != pam_initialize(this)) {
+    if (PICO_OK != pam_initialize(this, PICO_RESET_FULL)) {
         PICODBG_ERROR(("problem initializing the pam sub-object"));
     }
     return this;
diff --git a/pico/lib/picopr.c b/pico/lib/picopr.c
index f54734a..d5371d7 100644
--- a/pico/lib/picopr.c
+++ b/pico/lib/picopr.c
@@ -3168,8 +3168,9 @@
 /* *****************************************************************************/
 
 
-pico_status_t prReset(register picodata_ProcessingUnit this)
+pico_status_t prReset(register picodata_ProcessingUnit this, picoos_int32 r_mode)
 {
+
     picoos_int32 i;
     pr_subobj_t * pr;
 
@@ -3226,6 +3227,10 @@
 
     pr->forceOutput = FALSE;
 
+    if (r_mode == PICO_RESET_SOFT) {
+        /*following initializations needed only at startup or after a full reset*/
+        return PICO_OK;
+    }
 
     pr->xsampa_parser = picokfst_getFST(this->voice->kbArray[PICOKNOW_KBID_FST_XSAMPA_PARSE]);
 
@@ -3239,14 +3244,14 @@
 }
 
 
-pico_status_t prInitialize(register picodata_ProcessingUnit this)
+pico_status_t prInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode)
 {
 /*
     if (NULL == this || NULL == this->subObj) {
         return PICO_ERR_OTHER;
     }
 */
-    return prReset(this);
+    return prReset(this, r_mode);
 }
 
 
@@ -3314,7 +3319,7 @@
         picoos_deallocate(mm, (void *)&this);
         return NULL;
     }
-    prInitialize(this);
+    prInitialize(this, PICO_RESET_FULL);
     return this;
 }
 
diff --git a/pico/lib/picosa.c b/pico/lib/picosa.c
index 3147c76..ab48713 100644
--- a/pico/lib/picosa.c
+++ b/pico/lib/picosa.c
@@ -242,7 +242,7 @@
 } sa_subobj_t;
 
 
-static pico_status_t saInitialize(register picodata_ProcessingUnit this) {
+static pico_status_t saInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode) {
     sa_subobj_t * sa;
     picoos_uint16 i;
     picokfst_FST fst;
@@ -294,6 +294,11 @@
     sa->phonWritePos = 0;
     sa->nextReadPos = 0;
 
+    if (r_mode == PICO_RESET_SOFT) {
+        /*following initializations needed only at startup or after a full reset*/
+        return PICO_OK;
+    }
+
     /* kb fst[] */
     sa->numFsts = 0;
     for (i = 0; i<PICOKNOW_MAX_NUM_WPHO_FSTS; i++) {
@@ -471,7 +476,7 @@
     }
 
 
-    saInitialize(this);
+    saInitialize(this, PICO_RESET_FULL);
     return this;
 }
 
diff --git a/pico/lib/picosig.c b/pico/lib/picosig.c
index be44b3c..4282e24 100644
--- a/pico/lib/picosig.c
+++ b/pico/lib/picosig.c
@@ -114,7 +114,7 @@
  * @callgraph
  * @callergraph
  */
-static pico_status_t sigInitialize(register picodata_ProcessingUnit this)
+static pico_status_t sigInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode)
 {
     sig_subobj_t *sig_subObj;
     if (NULL == this || NULL == this->subObj) {
@@ -147,33 +147,40 @@
     /*-----------------------------------------------------------------
      * MANAGE LINGWARE INITIALIZATION IF NEEDED
      ------------------------------------------------------------------*/
-    sig_subObj->pdfmgc = picokpdf_getPdfMUL(
-            this->voice->kbArray[PICOKNOW_KBID_PDF_MGC]);
-    sig_subObj->pdflfz = picokpdf_getPdfMUL(
-            this->voice->kbArray[PICOKNOW_KBID_PDF_LFZ]);
-    sig_subObj->pdfphs = picokpdf_getPdfPHS(
-            this->voice->kbArray[PICOKNOW_KBID_PDF_PHS]);
+    if (r_mode == PICO_RESET_FULL) {
+        /*not done when resetting SOFT*/
+        sig_subObj->pdfmgc = picokpdf_getPdfMUL(
+                this->voice->kbArray[PICOKNOW_KBID_PDF_MGC]);
+        sig_subObj->pdflfz = picokpdf_getPdfMUL(
+                this->voice->kbArray[PICOKNOW_KBID_PDF_LFZ]);
+        sig_subObj->pdfphs = picokpdf_getPdfPHS(
+                this->voice->kbArray[PICOKNOW_KBID_PDF_PHS]);
 
-    sig_subObj->scmeanpowLFZ = sig_subObj->pdflfz->bigpow
-            - sig_subObj->pdflfz->meanpow;
-    sig_subObj->scmeanpowMGC = sig_subObj->pdfmgc->bigpow
-            - sig_subObj->pdfmgc->meanpow;
-    sig_subObj->scmeanLFZ = (1 << (picoos_uint32) sig_subObj->scmeanpowLFZ);
-    sig_subObj->scmeanMGC = (1 << (picoos_uint32) sig_subObj->scmeanpowMGC);
-    sig_subObj->fSampNorm = PICOSIG_NORM1 * sig_subObj->pdfmgc->amplif;
+        sig_subObj->scmeanpowLFZ = sig_subObj->pdflfz->bigpow
+                - sig_subObj->pdflfz->meanpow;
+        sig_subObj->scmeanpowMGC = sig_subObj->pdfmgc->bigpow
+                - sig_subObj->pdfmgc->meanpow;
+        sig_subObj->scmeanLFZ = (1 << (picoos_uint32) sig_subObj->scmeanpowLFZ);
+        sig_subObj->scmeanMGC = (1 << (picoos_uint32) sig_subObj->scmeanpowMGC);
+        sig_subObj->fSampNorm = PICOSIG_NORM1 * sig_subObj->pdfmgc->amplif;
+        /*-----------------------------------------------------------------
+         * Initialize memory for DSP
+         * ------------------------------------------------------------------*/
+        sigDspInitialize(&(sig_subObj->sig_inner), r_mode);
+        /*-----------------------------------------------------------------
+         * Initialize modifiers
+         * ------------------------------------------------------------------*/
+        /*pitch , volume , speaker modifiers*/
+        sig_subObj->pMod = 1.0f;
+        sig_subObj->vMod = 1.0f;
+        sig_subObj->sMod = 1.0f;
+    } else {
+        /*-----------------------------------------------------------------
+         * Initialize memory for DSP
+         * ------------------------------------------------------------------*/
+        sigDspInitialize(&(sig_subObj->sig_inner), r_mode);
+    }
 
-    /*-----------------------------------------------------------------
-     * Initialize memory for DSP
-     * ------------------------------------------------------------------*/
-    sigDspInitialize(&(sig_subObj->sig_inner));
-
-    /*-----------------------------------------------------------------
-     * Initialize modifiers
-     * ------------------------------------------------------------------*/
-    /*pitch , volume , speaker modifiers*/
-    sig_subObj->pMod = 1.0f;
-    sig_subObj->vMod = 1.0f;
-    sig_subObj->sMod = 1.0f;
 
     return PICO_OK;
 }/*sigInitialize*/
@@ -287,7 +294,7 @@
     /*-----------------------------------------------------------------
      * Initialize memory for DSP (this may be re-used elsewhere, e.g.Reset)
      * ------------------------------------------------------------------*/
-    if (PICO_OK != sigInitialize(this)) {
+    if (PICO_OK != sigInitialize(this, PICO_RESET_FULL)) {
         PICODBG_ERROR(("Error in iSig Sub Object initialization"));
         sigDeallocate(mm, &(sig_subObj->sig_inner));
         picoos_deallocate(mm, (void *) &this);
diff --git a/pico/lib/picosig2.c b/pico/lib/picosig2.c
index e431c90..52943e6 100644
--- a/pico/lib/picosig2.c
+++ b/pico/lib/picosig2.c
@@ -412,11 +412,30 @@
  * @callgraph
  * @callergraph
  */
-void sigDspInitialize(sig_innerobj_t *sig_inObj)
+void sigDspInitialize(sig_innerobj_t *sig_inObj, picoos_int32 r_mode)
 {
     picoos_int32 i, j;
     picoos_int32 *pnt;
 
+    if (r_mode == PICO_RESET_SOFT) {
+        /*minimal initialization when receiving a soft reset */
+        return;
+        /*
+        sig_inObj->voxbnd_p = (picoos_int32) ((picoos_single) sig_inObj->hfftsize_p
+                / ((picoos_single) sig_inObj->Fs_p / (picoos_single) 2)
+                * (picoos_single) sig_inObj->VCutoff_p);
+        sig_inObj->voxbnd2_p
+                = (picoos_int32) ((picoos_single) sig_inObj->hfftsize_p
+                        / ((picoos_single) sig_inObj->Fs_p / (picoos_single) 2)
+                        * (picoos_single) sig_inObj->UVCutoff_p);
+        sig_inObj->nextPeak_p = (((int) (PICODSP_FFTSIZE))
+                / ((int) PICODSP_DISPLACE) - 1) * sig_inObj->hop_p;
+        for (i = 0; i < 2 * PICODSP_FFTSIZE; i++) {
+             sig_inObj->int_vec26[i] = 0;
+        }
+        return;
+        */
+    }
     /*-----------------------------------------------------------------
      * Initialization
      * ------------------------------------------------------------------*/
diff --git a/pico/lib/picosig2.h b/pico/lib/picosig2.h
index f239ced..1b975db 100644
--- a/pico/lib/picosig2.h
+++ b/pico/lib/picosig2.h
@@ -139,7 +139,7 @@
 extern pico_status_t sigAllocate(picoos_MemoryManager mm,
         sig_innerobj_t *sig_inObj);
 extern void sigDeallocate(picoos_MemoryManager mm, sig_innerobj_t *sig_inObj);
-extern void sigDspInitialize(sig_innerobj_t *sig_inObj);
+extern void sigDspInitialize(sig_innerobj_t *sig_inObj, picoos_int32 r_mode);
 
 /*------------------------------------------------------------------
  Exported (to picosig.c) Processing routines :
diff --git a/pico/lib/picospho.c b/pico/lib/picospho.c
index 0d0cdf8..bf9dd80 100644
--- a/pico/lib/picospho.c
+++ b/pico/lib/picospho.c
@@ -286,7 +286,7 @@
 }
 
 
-static pico_status_t sphoInitialize(register picodata_ProcessingUnit this)
+static pico_status_t sphoInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode)
 {
     picoos_uint8 i;
     spho_subobj_t * spho;
@@ -392,7 +392,7 @@
         return NULL;
     }
 
-    sphoInitialize(this);
+    sphoInitialize(this, PICO_RESET_FULL);
     return this;
 }
 
diff --git a/pico/lib/picotok.c b/pico/lib/picotok.c
index 4488609..969e2a3 100644
--- a/pico/lib/picotok.c
+++ b/pico/lib/picotok.c
@@ -1385,7 +1385,7 @@
 
 /* *****************************************************************************/
 
-static pico_status_t tokReset(register picodata_ProcessingUnit this)
+static pico_status_t tokReset(register picodata_ProcessingUnit this, picoos_int32 r_mode)
 {
     tok_subobj_t * tok;
     MarkupId mId;
@@ -1449,7 +1449,7 @@
     return PICO_OK;
 }
 
-static pico_status_t tokInitialize(register picodata_ProcessingUnit this)
+static pico_status_t tokInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode)
 {
 /*
 
@@ -1460,7 +1460,7 @@
     }
     tok = (tok_subobj_t *) this->subObj;
 */
-    return tokReset(this);
+    return tokReset(this, r_mode);
 }
 
 
@@ -1508,7 +1508,7 @@
         picoos_deallocate(mm, (void *)&this);
         return NULL;
     }
-    tokInitialize(this);
+    tokInitialize(this, PICO_RESET_FULL);
     return this;
 }
 
diff --git a/pico/lib/picowa.c b/pico/lib/picowa.c
index 3e793c9..ab8ca51 100644
--- a/pico/lib/picowa.c
+++ b/pico/lib/picowa.c
@@ -78,7 +78,7 @@
 } wa_subobj_t;
 
 
-static pico_status_t waInitialize(register picodata_ProcessingUnit this) {
+static pico_status_t waInitialize(register picodata_ProcessingUnit this, picoos_int32 r_mode) {
     picoos_uint8 i;
     picoklex_Lex ulex;
     wa_subobj_t * wa;
@@ -98,6 +98,10 @@
     wa->outBufSize = PICOWA_MAXITEMSIZE;
     wa->outLen = 0;
 
+    if (r_mode == PICO_RESET_SOFT) {
+        /*following initializations needed only at startup or after a full reset*/
+        return PICO_OK;
+    }
     /* kb lex */
     wa->lex = picoklex_getLex(this->voice->kbArray[PICOKNOW_KBID_LEX_MAIN]);
     if (wa->lex == NULL) {
@@ -177,7 +181,7 @@
         return NULL;
     }
 
-    waInitialize(this);
+    waInitialize(this, PICO_RESET_FULL);
     return this;
 }
 
diff --git a/pico/tts/com_svox_picottsengine.cpp b/pico/tts/com_svox_picottsengine.cpp
index f7df2a4..0c4b5fc 100644
--- a/pico/tts/com_svox_picottsengine.cpp
+++ b/pico/tts/com_svox_picottsengine.cpp
@@ -1356,7 +1356,7 @@
     while (text_remaining) {
         
         if (picoSynthAbort) {
-            ret = pico_resetEngine( picoEngine );
+            ret = pico_resetEngine( picoEngine, PICO_RESET_SOFT );
             break;
         }
 
@@ -1374,7 +1374,7 @@
         inp += bytes_sent;
         do {
             if (picoSynthAbort) {
-                ret = pico_resetEngine( picoEngine );
+                ret = pico_resetEngine( picoEngine, PICO_RESET_SOFT );
                 break;
             }
             /* Retrieve the samples and add them to the buffer. */
@@ -1391,7 +1391,7 @@
                     if (cbret == TTS_CALLBACK_HALT) {
                         LOGI("Halt requested by caller. Halting.");
                         picoSynthAbort = 1;
-                        ret = pico_resetEngine( picoEngine );
+                        ret = pico_resetEngine( picoEngine, PICO_RESET_SOFT );
                         break;
                     }
                     bufused = 0;
@@ -1419,7 +1419,7 @@
             LOGV("Synth loop: sending TTS_SYNTH_DONE after error");
             picoSynthDoneCBPtr( userdata, 16000, AudioSystem::PCM_16_BIT, 1, buffer, bufused,
                     TTS_SYNTH_DONE);
-            pico_resetEngine( picoEngine );
+            pico_resetEngine( picoEngine, PICO_RESET_SOFT );
             return TTS_FAILURE;
         }
     }