view src/ui/bmi/mmiVoiceMemo.c @ 130:cf085bee523c

mmiUserData.h: bogotab fixes
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 10 Nov 2020 06:43:13 +0000
parents c0052fe355d3
children e41c934ecd97
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