view src/ui3/bmi/mmiVoiceMemo.c @ 639:026c98f757a6

tpudrv12.h & targets/gtm900.h: our current support is for MGC2GSMT version only As it turns out, there exist two different Huawei-made hw platforms both bearing the marketing name GTM900-B: one is MG01GSMT, the other is MGC2GSMT. The two are NOT fw-compatible: aside from flash chip differences which should be handled by autodetection, the two hw platforms are already known to have different RFFEs with different control signals, and there may be other differences not yet known. Our current gtm900 build target is for MGC2GSMT only; we do not yet have a specimen of MG01GSMT on hand, hence no support for that version will be possible until and unless someone provides one.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 30 Jan 2020 18:19:01 +0000
parents 0f2c6f6e3588
children
line wrap: on
line source

/*******************************************************************************

          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
}

#if 0	/* FreeCalypso */
/*******************************************************************************

 $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; 
}
#endif


/*******************************************************************************

 $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