view src/cs/services/audio/audio_vm_amr_record.c @ 212:7f3266e247d6

audio mode load: gracefully handle mode files of wrong AEC version Irrespective of which AEC policy we adopt for FC Selenite (keep L1_NEW_AEC disabled like in Magnetite or enable it like in Tourmaline), we MUST gracefully handle the case of wrong AEC version on audio mode load: disable AEC instead of loading garbage. Therefore, we apply the same change to src/cs/services/audio/audio_mode_load.c as we made in Tourmaline and Magnetite last year.
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 31 Oct 2022 00:31:30 +0000
parents 1eb391057168
children
line wrap: on
line source

/****************************************************************************/
/*                                                                          */
/*  File Name:  audio_vm_amr_record.c                                       */
/*                                                                          */
/*  Purpose:  This file contains all the functions used to manage the       */
/*            Voice Memorization AMR record task.                           */
/*                                                                          */
/*  Version   0.1                                                           */
/*                                                                          */
/*  Date          Modification                                              */
/*  ------------------------------------                                    */
/*  ?? ?? 2002 Create                                                       */
/*                                                                          */
/*  Author                                                                  */
/*     Stephanie Gerthoux                                                   */
/*                                                                          */
/* (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved*/
/****************************************************************************/

#include "rv/rv_defined_swe.h"
#ifdef RVM_AUDIO_MAIN_SWE
  #ifndef _WINDOWS
    #include "config/swconfig.cfg"
    #include "config/sys.cfg"
    #include "config/chipset.cfg"
  #endif

  /* include the usefull L1 header */
  #include "l1_confg.h"

#if (L1_VOICE_MEMO_AMR)
  #include "rv/rv_general.h"
  #include "rvm/rvm_gen.h"
  #include "audio/audio_features_i.h"
  #include "audio/audio_ffs_i.h"
  #include "audio/audio_api.h"
  #include "audio/audio_structs_i.h"
  #include "audio/audio_var_i.h"
  #include "audio/audio_messages_i.h"
  #include "rvf/rvf_target.h"
  #include "audio/audio_const_i.h"
  #include "audio/audio_error_hdlr_i.h"

  /* include the usefull L1 header */
  #define BOOL_FLAG
  #define CHAR_FLAG
  #include "l1_types.h"
  #include "l1audio_cust.h"
  #include "l1audio_msgty.h"
  #include "l1audio_signa.h"

  #include "audio/audio_macro_i.h"

  /********************************************************************************/
  /*                                                                              */
  /*    Function Name:   audio_vm_amr_record_send_status                          */
  /*                                                                              */
  /*    Purpose:  This function sends the voice memorization AMR record status    */
  /*              to the entity.                                                  */
  /*                                                                              */
  /*    Input Parameters:                                                         */
  /*        status,                                                               */
  /*        return path                                                           */
  /*                                                                              */
  /*    Output Parameters:                                                        */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Note:                                                                     */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Revision History:                                                         */
  /*        None.                                                                 */
  /*                                                                              */
  /********************************************************************************/
