diff src/ui3/bmi/mmiVoiceMemo.c @ 421:6a4d9f47793e

src/ui3/bmi: file renames to make the case consistent
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 21 Jan 2018 03:28:53 +0000
parents src/ui3/bmi/MmiVoiceMemo.c@e8ddbb0837ed
children 0f2c6f6e3588
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ui3/bmi/mmiVoiceMemo.c	Sun Jan 21 03:28:53 2018 +0000
@@ -0,0 +1,1855 @@
+/*******************************************************************************
+
+          CONDAT (UK)
+
+********************************************************************************
+
+ This software product is the property of Condat (UK) Ltd and may not be
+ disclosed to any third party without the express permission of the owner.
+
+********************************************************************************
+
+ $Project name: Basic MMI
+ $Project code: BMI (6349)
+ $Module:   VOICEMEMO
+ $File:       MmiVoiceMemo.c
+ $Revision:   1.0
+
+ $Author:   Condat(UK)
+ $Date:       09/04/01
+
+********************************************************************************
+
+ Description:
+
+    This provides the start code for the MMI
+
+********************************************************************************
+ $History: MmiVoiceMemo.c
+
+	Mar 28, 2007  DR: OMAPS00122762 x0039928
+	Description: MM: Deleting a PCM Voice Memo message in one particular memory, 
+	delete them in all memories
+	Solution: voice memo position and pcm voice memo position is provided for all the devices.
+	
+Mar 31, 2006   ER: OMAPS00067709  x0pleela
+Description: Voice Buffering implementation on C+ for PTT via PCM API 
+Solution: Added prototype for voice_buffering_stop_recording
+		Updating voicebuffering data for play stopped in play callback 
+			
+Mar 15, 2006   ER: OMAPS00067709  x0pleela
+Description: Voice Buffering implementation on C+ for PTT via PCM API 
+Solution: Defined new macro "PCM_VOICE_MEMO_MAX_DURATION" to restrict the recording 
+			timeout to 20 secs for PCM voice memo and voice buffering
+		Added prototypes of new functions inputVoiceMemoNumberEditor, voiceMemoNumberCB, 
+			voice_buffering_tim_cb, voice_buffering_data_reset
+		Added following new functions:
+			pcm_voice_memo_play: Sets voice memo type to PCM_VOICE_MEMO which indicates 
+									PCM voice memo is active and start playing the voice
+			pcm_voice_memo_record: Sets voice memo type to PCM_VOICE_MEMO which indicates 
+									PCM voice memo is active and start recording the voice
+			voice_buffering_edit_num: Opens an edtor for the user to enter PTT number. Also resets
+									voice buffering data with default values
+			voiceMemoNumberCB: call back for number entry
+			inputVoiceMemoNumberEditor: Settings of Editor
+			voice_buffering_record_start: Starts recording voice and conects to the PTT number if the
+										call is not active. If in call, then start playing the voice
+			voice_buffering_record_stop: Stops the timer and recording. If call is not active the 
+										disconnects the call
+			voice_buffering_playback_start: Starts playing the voice. If any error while playing, 
+										stops timer and recording
+			voice_buffering_stop_recording: A wrapper function for record stop to invoke from other 
+										modules. Stops the timer and recording
+			voice_buffering_stop_playing: A wrapper function for play stop to invoke from other modules
+			voice_buffering_tim_cb: Timer callback. Stops the timer. If PTT call is not setup disconnect 
+									the call, else call record stop
+			voice_buffering_data_reset: Resets voice buffering data to default values
+
+		Function: voice_memo_play, voice_memo_record, voice_memo_destroy
+		Changes: Added code to set voice memo type
+
+		Function: voice_memo
+		Changes: Added code to handle record start, play start for PCM voice memo
+
+		Function: voice_memo_tim_cb
+		Changes: Added code to handle record stop, play stop for PCM voice memo
+
+		Function: voice_memo_riv_play_cb
+		Changes: Added code to allow user to accept ant incoming call after the buffering phase
+			
+Feb 27, 2006    ER: OMAPS00067709 x0pleela
+Description: Voice Buffering implementation on C+ for PTT via PCM API 
+Solution: Defined a global variable gPcm_voice_Memo which indicates which Voice memo is active 
+		and corresponding audio APIs will be invoked and duplication of code is avoided
+
+Feb 24, 2006    ER: OMAPS00067709 x0pleela
+Description: Voice Buffering implementation on C+ for PTT via PCM API 
+Solution: Defined new macro PCM_VOICE_MEMO_MAX_DURATION which defines maximum 
+			recording and playing duration for PCM voice memo and voice buffering
+		Implemented following functions to support PCM voice memo feature
+			pcm_voice_memo_init: Initialization of PCM voice memo
+			pcm_voice_memo_exit:Termination of PCM voice memo
+			pcm_voice_memo_play:Starts PCM voice memo play functionality
+			pcm_voice_memo_record:Starts PCM voice memo record functionality
+			pcm_voice_memo_start: create a new voicememo dialog
+			pcm_voice_memo_create: Creation of window
+			pcm_voice_memo_destroy: Destruction of an dialog
+			pcm_voice_memo: Dialog function for PCM voice memo dialog
+			pcm_voice_memo_win_cb:Callback function for information dialog
+			pcm_voice_memo_tim_cb: Callback function for the PCM voice_memo timer.
+			pcm_voice_memo_kbd_cb: Keyboard event handler
+			pcm_voice_memo_riv_record_cb: Callback that handles the return status for PCM voice memo recording
+			pcm_voice_memo_riv_play_cb:Callback that handles the return status for PCM voice memo palying
+			
+  09/04/01      Original Condat(UK) BMI version.
+
+ $End
+
+*******************************************************************************/
+
+
+
+
+/*******************************************************************************
+
+                                Include files
+
+*******************************************************************************/
+#define ENTITY_MFW
+
+/* includes */
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "typedefs.h"
+#include "vsi.h"
+#include "pei.h"
+#include "custom.h"
+#include "gsm.h"
+
+#include "mfw_sys.h"
+
+#include "prim.h"
+
+#include "cus_aci.h"
+
+#include "mfw_mfw.h"
+#include "mfw_win.h"
+#include "mfw_kbd.h"
+/* SPR#1428 - SH - New Editor changes */
+#ifndef NEW_EDITOR
+#include "mfw_edt.h"
+#endif
+#include "mfw_lng.h"
+#include "mfw_tim.h"
+#include "mfw_icn.h"
+#include "mfw_mnu.h"
+#include "mfw_phb.h"
+#include "mfw_cm.h"
+#include "mfw_sim.h"
+#include "mfw_nm.h"
+#include "mfw_sat.h"
+#include "mfw_phb.h"
+#include "ksd.h"
+#include "psa.h"
+#include "mfw_sms.h"
+#include "mfw_cphs.h"
+#include "mfw_sat.h"
+
+#include "dspl.h"
+
+
+#include "MmiMmi.h"
+#include "MmiDummy.h"
+#include "MmiDialogs.h"
+#include "MmiLists.h"
+#include "MmiIdle.h"
+#include "MmiSoftKeys.h"
+#include "Mmiicons.h"
+#include "MmiMenu.h"
+#include "MmiMain.h"
+#include "MmiStart.h"
+#include "MmiPins.h"
+#include "MmiSettings.h"
+
+#include "gdi.h"
+#include "audio.h"
+#include "MmiSounds.h"
+#include "MmiResources.h"
+#include "mmiColours.h"
+
+//#include "vmd.h"
+#include "MmiVoiceMemo.h"
+#include "mfw_ffs.h"
+
+/* BEGIN ADD: Req ID: : Sumit : 14-Mar-05 */
+#ifndef NEPTUNE_BOARD
+/* END ADD: Req ID: : Sumit : 14-Mar-05 */
+#include "Audio/audio_api.h"
+/* BEGIN ADD: Req ID: : Sumit : 14-Mar-05 */
+#endif /* NEPTUNE_BOARD*/
+/* END ADD: Req ID: : Sumit : 14-Mar-05 */
+
+#include "mfw_aud.h"
+
+//x0pleela 09 Mar, 2006  ER:OMAPS00067709
+//Including this header to support number editor
+#ifdef FF_PCM_VM_VB
+#include "MmiBookshared.h"
+#endif
+/*******************************************************************************
+
+                                internal data
+
+*******************************************************************************/
+
+/*
+ * Internal events
+ */
+#define VM_INIT           500
+#define VM_DESTROY       501
+#define VM_PLAY           502
+#define VM_RECORD         503
+#define VM_DELETE_BUFFER  504
+
+#define VOICE_MEMO_MAX_DURATION 10					// 10 Secs
+
+typedef struct
+{
+  T_MMI_CONTROL   mmi_control;
+  T_MFW_HND       parent_win;
+  T_MFW_HND       info_win;
+  T_MFW_HND       info_tim;
+  T_MFW_HND       info_kbd;
+  USHORT          Identifier;
+  USHORT          time;
+  char         elapsed_time[7];
+  int			  play_sk2;
+} T_voice_memo;
+
+//x0pleela 09 Mar, 2006   ER:OMAPS00067709
+#ifdef FF_PCM_VM_VB
+EXTERN T_voice_buffering voice_buffering_data;
+EXTERN T_call call_data; 
+#endif
+/*******************************************************************************
+
+                                Local prototypes
+
+*******************************************************************************/
+
+
+T_MFW_HND       voice_memo_start  (T_MFW_HND  parent_win, SHORT ID);
+static T_MFW_HND    voice_memo_create (T_MFW_HND  parent_win);
+static void       voice_memo_destroy  (T_MFW_HND  own_window);
+static void       voice_memo      (T_MFW_HND  win, USHORT event, SHORT value, void * parameter);
+static int        voice_memo_win_cb (T_MFW_EVENT event, T_MFW_WIN * win);
+static T_MFW_CB     voice_memo_tim_cb (T_MFW_EVENT event, T_MFW_TIM * tc);
+static int        voice_memo_kbd_cb (T_MFW_EVENT event, T_MFW_KBD * keyboard);
+static void			voice_memo_dialog_create(T_MFW_HND win, int str1, int str2);
+void          voice_memo_dialog_cb (T_MFW_HND win, UBYTE identifier, UBYTE reason);
+GLOBAL void voice_buffering_playback_start(void );
+/*
+** Rivera Callback functions
+*/
+static void voice_memo_riv_record_cb(void *parameter);
+static void voice_memo_riv_play_cb(void *parameter);
+
+//x0pleela 02 Mar, 2006  ER:OMAPS00067709
+//Including this header to support number editor
+#ifdef FF_PCM_VM_VB
+MfwHnd inputVoiceMemoNumberEditor( MfwHnd parent, void *buffer );
+void voiceMemoNumberCB( T_MFW_HND win, USHORT Identifier, UBYTE reason );
+static int voice_buffering_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc);
+static void voice_buffering_data_reset( void );
+GLOBAL void voice_buffering_stop_recording(void );
+#endif
+/*******************************************************************************
+
+ $Function:     voice_memo_init
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL void voice_memo_init (void)
+{
+  TRACE_FUNCTION ("voice_memo_init()");
+  
+  #ifdef FF_PCM_VM_VB
+    voice_buffering_data_reset();
+  #endif
+  
+}
+
+/*******************************************************************************
+
+ $Function:     voice_memo_exit
+
+ $Description:
+
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL void voice_memo_exit (void)
+{
+  TRACE_FUNCTION ("voice_memo_exit()");
+	
+}
+
+
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_play
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int  voice_memo_play (MfwMnu* m, MfwMnuItem* i)
+{
+  T_MFW_HND win = mfw_parent(mfw_header());
+
+  TRACE_FUNCTION ("voice_memo_play()");
+
+  //x0pleela 27 Feb, 2006  ER: OMAPA00067709
+  //Set this variable to VOICE_MEMOwhich indicates  voice memo is active
+  #ifdef FF_PCM_VM_VB
+   set_voice_memo_type( AMR_VOICE_MEMO);
+  #endif
+  
+  //create a new voice memo dialog
+  voice_memo_start (win, VM_PLAY);
+  return 1;  // ADDED BY RAVI - 29-11-2005
+}
+
+/*******************************************************************************
+
+ $Function:     voice_memo_storeage
+
+ $Description:
+
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int PCM_voice_memo_storeage (MfwMnu* m, MfwMnuItem* i)
+{
+	T_MFW_HND parent_win = mfwParent(mfw_header());
+	int txtId = TxtFFS;
+
+	TRACE_FUNCTION("mmi_camera_set_storage()");
+
+	switch (m->lCursor[m->level])
+	{
+		case 0:
+			txtId = TxtFFS;
+			FFS_flashData.PCM_voicememo_storage = SNAP_STG_FFS;
+		break;
+		
+		case 1:
+			txtId = TxtNORMS;
+			FFS_flashData.PCM_voicememo_storage = SNAP_STG_NORMS;
+		break;
+		
+		case 2:
+			txtId = TxtNAND;
+			FFS_flashData.PCM_voicememo_storage = SNAP_STG_NAND;
+		break;
+		
+		case 3:
+			txtId = TxtTflash;
+			FFS_flashData.PCM_voicememo_storage = SNAP_STG_MMC;
+		break;
+	}
+
+	flash_write();
+	//Set the Quality Factor.
+	TRACE_EVENT_P1("STorage set to %d ", FFS_flashData.PCM_voicememo_storage);
+	//Display the dialgbox to the user.
+	voice_memo_dialog_create(parent_win,txtId,TxtSelected);
+	return MFW_EVENT_CONSUMED; 
+}
+
+/*******************************************************************************
+
+ $Function:     voice_memo_storeage
+
+ $Description:
+
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int voice_buffer_storeage (MfwMnu* m, MfwMnuItem* i)
+{
+	T_MFW_HND parent_win = mfwParent(mfw_header());
+	int txtId = TxtFFS;
+
+	TRACE_FUNCTION("mmi_camera_set_storage()");
+
+	switch (m->lCursor[m->level])
+	{
+		case 0:
+			txtId = TxtFFS;
+			FFS_flashData.voicebuffer_storage = SNAP_STG_FFS;
+		break;
+		
+		case 1:
+			txtId = TxtNORMS;
+			FFS_flashData.voicebuffer_storage = SNAP_STG_NORMS;
+		break;
+
+		case 2:
+			txtId = TxtNAND;
+			FFS_flashData.voicebuffer_storage = SNAP_STG_NAND;
+		break;
+		
+		case 3:
+			txtId = TxtTflash;
+			FFS_flashData.voicebuffer_storage = SNAP_STG_MMC;
+		break;
+	}
+
+	flash_write();
+	//Set the Quality Factor.
+	TRACE_EVENT_P1("STorage set to %d ", FFS_flashData.voicebuffer_storage);
+	//Display the dialgbox to the user.
+	voice_memo_dialog_create(parent_win,txtId,TxtSelected);
+	return MFW_EVENT_CONSUMED; 
+}
+
+/*******************************************************************************
+
+ $Function:     voice_memo_storeage
+
+ $Description:
+
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int voice_memo_storeage (MfwMnu* m, MfwMnuItem* i)
+{
+	T_MFW_HND parent_win = mfwParent(mfw_header());
+	int txtId = TxtFFS;
+
+	TRACE_FUNCTION("mmi_camera_set_storage()");
+
+	switch (m->lCursor[m->level])
+	{
+		case 0:
+			txtId = TxtFFS;
+			FFS_flashData.voicememo_storage = SNAP_STG_FFS;
+		break;
+		
+		case 1:
+			txtId = TxtNORMS;
+			FFS_flashData.voicememo_storage = SNAP_STG_NORMS;
+		break;
+		
+		case 2:
+			txtId = TxtNAND;
+			FFS_flashData.voicememo_storage = SNAP_STG_NAND;
+		break;
+		
+		case 3:
+			txtId = TxtTflash;
+			FFS_flashData.voicememo_storage = SNAP_STG_MMC;
+		break;
+	}
+
+	flash_write();
+	//Set the Quality Factor.
+	TRACE_EVENT_P1("STorage set to %d ", FFS_flashData.voicememo_storage);
+	//Display the dialgbox to the user.
+	voice_memo_dialog_create(parent_win,txtId,TxtSelected);
+	return MFW_EVENT_CONSUMED; 
+}
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_record
+
+ $Description:
+
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int voice_memo_record (MfwMnu* m, MfwMnuItem* i)
+{
+
+  T_MFW_HND win = mfw_parent(mfw_header());
+
+  TRACE_FUNCTION ("voice_memo_record()");
+
+  //x0pleela 27 Feb, 2006  ER: OMAPA00067709
+  //Set this variable to VOICE_MEMOwhich indicates  voice memo is active
+  #ifdef FF_PCM_VM_VB
+    set_voice_memo_type( AMR_VOICE_MEMO);
+  #endif
+  //create a new voice memo dialog
+  voice_memo_start (win, VM_RECORD);
+  return 1;  // RAVI - 29-11-2005
+}
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_start
+
+ $Description:  create a new voicememo dialog
+
+ $Returns:    Dialogue info win
+
+ $Arguments:  parent win, display info
+
+*******************************************************************************/
+T_MFW_HND voice_memo_start (T_MFW_HND  parent_win, SHORT ID)
+{
+  T_MFW_HND win;
+
+  win = voice_memo_create (parent_win);
+
+  if (win NEQ NULL)
+  {
+    SEND_EVENT (win, VM_INIT, ID, 0);
+  }
+  return win;
+}
+
+
+
+/*******************************************************************************
+
+ $Function:     vocie_memo_create
+
+ $Description:  Creation of window
+
+ $Returns:    Dialogue info win
+
+ $Arguments:  parent win
+
+*******************************************************************************/
+static T_MFW_HND voice_memo_create (T_MFW_HND parent_win)
+{
+  T_MFW_WIN     * win_data;
+  T_voice_memo *  data = (T_voice_memo *)ALLOC_MEMORY (sizeof (T_voice_memo));
+
+  TRACE_FUNCTION ("vocie_memo_create()");
+
+  data->info_win = win_create (parent_win, 0, E_WIN_VISIBLE, (T_MFW_CB)voice_memo_win_cb);
+
+  if (data->info_win EQ 0)
+    return 0;
+
+  /*
+   * Create window handler
+   */
+  data->mmi_control.dialog   = (T_DIALOG_FUNC)voice_memo;
+  data->mmi_control.data     = data;
+  data->parent_win           = parent_win;
+  win_data                   = ((T_MFW_HDR *)data->info_win)->data;
+  win_data->user             = (void *)data;
+
+  /*
+  ** Initialise values to safe defualts
+  */
+  data->play_sk2 = TxtSoftBack;
+	
+  /*
+   * return window handle
+   */
+  return data->info_win;
+}
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_destroy
+
+ $Description:  Destruction of an dialog
+
+ $Returns:    void
+
+ $Arguments:  win
+
+*******************************************************************************/
+void voice_memo_destroy (T_MFW_HND own_window)
+{
+  T_MFW_WIN     * win  = ((T_MFW_HDR *)own_window)->data;
+  T_voice_memo * data   = (T_voice_memo *)win->user;
+
+  TRACE_FUNCTION ("voice_memo_destroy()");
+
+	if (own_window == NULL)
+	{
+		TRACE_EVENT ("Error : Called with NULL Pointer");
+		return;
+	}
+
+  if (data)
+  {
+    /*
+     * Exit TIMER & KEYBOARD Handle
+     */
+    kbd_delete (data->info_kbd);
+    tim_delete (data->info_tim);
+
+    /*
+     * Delete WIN Handler
+     */
+    win_delete (data->info_win);
+    /*
+     * Free Memory
+     */
+    FREE_MEMORY ((void *)data, sizeof (T_voice_memo));
+  }
+  
+  //x0pleela 27 Feb, 2006  ER: OMAPA00067709
+  //Set gVoiceMemo to NONE while destroying voice memo dialog
+#ifdef FF_PCM_VM_VB
+  set_voice_memo_type( NONE);
+#endif
+}
+
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo
+
+ $Description:  Dialog function for voice memo dialog
+
+ $Returns:    void
+
+ $Arguments:  win, window handle event, value, parameter
+
+*******************************************************************************/
+void voice_memo (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
+{
+  T_MFW_WIN      * win_data     = ((T_MFW_HDR *)win)->data;
+  T_voice_memo    * data         = (T_voice_memo *)win_data->user;
+
+ // T_DISPLAY_DATA display_info;   // RAVI
+  
+  SHORT	mfw_aud_retVal = 0; /* x0039928 - Lint warning fix */
+ #ifdef FF_PCM_VM_VB  
+  UBYTE vm_type; //to store voice memo type
+#endif
+
+
+  data->Identifier = value;
+
+  TRACE_FUNCTION ("voice_memo()");
+
+  switch (event)
+  {
+    case VM_INIT:
+    TRACE_EVENT ("VM_INIT()");
+      /*
+       * Initialize dialog
+       */
+
+      /*
+       * Create timer and keyboard handler
+       */
+    data->info_tim = tim_create (win, 1000, (T_MFW_CB)voice_memo_tim_cb);
+    data->info_kbd = kbd_create (win, KEY_ALL, (T_MFW_CB)voice_memo_kbd_cb);
+
+
+    if (value EQ VM_PLAY)
+    {
+      TRACE_EVENT ("VM_PLAY()");
+	  
+	  mfw_aud_retVal = mfw_aud_vm_start_playback(voice_memo_riv_play_cb);
+	  
+	  if (mfw_aud_retVal == MFW_AUD_VM_OK)
+      {
+        //start the second timer
+        data->time = 0;
+	    tim_start (data->info_tim);
+	    
+	    //Set the Right Softkey Id
+	    data->play_sk2 = TxtStop;
+      }
+	  else
+	  {
+	    if (mfw_aud_retVal == MFW_AUD_VM_MEM_EMPTY)
+	    {
+	    	voice_memo_dialog_create(win, TxtRecording, TxtEmpty);
+	    }
+	    else
+	    {
+	    	//Display a dialog and exit
+	    	TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_start_playback failed with return value : %d", mfw_aud_retVal);
+	    
+	    	voice_memo_dialog_create( win, TxtPlayback, TxtFailed);
+	    }
+	  }
+    }
+    else if (value EQ VM_RECORD)
+    {
+      TRACE_FUNCTION ("VM_RECORD()");
+       //x0pleela 27 Feb, 2006  ER: OMAPA00067709
+      //Pass 20 secs time out for PCM voice memo and 10 secs for AMR Voice memo
+#ifdef FF_PCM_VM_VB
+    //get the voice memo type
+    vm_type = get_voice_memo_type();
+
+      if(vm_type EQ PCM_VOICE_MEMO)
+      	 mfw_aud_retVal = mfw_aud_vm_start_record(PCM_VOICE_MEMO_MAX_DURATION, 
+												voice_memo_riv_record_cb);
+      else
+      	{
+      	  if(vm_type EQ AMR_VOICE_MEMO )
+#endif     
+	  mfw_aud_retVal = mfw_aud_vm_start_record(VOICE_MEMO_MAX_DURATION, voice_memo_riv_record_cb);
+#ifdef FF_PCM_VM_VB
+      	}
+#endif
+	  
+	  // If the Riviera call failed
+	  if (mfw_aud_retVal == MFW_AUD_VM_OK)
+	  {
+	  	//start the second timer
+	  	data->time = 0;
+	  	tim_start (data->info_tim);
+	  }
+	  else
+	  {
+	  	if (mfw_aud_retVal == MFW_AUD_VM_MEM_FULL)
+	    {
+	      TRACE_EVENT ("memory full ");
+/* RAVI - 20-1-2006 */
+/* Silent Implementation */
+#ifdef NEPTUNE_BOARD
+             audio_PlaySoundID(0, TONES_KEYBEEP, getCurrentVoulmeSettings(), 
+                                              AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+#else
+	      /* play Keybeep */
+	      audio_PlaySoundID(0, TONES_KEYBEEP, 200, AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+#endif
+/* END RAVI */
+	  
+	  	  voice_memo_dialog_create( win, TxtRecording, TxtFull );
+	    }
+	    else
+	    {
+	      //Display a dialog and exit
+	      TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_start_record failed with return value : %d", mfw_aud_retVal);
+	    
+	      voice_memo_dialog_create( win, TxtRecording, TxtFailed );
+	    }
+      }
+    }
+      win_show (win);
+      break;
+
+
+  //if the user selected to clear the Voicememo buffer
+    case VM_DELETE_BUFFER:
+	voice_memo_dialog_create( win, TxtDeleted, TxtNull );
+
+	/*
+	** Delete the voice memo file
+	*/
+	mfw_aud_vm_delete_file();
+  break;
+
+    case VM_DESTROY:
+    voice_memo_destroy(win);
+  break;
+  }
+  return;
+}
+
+/*******************************************************************************
+
+ $Function:     voice_memo_win_cb
+
+ $Description:  Callback function for information dialog
+
+ $Returns:    void
+
+ $Arguments:  window handle event, win
+*******************************************************************************/
+static int voice_memo_win_cb (T_MFW_EVENT event, T_MFW_WIN * win)
+{
+    T_voice_memo * data = (T_voice_memo *)win->user;
+
+    TRACE_FUNCTION ("voice_memo_win_cb()");
+
+    if (data EQ 0)
+  return 1;
+
+    switch (event)
+  {
+  case E_WIN_VISIBLE:
+      if (win->flags & E_WIN_VISIBLE)
+    {
+        /*
+         * Clear Screen
+         */
+        dspl_ClearAll();
+
+      switch (data->Identifier)
+      {
+        case VM_PLAY:
+            /*
+             * Print the information screen
+             */
+					ALIGNED_PROMPT((T_MMI_ALIGN)LEFT,Mmi_layout_line(1),0, TxtPlayback);
+
+            /*
+             * Print the elapsed time
+             */
+				    displayAlignedText(LEFT, Mmi_layout_line(2), 0, data->elapsed_time);
+
+            /*
+             * Print softkeys
+             */
+					displaySoftKeys(TxtDelete, data->play_sk2);
+          break;
+
+        case VM_RECORD:
+            /*
+             * Print the information screen
+             */
+					ALIGNED_PROMPT((T_MMI_ALIGN)LEFT,Mmi_layout_line(1),0, TxtRecording);
+
+            /*
+             * Print the elapsed time
+             */
+				    displayAlignedText(LEFT, Mmi_layout_line(2), 0, data->elapsed_time);
+
+            /*
+             * Print softkeys
+             */
+            displaySoftKeys(TxtStop, '\0');
+          break;
+      }
+
+    }
+      break;
+
+  default:
+      return 0;
+  }
+    return 1;
+}
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_tim_cb
+
+ $Description:  Callback function for the voice_memo timer.
+
+
+ $Returns:    MFW event handler
+
+ $Arguments:  window handle event, timer control block
+
+*******************************************************************************/
+static T_MFW_CB voice_memo_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc)
+{
+  T_MFW_HND       win  = mfw_parent (mfw_header());
+  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
+  T_voice_memo   * data = (T_voice_memo *)win_data->user;
+
+  SHORT	mfw_aud_retVal;
+  //x0pleela 27 Feb, 2006   ER:OMAPS00067709
+  //to store PCM/AMR voice memo record/play duration
+  USHORT vm_duration = 0; /* x0039928 - Lint warning fix */
+//  char buf[40];   // RAVI
+
+//x0pleela 08 Mar, 2006   ER:OMAPS00067709
+#ifdef FF_PCM_VM_VB  
+  UBYTE vm_type; //to store voice memo type
+#endif
+
+    TRACE_FUNCTION ("voice_memo_tim_cb()");
+
+//x0pleela 27 Feb, 2006   ER:OMAPS00067709
+#ifdef FF_PCM_VM_VB
+	//x0pleela 06 Mar, 2006  ER:OMAPS00067709
+	//get the voice memo type
+	vm_type = get_voice_memo_type();
+
+	if(vm_type EQ PCM_VOICE_MEMO)
+	  vm_duration =  PCM_VOICE_MEMO_MAX_DURATION;
+	else 
+	{
+	  if (vm_type EQ AMR_VOICE_MEMO)
+#endif
+	 vm_duration = VOICE_MEMO_MAX_DURATION;
+#ifdef FF_PCM_VM_VB 
+	}
+#endif
+
+  switch (data->Identifier)
+  {
+    case VM_PLAY:
+      //the max. playback time is 10 second
+			if (data->time < mfw_aud_vm_get_duration())
+      {
+          TRACE_EVENT ("continue the second timer");
+
+        data->time ++;
+        // it shows here the elapsed time
+        sprintf(data->elapsed_time,"%02d sec", data->time);
+
+          TRACE_EVENT (data->elapsed_time);
+
+        //continue the second timer
+        tim_start (data->info_tim);
+      }
+      else
+      {
+		data->play_sk2 = TxtSoftBack;
+#ifndef _SIMULATION_
+		/*
+		** Stop playing the Voice Memo.
+		*/
+		mfw_aud_retVal = mfw_aud_vm_stop_playback(voice_memo_riv_play_cb);
+
+		if (mfw_aud_retVal != MFW_AUD_VM_OK)
+			TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_stop_playback failed with return value : %d", mfw_aud_retVal);
+#else
+		TRACE_EVENT("call mfw_aud_vm_stop_playback()");
+#endif
+      }
+      break;
+
+
+    case VM_RECORD:
+
+	  data->time++;
+ 
+      if (data->time < vm_duration)
+      {
+          TRACE_EVENT ("continue the second timer");
+	//x0pleela 27 Feb, 2006   ER:OMAPS00067709
+	//changed from Macro VOICE_MEMO_MAX_DURATION to local variable vm_duration
+        // it shows here the remainig time
+		sprintf(data->elapsed_time,"%02d sec", (vm_duration - data->time));
+
+          TRACE_EVENT (data->elapsed_time);
+
+        //continue the second timer
+        tim_start (data->info_tim);
+      }
+      else
+      {
+//x0pleela 27 Feb, 2006   ER:OMAPS00067709
+//changed from Macro VOICE_MEMO_MAX_DURATION to local variable vm_duration
+		mfw_aud_vm_set_duration(vm_duration);
+				
+#ifndef _SIMULATION_
+		/*
+		** Stop recording the Voice Memo.
+		*/
+		mfw_aud_retVal = mfw_aud_vm_stop_record(voice_memo_riv_record_cb);
+
+		if (mfw_aud_retVal != MFW_AUD_VM_OK)
+			TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_stop_record failed with return value : %d", mfw_aud_retVal);
+/* RAVI - 20-1-2006 */
+#ifdef NEPTUNE_BOARD
+              audio_PlaySoundID(0, TONES_KEYBEEP, getCurrentVoulmeSettings(),
+                                               AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+#else
+		/*the voice memo is now full, show "memory full" */
+		audio_PlaySoundID(0, TONES_KEYBEEP, 200, AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+#endif
+/* END RAVI */
+
+		voice_memo_dialog_create( win, TxtRecording, TxtFull );
+#else
+		TRACE_EVENT("call mfw_aud_vm_stop_record()");
+#endif
+      }
+      break;
+  }
+
+  //Update the screen
+  winShow(win);
+
+  return 0;
+}
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_kbd_cb
+
+ $Description:  Keyboard event handler
+
+ $Returns:    status int
+
+ $Arguments:  window handle event, keyboard control block
+
+*******************************************************************************/
+
+static int voice_memo_kbd_cb (T_MFW_EVENT event, T_MFW_KBD *keyboard)
+{
+  T_MFW_HND       win  = mfw_parent (mfw_header());
+  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
+  T_voice_memo   * data = (T_voice_memo *)win_data->user;
+
+  USHORT          Identifier = data->Identifier;
+	SHORT			mfw_aud_retVal;
+
+
+  TRACE_FUNCTION("voice_memo_kbd_cb");
+
+  switch (keyboard->code)
+  {
+  case KCD_HUP:
+    case KCD_LEFT:
+    if (Identifier EQ VM_PLAY)
+    {
+#ifndef _SIMULATION_
+	  /*
+	  ** Stop playing the Voice Memo and Delete it.
+	  */
+	  mfw_aud_retVal = mfw_aud_vm_stop_playback(voice_memo_riv_play_cb);
+	  
+	  if (mfw_aud_retVal != MFW_AUD_VM_OK)
+	  	TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_stop_playback failed with return value : %d", mfw_aud_retVal);
+#else
+	  TRACE_EVENT("call mfw_aud_vm_stop_playback()");
+#endif
+      //delete the voicememo buffer
+     /* Mar 28, 2007  DR: OMAPS00122762 x0039928 */
+     /* Fix: Commented duration reset */
+/*	  mfw_aud_vm_set_duration(0); */
+
+      //user selected the delete-key
+      SEND_EVENT (win, VM_DELETE_BUFFER, 0, 0);
+    }
+    else if (Identifier EQ VM_RECORD)
+    {
+	  mfw_aud_vm_set_duration(data->time);
+	  
+#ifndef _SIMULATION_
+	  /*
+	  ** Stop recording the Voice Memo.
+	  */
+	  mfw_aud_retVal = mfw_aud_vm_stop_record(voice_memo_riv_record_cb);
+	  
+	  if (mfw_aud_retVal != MFW_AUD_VM_OK)
+	  	TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_stop_record failed with return value : %d", mfw_aud_retVal);
+	  
+	  //go back to the previous dialog
+	  SEND_EVENT (win, VM_DESTROY, 0, 0);
+#else
+	  TRACE_EVENT("call mfw_aud_vm_stop_record()");
+#endif
+    }
+       break;
+
+    case KCD_RIGHT:
+    if (Identifier EQ VM_PLAY)
+    {
+
+#ifndef _SIMULATION_
+	  /*
+	  ** Stop playing the Voice Memo.
+	  */
+	  mfw_aud_retVal = mfw_aud_vm_stop_playback(voice_memo_riv_play_cb);
+	  
+	  if (mfw_aud_retVal != MFW_AUD_VM_OK)
+	  	TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_stop_playback failed with return value : %d", mfw_aud_retVal);
+#else
+	  TRACE_EVENT("call mfw_aud_vm_stop_playback()");
+#endif
+
+      //go back to the previous dialog
+      SEND_EVENT (win, VM_DESTROY, 0, 0);
+    }
+    else if (Identifier EQ VM_RECORD)
+    {
+      //nothing
+    }
+       break;
+
+    default:
+       break;
+  }
+  return MFW_EVENT_CONSUMED;
+}
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_dialog_cb
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+void voice_memo_dialog_cb(T_MFW_HND win, UBYTE identifier, UBYTE reason)
+{
+  TRACE_FUNCTION ("voice_memo_dialog_cb()");
+
+      switch (reason)
+      {
+        case INFO_KCD_LEFT:
+          /* no break; */
+        case INFO_TIMEOUT:
+          /* no break; */
+        case INFO_KCD_HUP:
+          /* no break; */
+        case INFO_KCD_RIGHT:
+          /* no break; */
+        case INFO_KCD_CLEAR:
+
+        //go back to the previous dialog
+      SEND_EVENT (win, VM_DESTROY,0, 0);
+
+          break;
+      }
+}
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_dialog_create
+
+ $Description:
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+static void voice_memo_dialog_create(T_MFW_HND win, int str1, int str2)
+{
+	T_DISPLAY_DATA display_info;
+	
+	TRACE_FUNCTION ("voice_memo_dialog_create()");
+
+	dlg_initDisplayData_TextId( &display_info, TxtNull, TxtNull, str1, str2, COLOUR_STATUS);
+	dlg_initDisplayData_events( &display_info, (T_VOID_FUNC)voice_memo_dialog_cb, THREE_SECS, KEY_CLEAR | KEY_RIGHT | KEY_LEFT );
+	/*
+	* Call Info Screen
+	*/
+	info_dialog (win, &display_info);
+}
+
+static void voice_memo_riv_record_cb(void *parameter)
+{
+/* BEGIN ADD: Req ID: : Sumit : 14-Mar-05 */
+#ifndef NEPTUNE_BOARD
+/* END ADD: Req ID: : Sumit : 14-Mar-05 */
+
+//x0pleela 16 Mar, 2006  ER:OMAPS00067709
+#ifdef FF_PCM_VM_VB
+	UBYTE vm_type; //to store voice memo type
+#endif
+
+
+//x0pleela 16 Mar, 2006  ER:OMAPS00067709
+#ifdef FF_PCM_VM_VB
+  vm_type = get_voice_memo_type();
+  switch( vm_type )
+  {
+    case AMR_VOICE_MEMO:
+    {
+#endif    /* FF_PCM_VM_VB */
+      T_AUDIO_VM_RECORD_STATUS *record_status;
+      record_status = (T_AUDIO_VM_RECORD_STATUS *)parameter;
+      if (record_status->status != AUDIO_OK)
+      {
+        TRACE_EVENT_P1("ERROR : voice_memo_riv_record_cb received AUDIO_ERROR, recorded duration is %d",
+        						record_status->recorded_duration);
+      }
+      else
+      {
+        TRACE_EVENT_P1("INFO : voice_memo_riv_record_cb received AUDIO_OK, recorded duration is %d",
+        						record_status->recorded_duration);
+        mfw_aud_vm_set_duration((UINT8)record_status->recorded_duration);
+      }
+ #ifdef FF_PCM_VM_VB   
+    }
+    break;
+
+    case PCM_VOICE_MEMO:
+    {
+      T_AUDIO_VM_PCM_RECORD_STATUS *pcm_vm_record_status;
+      
+      pcm_vm_record_status = (T_AUDIO_VM_PCM_RECORD_STATUS *)parameter;
+      if (pcm_vm_record_status->status != AUDIO_OK)
+      {
+        TRACE_EVENT_P1("ERROR : voice_memo_riv_record_cb received AUDIO_ERROR, recorded duration is %d",
+        						pcm_vm_record_status->recorded_duration);
+      }
+      else
+      {
+        TRACE_EVENT_P1("INFO : voice_memo_riv_record_cb received AUDIO_OK, recorded duration is %d",
+        						pcm_vm_record_status->recorded_duration);
+        mfw_aud_vm_set_duration((UINT8)pcm_vm_record_status->recorded_duration);
+      }
+    }
+    break;
+    
+    case VOICE_BUFFERING:
+    {
+    	T_AUDIO_VBUF_PCM_RECORD_STATUS *vbuf_pcm_record_status;
+
+    	 vbuf_pcm_record_status = (T_AUDIO_VBUF_PCM_RECORD_STATUS *)parameter;
+    	 
+      if (vbuf_pcm_record_status->status != AUDIO_OK)
+      {
+        TRACE_EVENT_P1("ERROR : voice_memo_riv_record_cb received AUDIO_ERROR, recorded duration is %d",
+        						vbuf_pcm_record_status->recorded_duration);
+      }
+      else
+      {
+        TRACE_EVENT_P1("INFO : voice_memo_riv_record_cb received AUDIO_OK, recorded duration is %d",
+        						vbuf_pcm_record_status->recorded_duration);
+        //x0pleela 13 Mar, 2006  ER:OMAPS00067709
+       //check for reason to call record_stop
+       switch( voice_buffering_data.rec_stop_reason)
+       {
+       case CALLING_PARTY_END_CALL: 		//calling party hangs up	
+       case CALLED_PARTY_END_CALL: 		//called party hangs up
+         voice_buffering_data.call_active = FALSE;
+         break;
+       
+       case PLAY_ERROR:					//recording timeout while playing
+         voice_buffering_data.buffering_phase = FALSE;
+         break;
+       
+       case CALL_END_BEF_SETUP:			//calling party hangs up before call setup  	
+       case USER_SEL_STOP: 				//user selected "STOP" option, then just return
+       case RECORDING_TIMEOUT: 			//recording timeout
+       case CALLED_PARTY_NOT_AVAILABLE: 	//not reachable
+       default:
+         break;		  		
+       }
+       voice_buffering_data.recording_possible = TRUE;
+       voice_buffering_data.incoming_call_discon = FALSE;
+       //destroy timer
+       timDelete(voice_buffering_data.voice_buffering_tim);
+      }
+      //x0pleela 03 Apr, 2006  ER: OMAPS00067709
+      //Set voice memo type to NONE 
+      set_voice_memo_type(NONE);   
+    }   
+ 
+    break;
+    
+    default:
+    break;
+    }
+
+
+	
+#endif /* FF_PCM_VM_VB */
+	
+/* BEGIN ADD: Req ID: : Sumit : 14-Mar-05 */
+#endif /* NEPTUNE_BOARD */
+/* END ADD: Req ID: : Sumit : 14-Mar-05 */
+
+}
+
+static void voice_memo_riv_play_cb(void *parameter)
+{
+/* BEGIN ADD: Req ID: : Sumit : 14-Mar-05 */
+#ifndef NEPTUNE_BOARD
+/* END ADD: Req ID: : Sumit : 14-Mar-05 */
+
+//x0pleela 16 Mar, 2006  ER:OMAPS00067709
+#ifdef FF_PCM_VM_VB
+  UBYTE vm_type; //to store voice memo type
+#endif
+
+//x0pleela 16 Mar, 2006  ER:OMAPS00067709
+#ifdef FF_PCM_VM_VB
+  vm_type = get_voice_memo_type();
+  switch( vm_type )
+  {
+    case AMR_VOICE_MEMO:
+    {
+#endif    /* FF_PCM_VM_VB */
+
+      T_AUDIO_VM_PLAY_STATUS *play_status;
+      play_status = (T_AUDIO_VM_PLAY_STATUS *)parameter;
+      	if (play_status->status != AUDIO_OK)
+	{
+		TRACE_EVENT("ERROR : voice_memo_riv_play_cb received AUDIO_ERROR");
+	}
+	else
+	{
+		TRACE_EVENT("INFO : voice_memo_riv_play_cb received AUDIO_OK");
+	}
+	
+ #ifdef FF_PCM_VM_VB   
+    }
+    break;
+
+    case PCM_VOICE_MEMO:
+    {
+      T_AUDIO_VM_PCM_PLAY_STATUS *pcm_vm_play_status;
+      pcm_vm_play_status = (T_AUDIO_VM_PCM_PLAY_STATUS *)parameter;
+      if (pcm_vm_play_status->status != AUDIO_OK)
+      {
+        TRACE_EVENT("ERROR : voice_memo_riv_play_cb received AUDIO_ERROR");
+      }
+      else
+      {
+        TRACE_EVENT("INFO : voice_memo_riv_play_cb received AUDIO_OK");
+      }
+    }
+    break;
+    
+    case VOICE_BUFFERING:
+    {
+      T_AUDIO_VBUF_PCM_PLAY_STATUS *voice_buffering_play_status;
+      voice_buffering_play_status = (T_AUDIO_VBUF_PCM_PLAY_STATUS *)parameter;
+      
+      if (voice_buffering_play_status->status != AUDIO_OK)
+      {
+        TRACE_EVENT("ERROR : voice_memo_riv_play_cb received AUDIO_ERROR");
+      }
+      else
+      {
+        TRACE_EVENT("INFO : voice_memo_riv_play_cb received AUDIO_OK");
+        voice_buffering_data.buffering_phase = FALSE;
+	 voice_buffering_data.play_stopped = TRUE;
+      }
+
+      //x0pleela 06 Jul, 2006  DR: OMAPS00067709
+      //Fix from AS team
+      vocoder_mute_ul(0);
+	  
+      //x0pleela 03 Apr, 2006  ER: OMAPS00067709
+      //Set voice memo type to NONE 
+      set_voice_memo_type(NONE); 
+    }   
+    
+    break;
+    
+    default:
+    break;
+    }
+	
+
+	
+#endif /* FF_PCM_VM_VB */
+
+/* BEGIN ADD: Req ID: : Sumit : 14-Mar-05 */
+#endif /* NEPTUNE_BOARD*/
+/* END ADD: Req ID: : Sumit : 14-Mar-05 */
+
+}
+
+//x0pleela 24 Feb, 2006  ER OMAPS00067709
+#ifdef FF_PCM_VM_VB
+
+/*******************************************************************************
+
+ $Function:     pcm_voice_memo_play
+
+ $Description: Sets voice memo type to PCM_VOICE_MEMO which indicates PCM voice memo is 
+ 			active and start playing the voice
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int  pcm_voice_memo_play (MfwMnu* m, MfwMnuItem* i)
+{
+  T_MFW_HND win = mfw_parent(mfw_header());
+
+  TRACE_FUNCTION ("pcm_voice_memo_play()");
+
+  //x0pleela 27 Feb, 2006  ER: OMAPA00067709
+  //Set this variable to PCM_VOICE_MEMO which indicates PCM voice memo is active
+    set_voice_memo_type( PCM_VOICE_MEMO);
+  //create a new voice memo dialog
+  voice_memo_start (win, VM_PLAY);
+  return 1;  
+}
+
+/*******************************************************************************
+
+ $Function:     pcm_voice_memo_record
+
+ $Description: Sets voice memo type to PCM_VOICE_MEMO which indicates PCM voice memo is 
+ 			active and start recording the voice
+
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int pcm_voice_memo_record (MfwMnu* m, MfwMnuItem* i)
+{
+  T_MFW_HND win = mfw_parent(mfw_header());
+
+  TRACE_FUNCTION ("pcm_voice_memo_record()");
+
+  //x0pleela 27 Feb, 2006  ER: OMAPA00067709
+  //Set this variable to PCM_VOICE_MEMO which indicates PCM voice memo is active
+  set_voice_memo_type( PCM_VOICE_MEMO);
+  //create a new voice memo dialog
+  voice_memo_start (win, VM_RECORD);
+  return 1;
+}
+
+/*******************************************************************************
+
+ $Function:     voice_buffering_edit_num
+
+ $Description: Opens an edtor for the user to enter PTT number. Also resets voice buffering data 
+ 			with default values
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int  voice_buffering_edit_num (MfwMnu* m, MfwMnuItem* i)
+{
+  T_MFW_HND win = mfw_parent(mfw_header());
+  T_MFW_WIN       *win_data   = ( (T_MFW_HDR *) win )->data;
+  tBookStandard   *data       = (tBookStandard *) win_data->user;
+  T_phbk          *Phbk       = data->phbk;
+
+  TRACE_FUNCTION ("voice_buffering_edit_num()");
+  
+  set_voice_memo_type( VOICE_BUFFERING );
+  
+  memset( Phbk->phbk->edt_buf_number, '\0', PHB_MAX_LEN );
+  Phbk->input_number_win = inputVoiceMemoNumberEditor( win, Phbk->edt_buf_number );
+
+  //Reset voice buffering data with default values
+  voice_buffering_data_reset();
+  
+  /* Always return event consumed */
+  return MFW_EVENT_CONSUMED;  
+}
+
+/*******************************************************************************
+
+ $Function:     voiceMemoNumberCB
+
+ $Description:  Call back for number entry
+
+ $Returns:    None
+
+ $Arguments:  win, parent window, reason, for call back
+
+*******************************************************************************/
+
+void voiceMemoNumberCB( T_MFW_HND win, USHORT Identifier, UBYTE reason )
+{
+  T_MFW_WIN       *win_data   = ( (T_MFW_HDR *) win )->data;
+  tBookStandard   *data       = (tBookStandard *) win_data->user;
+  
+  TRACE_FUNCTION("voiceMemoNumberCB()");
+
+  switch ( reason )
+  {
+    case INFO_KCD_LEFT:
+    {
+      //copy phone number to global
+      memset( voice_buffering_data.vb_PTTnum, 0, PHB_MAX_LEN );
+      memcpy( voice_buffering_data.vb_PTTnum, data->phbk->edt_buf_number, strlen(data->phbk->edt_buf_number) );
+      SEND_EVENT( data->phbk->input_number_win, E_ED_DESTROY, 0, 0 );
+      data->phbk->input_number_win = 0;
+    }
+    break;
+  
+    case INFO_KCD_RIGHT:
+    case INFO_KCD_HUP:
+    {
+      AUI_edit_Destroy( data->phbk->input_number_win );
+      data->phbk->input_number_win = 0;
+    }
+    break;
+      
+    default:
+    {
+      /* otherwise no action to be performed
+      */
+    break;
+    }
+  }
+}
+/*******************************************************************************
+
+ $Function:     inputVoiceMemoNumberEditor
+
+ $Description: Settings of Editor
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+MfwHnd inputVoiceMemoNumberEditor( MfwHnd parent, void *buffer )
+{
+  T_AUI_EDITOR_DATA editor_data;
+  
+  TRACE_FUNCTION ("inputVoiceMemoNumberEditor()");
+  
+  AUI_edit_SetDefault(&editor_data);
+  AUI_edit_SetDisplay(&editor_data, NUMBER_EDITOR, COLOUR_EDITOR_XX, EDITOR_FONT);
+  AUI_edit_SetEvents(&editor_data, 0, FALSE, FOREVER, (T_AUI_EDIT_CB)voiceMemoNumberCB);
+  AUI_edit_SetTextStr(&editor_data, TxtSoftOK, TxtDelete, TxtEnterNumber, NULL);
+  AUI_edit_SetAltTextStr(&editor_data, 0, NULL, TRUE, TxtSoftBack);
+  AUI_edit_SetBuffer(&editor_data, ATB_DCS_ASCII, (UBYTE *)buffer, NUMBER_LENGTH);
+  AUI_edit_SetMode(&editor_data, 0, ED_CURSOR_UNDERLINE);
+  
+  return AUI_edit_Start(parent, &editor_data);
+}
+
+/*******************************************************************************
+ $Function:     voice_buffering_record_start
+
+ $Description: Starts recording voice and conects to the PTT number if the call is not active. 
+ 			If in call, then start playing the voice
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int  voice_buffering_record_start (MfwMnu* m, MfwMnuItem* i)
+{
+  T_MFW_HND win = mfw_parent(mfw_header());
+  SHORT	mfw_aud_retVal;
+
+  TRACE_FUNCTION ("voice_buffering_record_start()");
+  TRACE_EVENT_P1("PTT#: %s", voice_buffering_data.vb_PTTnum);
+
+  set_voice_memo_type( VOICE_BUFFERING );
+
+  //store window handler
+  voice_buffering_data.win_hnd = win;
+
+  if( voice_buffering_data.recording_possible )
+  {
+    //create timer
+    voice_buffering_data.voice_buffering_tim= tim_create (win, 20000, 
+      													  (T_MFW_CB)voice_buffering_tim_cb);
+    //start timer
+    timStart(voice_buffering_data.voice_buffering_tim);
+    voice_buffering_data.buffering_phase = TRUE;
+    voice_buffering_data.recording_possible = FALSE;
+
+    mfw_aud_retVal = mfw_aud_vm_start_record(PCM_VOICE_MEMO_MAX_DURATION, 
+  											voice_memo_riv_record_cb);  
+    if(voice_buffering_data.call_active )
+    {
+      //start playing the recorded voice
+      voice_buffering_playback_start(); 
+    }
+    else
+    {
+      //call PTT number
+      callNumber((UBYTE*)voice_buffering_data.vb_PTTnum);
+    }
+
+    // If the Riviera call failed
+    if (mfw_aud_retVal EQ MFW_AUD_VM_OK)
+    {
+       //no action to be performed
+    }
+    else
+    {
+      if (mfw_aud_retVal == MFW_AUD_VM_MEM_FULL)
+      {
+        TRACE_EVENT ("memory full ");
+        /* Silent Implementation */
+	 /* play Keybeep */
+	 audio_PlaySoundID(0, TONES_KEYBEEP, 200, AUDIO_PLAY_ONCE ); /* GW#2355 /CQ11341 */
+
+        voice_memo_dialog_create( win, TxtRecording, TxtFull );
+      }
+      else
+      {
+        //Display a dialog and exit
+        TRACE_EVENT_P1 ("ERROR : voice_buffering_record_start failed with return value : %d", mfw_aud_retVal);
+	    
+	 voice_memo_dialog_create( win, TxtRecording, TxtFailed );
+      }
+    }
+  }
+  else
+  {
+    //Display a dialog saying "Already Recording"
+    voice_memo_dialog_create(win, TxtAlready, TxtRecording);    
+  }
+  win_show (win);
+  return 1;  
+}
+
+/*******************************************************************************
+
+ $Function:     voice_buffering_record_stop
+
+ $Description: Stops the timer and recording. If call is not active the disconnects the call
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL int  voice_buffering_record_stop (MfwMnu* m, MfwMnuItem* i)
+{
+  T_MFW_HND win = mfw_parent(mfw_header());
+
+  TRACE_FUNCTION ("voice_buffering_record_stop()");
+
+  set_voice_memo_type ( VOICE_BUFFERING );
+
+  //store window handler
+  voice_buffering_data.win_hnd = win;
+  
+  voice_buffering_data.rec_stop_reason = USER_SEL_STOP;
+  voice_buffering_data.recording_possible = TRUE;
+
+  if(!voice_buffering_data.call_active )
+  {
+    //stop the timer, if recording
+    timStop(voice_buffering_data.voice_buffering_tim);
+    
+    /* destroy the redial windows if exit*/
+    cm_redial_abort();
+    cm_disconnect(call_data.outCall);
+    
+    if (!call_data.calls.numCalls)
+    {
+      call_data.ignore_disconnect = TRUE;
+      call_destroy(call_data.win);
+    }
+  }
+  else
+  {
+    //Stop recording
+    voice_buffering_stop_recording();
+  }
+     
+  return 1;  
+}
+
+/*******************************************************************************
+
+ $Function:     voice_buffering_playback_start
+
+ $Description: Starts playing the voice. If any error while playing, stops timer and recording
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL void voice_buffering_playback_start(void )
+{
+  SHORT	mfw_aud_retVal;
+
+  TRACE_FUNCTION ("voice_buffering_playback_start()");
+
+  voice_buffering_data.buffering_phase = TRUE;
+  mfw_aud_retVal = mfw_aud_vm_start_playback(voice_memo_riv_play_cb);
+  if (mfw_aud_retVal == MFW_AUD_VM_OK)
+  {
+     //no action to be performed
+  }
+  else
+  {
+    if (mfw_aud_retVal == MFW_AUD_VM_MEM_EMPTY)
+    {
+      voice_memo_dialog_create(voice_buffering_data.win_hnd, TxtRecording, TxtEmpty);
+    }
+    else
+    {
+      //Display a dialog and exit
+      TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_start_playback failed with return value : %d", mfw_aud_retVal);
+      voice_memo_dialog_create( voice_buffering_data.win_hnd, TxtPlayback, TxtFailed);
+
+      //update the reason to stop recording
+      voice_buffering_data.rec_stop_reason = PLAY_ERROR;
+
+      //stop recording 
+      voice_buffering_stop_recording();
+    }
+  }
+  return;
+}
+
+/*******************************************************************************
+
+ $Function:     voice_buffering_stop_recording
+
+ $Description: A wrapper function for record stop to invoke from other modules. 
+ 			Stops the timer and recording
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL void voice_buffering_stop_recording(void )
+{
+  SHORT	mfw_aud_retVal;
+
+  TRACE_FUNCTION ("voice_buffering_stop_recording()"); 
+
+  //stop the timer, if recording
+  timStop(voice_buffering_data.voice_buffering_tim);
+  
+  mfw_aud_retVal = mfw_aud_vm_stop_record(voice_memo_riv_record_cb); 
+
+  if (mfw_aud_retVal != MFW_AUD_VM_OK)
+  {
+    TRACE_EVENT_P1 ("ERROR : voice_buffering_record_stop failed with return value : %d", mfw_aud_retVal);
+
+    //display dialog saying "Recording Stop Failed"
+    voice_memo_dialog_create( voice_buffering_data.win_hnd, TxtRecord, TxtStopFailed );
+  }
+  return;
+}
+
+/*******************************************************************************
+
+ $Function:     voice_buffering_stop_playing
+
+ $Description: A wrapper function for play stop to invoke from other modules. 
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+GLOBAL void voice_buffering_stop_playing(void )
+{
+  SHORT	mfw_aud_retVal;
+
+  TRACE_FUNCTION ("voice_buffering_stop_playing()"); 
+  
+  mfw_aud_retVal = mfw_aud_vm_stop_playback(voice_memo_riv_play_cb); 
+
+  if (mfw_aud_retVal != MFW_AUD_VM_OK)
+  {
+    TRACE_EVENT_P1 ("ERROR : voice_buffering_record_stop failed with return value : %d", mfw_aud_retVal);
+
+    //display dialog saying "Recording Stop Failed"
+    voice_memo_dialog_create( voice_buffering_data.win_hnd, TxtPlay, TxtStopFailed );
+  }
+  return;
+}
+
+
+/*******************************************************************************
+
+ $Function:     voice_memo_tim_cb
+
+ $Description: Timer callback. Stops the timer. If PTT call is not setup disconnect the call, 
+ 			else call record stop
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+static int voice_buffering_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc)
+{
+  T_MFW_HND       win  = mfw_parent (mfw_header());
+  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
+  T_voice_buffering   * data = (T_voice_buffering *)win_data->user;
+  SHORT	mfw_aud_retVal;
+
+   TRACE_FUNCTION("voice_buffering_tim_cb()");
+  //get the voice memo type
+  if( ( get_voice_memo_type() EQ VOICE_BUFFERING ) AND ( data->voice_buffering_tim ) )
+  {
+    timStop(voice_buffering_data.voice_buffering_tim);
+  }
+  voice_buffering_data.rec_stop_reason = RECORDING_TIMEOUT;  
+  
+  if( !voice_buffering_data.call_active ) //timeout before call setup
+  {
+    cm_disconnect(call_data.outCall);
+    
+    if (!call_data.calls.numCalls)
+    {
+      call_data.ignore_disconnect = TRUE;
+      call_destroy(call_data.win);
+    }
+  }
+ else  //timeout after call setup
+ {  
+    mfw_aud_retVal = mfw_aud_vm_stop_record(voice_memo_riv_record_cb); 
+    
+    if (mfw_aud_retVal != MFW_AUD_VM_OK)
+    {
+      TRACE_EVENT_P1 ("ERROR : mfw_aud_vm_stop_record failed with return value : %d", mfw_aud_retVal);
+  
+      //display dialog saying "Recording Stop Failed"
+      voice_memo_dialog_create( voice_buffering_data.win_hnd, TxtRecording, TxtStopFailed );
+    }
+  }
+
+ return  MFW_EVENT_CONSUMED;
+}
+
+/*******************************************************************************
+
+ $Function:     voice_buffering_data_reset
+
+ $Description: Resets voice buffering data to default values
+
+ $Returns:
+
+ $Arguments:
+
+*******************************************************************************/
+static void voice_buffering_data_reset( void )
+{
+  TRACE_FUNCTION("voice_buffering_data_reset()");
+
+  voice_buffering_data.win_hnd = 0;
+  voice_buffering_data.voice_buffering_tim = 0;
+  memset( voice_buffering_data.vb_PTTnum, 0, PTT_NUM_LEN );
+  voice_buffering_data.rec_stop_reason = VB_NONE;
+  voice_buffering_data.call_active = FALSE;
+  voice_buffering_data.recording_possible = TRUE;
+  voice_buffering_data.buffering_phase = FALSE;
+  voice_buffering_data.incoming_call_discon = FALSE;
+  voice_buffering_data.play_stopped = FALSE;
+  
+}
+#endif