#if (AUDIO_MEM_MANAGER)
  void audio_vm_amr_record_send_status (T_AUDIO_RET status,
                                        UINT32 recorded_size,
                                        T_RV_RETURN return_path)
  {
    T_AUDIO_AMR_RECORD_STATUS *p_send_message;
    T_RVF_MB_STATUS mb_status = RVF_RED;

    /* allocate the message buffer */
    while (mb_status == RVF_RED)
    {
      mb_status = rvf_get_buf (p_audio_gbl_var->mb_external,
                               sizeof (T_AUDIO_AMR_RECORD_STATUS),
                               (T_RVF_BUFFER **) (&p_send_message));

      /* If insufficient resources, then report a memory error and abort.               */
      /* and wait until more ressource is given */
      if (mb_status == RVF_RED)
      {
        audio_voice_memo_amr_error_trace(AUDIO_ENTITY_NO_MEMORY);
        rvf_delay(RVF_MS_TO_TICKS(1000));
      }
    }

    /*fill the header of the message */
    p_send_message->os_hdr.msg_id = AUDIO_AMR_RECORD_TO_MEM_STATUS_MSG;

    /* fill the status parameters */
    p_send_message->status = status;
    if (recorded_size == 0)
      p_send_message->recorded_duration = 0;
    else
      p_send_message->recorded_duration = recorded_size;

    /* send message or call callback */
    if (return_path.callback_func == NULL)
    {
      rvf_send_msg (return_path.addr_id, p_send_message);
    }
    else
    {
      (*return_path.callback_func)((void *)(p_send_message));
       rvf_free_buf((T_RVF_BUFFER *)p_send_message);
    }
  }

  void audio_vm_amr_record_to_memory_manager (T_RV_HDR *p_message)
  {
    /* Declare local variables. */
    T_RV_HDR *p_send_message;
    T_RVF_MB_STATUS mb_status;
    T_RV_RETURN return_path;

    /**************** audio_vm_amr_record_to_memory_manager function begins ***********************/
    switch(p_audio_gbl_var->audio_vm_amr_record.state)
    {
      case AUDIO_IDLE:
      {
        switch (p_message->msg_id)
        {
          case AUDIO_VM_AMR_RECORD_TO_FFS_START_REQ:
          case AUDIO_VM_AMR_RECORD_TO_RAM_START_REQ:
          {
            T_AUDIO_DRIVER_VM_AMR_RECORD_PARAMETER parameter;
            T_AUDIO_DRIVER_PARAMETER driver_parameter;

            switch (p_message->msg_id)
            {
              case AUDIO_VM_AMR_RECORD_TO_FFS_START_REQ:
              {
                /* save the return path + ffs_fd */
              #if (AUDIO_RAM_MANAGER)
                p_audio_gbl_var->audio_vm_amr_record.audio_ram_fd = NULL;
              #endif
                p_audio_gbl_var->audio_vm_amr_record.return_path.callback_func =
                  ((T_AUDIO_VM_AMR_RECORD_TO_FFS_START *)p_message)->return_path.callback_func;
                p_audio_gbl_var->audio_vm_amr_record.return_path.addr_id   =
                  ((T_AUDIO_VM_AMR_RECORD_TO_FFS_START*)p_message)->return_path.addr_id;
              #if (AUDIO_NEW_FFS_MANAGER)
                p_audio_gbl_var->audio_vm_amr_record.ffs_fd =
                  ((T_AUDIO_VM_AMR_RECORD_TO_FFS_START *)p_message)->audio_ffs_fd;
              #endif

                /* fill AMR parameters and driver parameters */
                parameter.memo_duration      = ((T_AUDIO_VM_AMR_RECORD_TO_FFS_START *)p_message)->memo_duration;
                parameter.compression_mode   = ((T_AUDIO_VM_AMR_RECORD_TO_FFS_START *)p_message)->compression_mode;
                parameter.microphone_gain    = ((T_AUDIO_VM_AMR_RECORD_TO_FFS_START *)p_message)->microphone_gain;
                parameter.amr_vocoder        = ((T_AUDIO_VM_AMR_RECORD_TO_FFS_START *)p_message)->amr_vocoder;
              }
              break;
              case AUDIO_VM_AMR_RECORD_TO_RAM_START_REQ:
              {
                /* save the return path + p_buffer */
              #if (AUDIO_NEW_FFS_MANAGER)
                p_audio_gbl_var->audio_vm_amr_record.ffs_fd = NULL;
              #endif
                p_audio_gbl_var->audio_vm_amr_record.return_path.callback_func =
                  ((T_AUDIO_VM_AMR_RECORD_TO_RAM_START *)p_message)->return_path.callback_func;
                p_audio_gbl_var->audio_vm_amr_record.return_path.addr_id   =
                  ((T_AUDIO_VM_AMR_RECORD_TO_RAM_START*)p_message)->return_path.addr_id;
              #if (AUDIO_RAM_MANAGER)
                p_audio_gbl_var->audio_vm_amr_record.audio_ram_fd =
                  ((T_AUDIO_VM_AMR_RECORD_TO_RAM_START *)p_message)->p_buffer;
              #endif

                /* fill AMR parameters and driver parameters */
                parameter.memo_duration      = ((T_AUDIO_VM_AMR_RECORD_TO_RAM_START *)p_message)->memo_duration;
                parameter.compression_mode   = ((T_AUDIO_VM_AMR_RECORD_TO_RAM_START *)p_message)->compression_mode;
                parameter.microphone_gain    = ((T_AUDIO_VM_AMR_RECORD_TO_RAM_START *)p_message)->microphone_gain;
                parameter.amr_vocoder        = ((T_AUDIO_VM_AMR_RECORD_TO_RAM_START *)p_message)->amr_vocoder;
              }
              break;
            }

            driver_parameter.nb_buffer   = AUDIO_VM_AMR_RECORD_NB_BUFFER;
            driver_parameter.buffer_size = AUDIO_VM_AMR_RECORD_SIZE;

            /* return_path for driver */
            return_path.callback_func    = NULL;
            return_path.addr_id          = p_audio_gbl_var->addrId;

            /* Init driver */
            audio_driver_init_vm_amr_record_session(&parameter, &driver_parameter, return_path);

            p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_WAIT_CHANNEL_ID;
          }
          break;
          case AUDIO_VM_AMR_RECORD_TO_FFS_STOP_REQ:
          case AUDIO_VM_AMR_RECORD_TO_RAM_STOP_REQ:
          {
            audio_voice_memo_amr_error_trace(AUDIO_ERROR_STOP_EVENT);
            /* do not send a status message because of pre-emption issues
            An automatic stop can pre-empt a stop request. A status is sent + back in state idle
            then the stop request is received and another status is sent, which can be misinterpreted */
          }
          break;
        }
      }
      break;

      case AUDIO_WAIT_CHANNEL_ID:
      {
        switch (p_message->msg_id)
        {
          case AUDIO_DRIVER_INIT_STATUS_MSG:
          {
            /* check init is successfull otherwise, send status AUDIO_ERROR */
            if (((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->status == AUDIO_OK)
            {
              /* get channel id */
              p_audio_gbl_var->audio_vm_amr_record.channel_id = ((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->channel_id;

              /* Send the Start message to MEM */
              mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal,
                                       sizeof (T_AUDIO_MEM_START),
                                       (T_RVF_BUFFER **) (&p_send_message));

              /* If insufficient resources, then report a memory error and abort.               */
              if (mb_status == RVF_RED)
              {
                audio_voice_memo_amr_error_trace(AUDIO_ENTITY_NO_MEMORY);
                // TODO: use blocking function from GSP
                return;
              }

              /* fill the header of the message */
              ((T_AUDIO_MEM_START *)p_send_message)->os_hdr.msg_id = AUDIO_MEM_START_REQ;

              /* fill the parameters */
              ((T_AUDIO_MEM_START *)p_send_message)->session_id = AUDIO_VM_AMR_RECORD_SESSION_ID;
              ((T_AUDIO_MEM_START *)p_send_message)->channel_id = p_audio_gbl_var->audio_vm_amr_record.channel_id;
              ((T_AUDIO_MEM_START *)p_send_message)->size = AUDIO_VM_AMR_RECORD_SIZE*2;
            #if (AUDIO_NEW_FFS_MANAGER)
              ((T_AUDIO_MEM_START *)p_send_message)->audio_ffs_fd = p_audio_gbl_var->audio_vm_amr_record.ffs_fd;
            #endif
            #if (AUDIO_RAM_MANAGER)
              ((T_AUDIO_MEM_START *)p_send_message)->audio_ram_fd = p_audio_gbl_var->audio_vm_amr_record.audio_ram_fd;
            #endif

              /* send the message to the entity */
              rvf_send_msg ( p_audio_gbl_var->audio_ffs_addrId, p_send_message);

              /* change state */
              p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_WAIT_STOP;
            }
            else
            {
              audio_voice_memo_amr_error_trace(AUDIO_ERROR_START_EVENT);
              audio_vm_amr_record_send_status (AUDIO_ERROR, 0,
                p_audio_gbl_var->audio_vm_amr_record.return_path);
              /* change state */
              p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_IDLE;
            }
          }
          break;
          case AUDIO_VM_AMR_RECORD_TO_FFS_STOP_REQ:
          #if (AUDIO_RAM_MANAGER)
            if (p_audio_gbl_var->audio_vm_amr_record.audio_ram_fd != NULL)
            {
              audio_voice_memo_amr_error_trace(AUDIO_ERROR_STOP_EVENT);
              return;
            }
          #endif
            /* change state */
            p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_WAIT_CHANNEL_ID_TO_STOP;
          break;
          case AUDIO_VM_AMR_RECORD_TO_RAM_STOP_REQ:
          #if (AUDIO_NEW_FFS_MANAGER)
            if (p_audio_gbl_var->audio_vm_amr_record.ffs_fd != NULL)
            {
              audio_voice_memo_amr_error_trace(AUDIO_ERROR_STOP_EVENT);
              return;
            }
          #endif
            /* change state */
            p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_WAIT_CHANNEL_ID_TO_STOP;
          break;
        }
      } // case AUDIO_WAIT_CHANNEL_ID:
      break;

      case AUDIO_WAIT_STOP:
      {
        switch (p_message->msg_id)
        {
          case AUDIO_VM_AMR_RECORD_TO_FFS_STOP_REQ:
          case AUDIO_VM_AMR_RECORD_TO_RAM_STOP_REQ:
          {
            // we handle a RAM stop when New_ffs is running as an error
          #if (AUDIO_NEW_FFS_MANAGER)
            if ((p_message->msg_id == AUDIO_VM_AMR_RECORD_TO_RAM_STOP_REQ)&&
                (p_audio_gbl_var->audio_vm_amr_record.ffs_fd != NULL))
            {
              audio_voice_memo_amr_error_trace(AUDIO_ERROR_STOP_EVENT);
              return;
            }
          #endif
          // we handle a New_ffs stop when RAM is running as an error
          #if (AUDIO_RAM_MANAGER)
            if ((p_message->msg_id == AUDIO_VM_AMR_RECORD_TO_FFS_STOP_REQ)&&
                (p_audio_gbl_var->audio_vm_amr_record.audio_ram_fd != NULL))
            {
              audio_voice_memo_amr_error_trace(AUDIO_ERROR_STOP_EVENT);
              return;
            }
          #endif
            /* Send the Stop message to MEM manager */
            mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal,
                                     sizeof (T_AUDIO_MEM_STOP),
                                     (T_RVF_BUFFER **) (&p_send_message));

            /* If insufficient resources, then report a memory error and abort.               */
            if (mb_status == RVF_RED)
            {
              audio_voice_memo_amr_error_trace(AUDIO_ENTITY_NO_MEMORY);
              return;
            }

            /* fill message */
            ((T_AUDIO_MEM_STOP *)p_send_message)->os_hdr.msg_id = AUDIO_MEM_STOP_REQ;
            ((T_AUDIO_MEM_STOP *)p_send_message)->channel_id    = p_audio_gbl_var->audio_vm_amr_record.channel_id;

            /* send the message to the entity */
            rvf_send_msg (p_audio_gbl_var->audio_ffs_addrId, p_send_message);

            p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_WAIT_STOP_CON;
          }
          break;
          case AUDIO_MEM_STATUS_MSG:
          {
            if (((T_AUDIO_MEM_STATUS *)p_message)->status_type == AUDIO_STOP_STATUS)
            {
              /* should be useless as it is an automatic stop so AUDIO_OK */
              if (((T_AUDIO_MEM_STATUS *)p_message)->status == AUDIO_OK)
              {
                audio_vm_amr_record_send_status (AUDIO_OK, ((T_AUDIO_MEM_STATUS *)p_message)->recorded_size,
                  p_audio_gbl_var->audio_vm_amr_record.return_path);
                p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_IDLE;
              }
            }
            if (((T_AUDIO_MEM_STATUS *)p_message)->status_type == AUDIO_START_STATUS)
            {
              /* MEM could not find a free mem channel */
              if (((T_AUDIO_MEM_STATUS *)p_message)->status == AUDIO_ERROR)
              {
                audio_vm_amr_record_send_status (AUDIO_ERROR, 0,
                  p_audio_gbl_var->audio_vm_amr_record.return_path);
                p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_IDLE;
              }
            }
          }
          break;
        }
      }
      break;
      case AUDIO_WAIT_STOP_CON:
      {
        switch (p_message->msg_id)
        {
          case AUDIO_MEM_STATUS_MSG:
          {
            if (((T_AUDIO_MEM_STATUS *)p_message)->status_type == AUDIO_STOP_STATUS)
            {
              audio_vm_amr_record_send_status (AUDIO_OK, ((T_AUDIO_MEM_STATUS *)p_message)->recorded_size,
                p_audio_gbl_var->audio_vm_amr_record.return_path);
              p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_IDLE;
            }
          }
          break;
          case AUDIO_VM_AMR_RECORD_TO_FFS_STOP_REQ:
          case AUDIO_VM_AMR_RECORD_TO_RAM_STOP_REQ:
            audio_voice_memo_amr_error_trace(AUDIO_ERROR_STOP_EVENT);
          break;
        }
      }
      break;
      case AUDIO_WAIT_CHANNEL_ID_TO_STOP:
      {
        switch (p_message->msg_id)
        {
          case AUDIO_DRIVER_INIT_STATUS_MSG:
          {
            if (((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->status == AUDIO_OK)
            {
              /* get channel_id */
              p_audio_gbl_var->audio_vm_amr_record.channel_id = ((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->channel_id;

              audio_driver_stop_session(p_audio_gbl_var->audio_vm_amr_record.channel_id);

              /* change state */
              p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_WAIT_DRIVER_STOP_CON;
            }
            else
            {
              /* close file */
            #if (AUDIO_NEW_FFS_MANAGER)
              if (p_audio_gbl_var->audio_vm_amr_record.ffs_fd != NULL)
              {
                if ( ffs_close(p_audio_gbl_var->audio_vm_amr_record.ffs_fd) != EFFS_OK )
                {
                  audio_ffs_error_trace(AUDIO_ENTITY_FILE_NO_CLOSE);
                }
                AUDIO_SEND_TRACE("AUDIO VM AMR RECORD: close FFS file", RV_TRACE_LEVEL_DEBUG_LOW);
              }
            #endif

              audio_vm_amr_record_send_status (AUDIO_OK, 0,
                p_audio_gbl_var->audio_vm_amr_record.return_path);

              /* change state */
              p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_IDLE;
            }
          }
          break;
          case AUDIO_VM_AMR_RECORD_TO_FFS_STOP_REQ:
          case AUDIO_VM_AMR_RECORD_TO_RAM_STOP_REQ:
            audio_voice_memo_amr_error_trace(AUDIO_ERROR_STOP_EVENT);
          break;
        }
      } // case AUDIO_WAIT_CHANNEL_ID_TO_STOP:
      break;
      case AUDIO_WAIT_DRIVER_STOP_CON:
      {
        switch (p_message->msg_id)
        {
          case AUDIO_DRIVER_STATUS_MSG:
          {
            if (((T_AUDIO_DRIVER_STATUS *)p_message)->status_type == AUDIO_STOP_STATUS)
            {
              /* close file */
            #if (AUDIO_NEW_FFS_MANAGER)
              if (p_audio_gbl_var->audio_vm_amr_record.ffs_fd != NULL)
              {
                if ( ffs_close(p_audio_gbl_var->audio_vm_amr_record.ffs_fd) != EFFS_OK )
                {
                  audio_ffs_error_trace(AUDIO_ENTITY_FILE_NO_CLOSE);
                }
                AUDIO_SEND_TRACE("AUDIO VM AMR RECORD: close FFS file", RV_TRACE_LEVEL_DEBUG_LOW);
              }
            #endif

              audio_vm_amr_record_send_status (AUDIO_OK, 0,
                p_audio_gbl_var->audio_vm_amr_record.return_path);
              p_audio_gbl_var->audio_vm_amr_record.state = AUDIO_IDLE;
            }
          }
          break;
          case AUDIO_VM_AMR_RECORD_TO_FFS_STOP_REQ:
          case AUDIO_VM_AMR_RECORD_TO_RAM_STOP_REQ:
            audio_voice_memo_amr_error_trace(AUDIO_ERROR_STOP_EVENT);
          break;
        }
      } //case AUDIO_WAIT_DRIVER_STOP_CON:
      break;
    }
  } /*********************** End of audio_vm_amr_record_to_memory_manager function **********************/
#endif // AUDIO_MEM_MANAGER

  /********************************************************************************/
  /*                                                                              */
  /*    Function Name:   audio_driver_vm_amr_record_convert_parameter             */
  /*                                                                              */
  /*    Purpose:  Convert the voice memorization record parameters from the       */
  /*              entity to the l1 parameters                                     */
  /*                                                                              */
  /*    Input Parameters:                                                         */
  /*        session_id of the voice memo record                                   */
  /*        id of the voice memo record                                           */
  /*                                                                              */
  /*    Output Parameters:                                                        */
  /*        layer 1 voice memo record message                                     */
  /*                                                                              */
  /*    Note:                                                                     */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Revision History:                                                         */
  /*        None.                                                                 */
  /*                                                                              */
  /********************************************************************************/
  void audio_driver_vm_amr_record_convert_parameter(T_AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION *entity_parameter,
                                             T_MMI_VM_AMR_RECORD_REQ *l1_parameter)
  {
     /* session id : specifies the customer data identification corresponding to   */
    /*              this voice memorization */
    l1_parameter->session_id      = AUDIO_VM_AMR_RECORD_SESSION_ID;
    l1_parameter->maximum_size    = entity_parameter->memo_duration + SC_VM_AMR_END_MASK_SIZE;
    l1_parameter->dtx_used        = (BOOL)(entity_parameter->compression_mode);
    l1_parameter->record_coeff_ul = (UINT16)(entity_parameter->microphone_gain);
    l1_parameter->amr_vocoder     = (UINT16)(entity_parameter->amr_vocoder);
  }

  /********************************************************************************/
  /*                                                                              */
  /*    Function Name:   audio_driver_vm_amr_record_manager                       */
  /*                                                                              */
  /*    Purpose:  This function is called to manage a voice memorization record   */
  /*              manager                                                         */
  /*                                                                              */
  /*    Input Parameters:                                                         */
  /*        Message to the audio entity                                           */
  /*                                                                              */
  /*    Output Parameters:                                                        */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Note:                                                                     */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Revision History:                                                         */
  /*        None.                                                                 */
  /*                                                                              */
  /********************************************************************************/
  T_AUDIO_RET audio_driver_vm_amr_record_manager (T_RV_HDR *p_message, T_AUDIO_DRIVER_SESSION *p_session)
  {
    /**************** audio_driver_vm_amr_record_manager function begins ***********************/
    switch(p_session->session_info.state)
    {
      case AUDIO_DRIVER_CHANNEL_WAIT_INIT:
      {
        /* allocate the buffer for the message to the L1 */
        p_session->session_req.p_l1_send_message =
          audio_allocate_l1_message(sizeof(T_MMI_VM_AMR_RECORD_REQ));

        if (p_session->session_req.p_l1_send_message != NULL )
        {
          /* Convert the entity parameters to the audio L1 parameters */
          audio_driver_vm_amr_record_convert_parameter((T_AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION*)p_message,
                                                       p_session->session_req.p_l1_send_message);
          return (AUDIO_OK);
        }
        return (AUDIO_ERROR);
      }
      break;

      case AUDIO_DRIVER_CHANNEL_WAIT_START:
      {
        /* send the start voice memo record message to the L1 */
        audio_send_l1_message(MMI_VM_AMR_RECORD_START_REQ,
                              p_session->session_req.p_l1_send_message);
        return (AUDIO_OK);
      }
      break;

      case AUDIO_DRIVER_CHANNEL_WAIT_STOP:
      {
        /* send the stop command to the audio L1 */
        /* allocate the buffer for the message to the L1 */
        void *p_send_message = audio_allocate_l1_message(0);
        if ( p_send_message != NULL)
        {
          /* send the stop command to the audio L1 */
          audio_send_l1_message(MMI_VM_AMR_RECORD_STOP_REQ, p_send_message);
          return (AUDIO_OK);
        }
        return (AUDIO_ERROR);
      }
      break;
      case AUDIO_DRIVER_CHANNEL_WAIT_START_CON_TO_STOP:
      {
        /* only STOP is handled here */
        /* send the stop command to the audio L1 */
        /* allocate the buffer for the message to the L1 */
        void *p_send_message = audio_allocate_l1_message(0);
        if ( p_send_message != NULL)
        {
          /* send the stop command to the audio L1 */
          audio_send_l1_message(MMI_VM_AMR_RECORD_STOP_REQ, p_send_message);
          return (AUDIO_OK);
        }
        return (AUDIO_ERROR);
      }
      break;
    }
  } /*********************** End of audio_vm_record_manager function **********************/

#endif /* VM_AMR_RECORD */
#endif /* RVM_AUDIO_MAIN_SWE */