view src/cs/services/audio/audio_task.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/****************************************************************************/
/*                                                                          */
/*  Name        audio_task.c                                                */
/*                                                                          */
/*  Function    this file contains the main AUDIO function: audio_task      */
/*              It contains the body of the AUDIO task.                     */
/*              It will initialize the AUDIO and then wait for messages     */
/*              or functions calls.                                         */
/*                                                                          */
/*  Version   0.1                                                           */
/*                                                                          */
/*  Date        Modification                                                */
/*  ------------------------------------                                    */
/*  18 May 2001  Create                                                     */
/*                                                                          */
/*  Author   Francois Mazard - 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 "l1_confg.h"
  #include "rvf/rvf_api.h"
  #include "rv/rv_general.h"
  #include "rvm/rvm_gen.h"
  #include "audio/audio_features_i.h"
  #include "audio/audio_api.h"
  #include "audio/audio_env_i.h"
  #include "audio/audio_ffs_i.h"
  #include "audio/audio_structs_i.h"
  #include "audio/audio_macro_i.h"
  #include "rvf/rvf_target.h"
  #include "audio/audio_const_i.h"
  #include "audio/audio_var_i.h"
  #include "audio/audio_error_hdlr_i.h"
  #include "audio/audio_messages_i.h"
  #if (L1_GTT == 1)
    #include "tty/tty_i.h"
    #include "l1gtt_signa.h"
  #endif

  #ifndef _WINDOWS
    /* include the usefull L1 header */
    #define BOOL_FLAG
    #define CHAR_FLAG
    #include "l1_types.h"
    #include "cust_os.h"
    #include "l1audio_cust.h"
    #include "l1audio_msgty.h"
    #include "l1audio_signa.h"
    #include "l1_signa.h"
  #else
    /* include the usefull L1 header */
    #define BOOL_FLAG
    //#define CHAR_FLAG
    #include "l1_types.h"
    #include "l1audio_const.h"
    #include "l1audio_cust.h"
    #include "l1audio_defty.h"
    #include "l1audio_msgty.h"
    #include "l1audio_signa.h"
    #include "l1_const.h"
    #include "l1_defty.h"
    #include "l1_msgty.h"
    #include "l1_signa.h"
    #include "l1_varex.h"
    #include "audio/tests/audio_test.h"
  #endif

  #ifndef _WINDOWS
    #if (TRACE_TYPE==4)
      extern void l1_trace_message(xSignalHeaderRec *msg);
    #endif
  #endif
  #if (L1_GTT == 1)
    extern void tty_manager (T_RV_HDR *p_message);
    extern T_TTY_ENV_CTRL_BLK *tty_env_ctrl_blk_p;
  #endif
  #if (L1_MIDI==1)
    extern UINT8 audio_midi_message_switch(T_RV_HDR *p_message);
  #endif
  extern   BOOLEAN audio_compatibilities_manager (T_RV_HDR *p_message);


  /********************************************************************************/
  /*                                                                              */
  /*    Function Name:   audio_allocate_l1_message                                */
  /*                                                                              */
  /*    Purpose:  This function is called to allocate a buffer for the message    */
  /*              to the l1                                                       */
  /*                                                                              */
  /*    Input Parameters:                                                         */
  /*        Size                                                                  */
  /*                                                                              */
  /*    Output Parameters:                                                        */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Note:                                                                     */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Revision History:                                                         */
  /*        None.                                                                 */
  /*                                                                              */
  /********************************************************************************/
  void *audio_allocate_l1_message(UINT16 size)
  {
    void *buffer = NULL;

    #ifdef _WINDOWS
      T_RVF_MB_STATUS mb_status;
      /* allocate a buffer in the riviera environement */
      if (size == 0)
      {
        /* allocate the memory for a message without parameter */
        mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal,
                                 sizeof(T_RV_HDR),
                                 (T_RVF_BUFFER **) (&buffer));
      }
      else
      {
        /* allocate the memory for a message with some parameters */
        mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal,
                                 size,
                                 (T_RVF_BUFFER **) (&buffer));
      }

      /* If insufficient resources, then report a memory error and abort. */
      if (mb_status == RVF_YELLOW)
      {
        /* deallocate the memory */
        rvf_free_buf((T_RVF_BUFFER *)buffer);
        audio_error_trace(AUDIO_ENTITY_NO_MEMORY);
        return (NULL);
      }
      else
      if (mb_status == RVF_RED)
      {
          audio_error_trace(AUDIO_ENTITY_NO_MEMORY);
        return (NULL);
      }

    #else
      /* allocate a buffer in the L1 environement */
      /* allocate a buffer in the L1 environement */
      xSignalHeaderRec* p_msg;

      p_msg = os_alloc_sig(size);

      buffer = (void*)p_msg->SigP;
    #endif

    return(buffer);
  }

  /********************************************************************************/
  /*                                                                              */
  /*    Function Name:   audio_deallocate_l1_message                              */
  /*                                                                              */
  /*    Purpose:  This function is called to deallocate a buffer for the message  */
  /*              to the l1.                                                      */
  /*                                                                              */
  /*    Input Parameters:                                                         */
  /*        Audio Key Beep Parameters,                                            */
  /*                                                                              */
  /*    Output Parameters:                                                        */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Note:                                                                     */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Revision History:                                                         */
  /*        None.                                                                 */
  /*                                                                              */
  /********************************************************************************/
  void audio_deallocate_l1_message(void *message)
  {
    #ifdef _WINDOWS
      T_RV_RET  status;

      /* deallocate the memory */
      status = rvf_free_buf((T_RVF_BUFFER *)message);
      if (status != RVF_GREEN)
      {
        AUDIO_SEND_TRACE(" AUDIO ERROR (env). A wrong message is deallocated ",
                       RV_TRACE_LEVEL_ERROR);
      }

    #else
      /* deallocate a buffer in the L1 environement */
      os_free_sig((xSignalHeaderRec*)message);
    #endif
  }

  /********************************************************************************/
  /*                                                                              */
  /*    Function Name:   audio_send_l1_message                                    */
  /*                                                                              */
  /*    Purpose:  This function is called to send the message to the L1           */
  /*                                                                              */
  /*    Input Parameters:                                                         */
  /*        the message id and the message,                                       */
  /*                                                                              */
  /*    Output Parameters:                                                        */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Note:                                                                     */
  /*        None.                                                                 */
  /*                                                                              */
  /*    Revision History:                                                         */
  /*        None.                                                                 */
  /*                                                                              */
  /********************************************************************************/
  T_RV_RET audio_send_l1_message(INT16 message_id, void *message)
  {
    #ifdef _WINDOWS
      #if ((AUDIO_REGR == SW_COMPILED) || (AUDIO_MISC == SW_COMPILED))
      ((T_RV_HDR *)message)->msg_id = message_id;

      switch (message_id)
      {
        /* send the messsage to the audio entity */
        #if (KEYBEEP)
          case MMI_KEYBEEP_START_REQ:
          case MMI_KEYBEEP_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->keybeep.return_path.addr_id,
                          message);
            break;
          }
        #endif
        #if (TONE)
          case MMI_TONE_START_REQ:
          case MMI_TONE_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->tones.return_path.addr_id,
                          message);
            break;
          }
        #endif
        #if (MELODY_E1)
          case MMI_MELODY0_START_REQ:
          case MMI_MELODY0_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->melody_E1_0.return_path.addr_id,
                          message);
            break;
          }
          case MMI_MELODY1_START_REQ:
          case MMI_MELODY1_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->melody_E1_1.return_path.addr_id,
                          message);
            break;
          }
        #endif
        #if (MELODY_E2)
          case MMI_MELODY0_E2_START_REQ:
          case MMI_MELODY0_E2_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->melody_E2_0.return_path.addr_id,
                          message);
            break;
          }
          case MMI_MELODY1_E2_START_REQ:
          case MMI_MELODY1_E2_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->melody_E2_1.return_path.addr_id,
                          message);
            break;
          }
       #endif
        #if (VOICE_MEMO)
          case MMI_VM_PLAY_START_REQ:
          case MMI_VM_PLAY_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->vm_play.return_path.addr_id,
                          message);
            break;
          }
          case MMI_VM_RECORD_START_REQ:
          case MMI_VM_RECORD_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->vm_record.return_path.addr_id,
                          message);
            break;
          }
        #endif
        #if (SPEECH_RECO)
          case MMI_SR_ENROLL_START_REQ:
          case MMI_SR_ENROLL_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->speech_reco.sr_enroll.return_path.addr_id,
                          message);
            break;
          }
          case MMI_SR_UPDATE_START_REQ:
          case MMI_SR_UPDATE_STOP_REQ:
          case MMI_SR_UPDATE_CHECK_START_REQ:
          case MMI_SR_UPDATE_CHECK_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->speech_reco.sr_update.return_path.addr_id,
                          message);
            break;
          }
          case MMI_SR_RECO_START_REQ:
          case MMI_SR_RECO_STOP_REQ:
          {
            rvf_send_msg (p_audio_gbl_var->speech_reco.sr_reco.return_path.addr_id,
                          message);
            break;
          }
        #endif
        #if (L1_GTT == 1)
          case MMI_GTT_START_REQ:
          case MMI_GTT_STOP_REQ:
          {
            rvf_send_msg (tty_env_ctrl_blk_p->return_path.addr_id,
                          message);
          }
          break;
        #endif
        #if (L1_MIDI==1)
          case MMI_MIDI_START_REQ:
          case MMI_MIDI_STOP_REQ:
          {
            rvf_send_msg(p_audio_gbl_var->addrId,message);
            break;
          }
        #endif
          #if (FIR)
            case MMI_AUDIO_FIR_CON:
            case MMI_AUDIO_FIR_REQ:
          #endif
          #if (AEC)
            case MMI_AEC_CON:
            case MMI_AEC_REQ:
          #endif
          #if (AUDIO_MODE)
            case MMI_AUDIO_MODE_CON:
            case MMI_AUDIO_MODE_REQ:
          #endif
          case OML1_STOP_DAI_TEST_REQ:
          case OML1_STOP_DAI_TEST_CON:
          {
            rvf_send_msg (p_audio_test->test_addr_id,
                          message);
            break;
          }
        }
        return(RV_OK);
      #endif
    #else
      xSignalHeaderRec *p_signal;

      p_signal = (xSignalHeaderRec*)(message);
      p_signal--;
      p_signal->SigP = (DummyStruct*)(message);
      p_signal->SignalCode = message_id;

      #if (TRACE_TYPE==4)
        l1_trace_message(p_signal);
      #endif


      /* send a message in the L1 environement */
      os_send_sig(p_signal, L1C1_QUEUE);

      return(RV_OK);
    #endif
  }

  /********************************************************************************/
  /* Function         audio_core                                                  */
  /*                                                                              */
  /* Description      Core of the audio task, which initiliazes the audio SWE and */
  /*                  waits for messages.                                         */
  /*                                                                              */
  /********************************************************************************/
  T_RV_RET audio_core(void)
  {
    /* Declare local variables */
    BOOLEAN       error_occured = FALSE;
    T_RV_HDR      *p_message    = NULL;
    UINT16        received_event= 0x0000;
    T_RV_RET      status;

    AUDIO_SEND_TRACE("AUDIO_TASK started",RV_TRACE_LEVEL_DEBUG_HIGH);

    /* loop to process messages */
    while (error_occured == FALSE)
    {
      /* Wait for the necessary events (all events and no time out). */
      received_event = rvf_wait (AUDIO_ALL_EVENT_FLAGS, AUDIO_NOT_TIME_OUT);

      #if (MELODY_E1) || (MELODY_E2) || (VOICE_MEMO)
        /* the time out for the AUDIO FFS downloader is expired */
        if (received_event & AUDIO_FFS_TIMER_EVT_MASK)
        {
            audio_ffs_downloader();
        }
      #endif /* MELODY_E1 || MELODY_E2 || VOICE_MEMO

      /* If an event is received, then ....*/
      if (received_event & AUDIO_TASK_MBOX_EVT_MASK)
      {
        /* Read the message in the audio mailbox */
        p_message = (T_RV_HDR *) rvf_read_mbox(AUDIO_MBOX);

        if (p_message != NULL)
        {
          p_audio_gbl_var->message_processed = FALSE;

        #if (MELODY_E1) || (MELODY_E2) || (VOICE_MEMO)
          if ( (p_message->msg_id == AUDIO_FFS_FLASH_2_RAM_START_REQ) ||
               (p_message->msg_id == AUDIO_FFS_RAM_2_FLASH_START_REQ) ||
               (p_message->msg_id == AUDIO_FFS_STOP_REQ) )
          {
            AUDIO_SEND_TRACE_PARAM("AUDIO FFS MANAGER with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
            /* process FFS message */
            audio_ffs_manager(p_message);
            p_audio_gbl_var->message_processed = TRUE;
          }
        #endif /* MELODY_E1 || MELODY_E2 || VOICE_MEMO */

        #if (AUDIO_MEM_MANAGER)
          if (audio_mem_message_switch(p_message) == 1)
          {
            AUDIO_SEND_TRACE_PARAM("AUDIO MEMORY MANAGER with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
            /* process FFS message */
            audio_mem_manager(p_message);
            p_audio_gbl_var->message_processed = TRUE;
          }
        #endif // AUDIO_MEM_MANAGER

          /* Check the compatibility with the active audio task */
          if (audio_compatibilities_manager(p_message))
          {
            #if (KEYBEEP)
              if ( (p_message->msg_id == AUDIO_KEYBEEP_START_REQ) ||
                   (p_message->msg_id == AUDIO_KEYBEEP_STOP_REQ)  ||
                   (p_message->msg_id == MMI_KEYBEEP_START_CON)   ||
                   (p_message->msg_id == MMI_KEYBEEP_STOP_CON) )
              {
                AUDIO_SEND_TRACE_PARAM("AUDIO KEYBEEP with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                /* process the keybeep manager */
                audio_keybeep_manager(p_message);
                p_audio_gbl_var->message_processed = TRUE;
              }
            #endif
            #if (TONE)
              if ( (p_message->msg_id == AUDIO_TONES_START_REQ)  ||
                   (p_message->msg_id == AUDIO_TONES_STOP_REQ)   ||
                   (p_message->msg_id == MMI_TONE_START_CON)     ||
                   (p_message->msg_id == MMI_TONE_STOP_CON) )
              {
                AUDIO_SEND_TRACE_PARAM("AUDIO TONES with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                /* process the tones manager */
                audio_tones_manager(p_message);
                p_audio_gbl_var->message_processed = TRUE;
              }
            #endif
            #if (SPEECH_RECO)
              if ( (p_message->msg_id == AUDIO_SR_ENROLL_START_REQ)  ||
                   (p_message->msg_id == AUDIO_SR_ENROLL_STOP_REQ)   ||
                   (p_message->msg_id == MMI_SR_ENROLL_START_CON)    ||
                   (p_message->msg_id == MMI_SR_ENROLL_STOP_CON) )
              {
                AUDIO_SEND_TRACE_PARAM("AUDIO SR ENROLL with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                audio_sr_enroll_manager(p_message);
                p_audio_gbl_var->message_processed = TRUE;
              }
              if ( (p_message->msg_id == AUDIO_SR_UPDATE_START_REQ)     ||
                   (p_message->msg_id == AUDIO_SR_UPDATE_STOP_REQ)      ||
                   (p_message->msg_id == MMI_SR_UPDATE_START_CON)       ||
                   (p_message->msg_id == MMI_SR_UPDATE_STOP_CON)        ||
                   (p_message->msg_id == MMI_SR_UPDATE_CHECK_START_CON) ||
                   (p_message->msg_id == MMI_SR_UPDATE_CHECK_STOP_CON) )
              {
                AUDIO_SEND_TRACE_PARAM("AUDIO SR UPDATE with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                audio_sr_update_manager(p_message);
                p_audio_gbl_var->message_processed = TRUE;
              }
              if ( (p_message->msg_id == AUDIO_SR_RECO_START_REQ)  ||
                   (p_message->msg_id == AUDIO_SR_RECO_STOP_REQ)   ||
                   (p_message->msg_id == MMI_SR_RECO_START_CON)    ||
                   (p_message->msg_id == MMI_SR_RECO_STOP_CON) )
              {
                AUDIO_SEND_TRACE_PARAM("AUDIO SR RECO with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                audio_sr_reco_manager(p_message);
                p_audio_gbl_var->message_processed = TRUE;
              }
              #ifndef _WINDOWS
                /* add the management of the background task in the audio entity */
                if ( (p_message->msg_id == L1_SRBACK_SAVE_DATA_REQ)    ||
                     (p_message->msg_id == L1_SRBACK_LOAD_MODEL_REQ)   ||
                     (p_message->msg_id == L1_SRBACK_TEMP_SAVE_DATA_REQ) )
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO SR BACKGROUND with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  audio_sr_background_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                }
              #endif
            #endif
            #if (MELODY_E1)
              /* determine which melody id is involved by this start or stop message */
              switch (audio_melody_E1_message_switch(p_message))
              {
                /* The message is for the melody number 0 */
                case AUDIO_MELODY_E1_0:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO MELODY E1.0 with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the melody E1 manager 0 */
                  audio_melody_E1_manager_0(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                  break;
                }
                /* The message is for the melody number 1 */
                case AUDIO_MELODY_E1_1:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO MELODY E1.1 with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the melody E1 manager 1 */
                  audio_melody_E1_manager_1(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                  break;
                }
              } /* switch */
            #endif
            #if (MELODY_E2)
              /* determine which melody id is involved by this start or stop messsage */
              switch (audio_melody_E2_message_switch(p_message))
              {
                /* The message is for the melody number 0 */
                case AUDIO_MELODY_E2_0:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO MELODY E2.0 with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the melody E2 manager 0 */
                  audio_melody_E2_manager_0(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                  break;
                }
                /* The message is for the melody number 1 */
                case AUDIO_MELODY_E2_1:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO MELODY E2.1 with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the melody E2 manager 1 */
                  audio_melody_E2_manager_1(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                  break;
                }
              } /* switch */
              #ifndef _WINDOWS
                /* add the management of the melody E2 background task in the audio entity */
                if ( (p_message->msg_id == L1_BACK_MELODY_E2_LOAD_INSTRUMENT_REQ) ||
                     (p_message->msg_id == L1_BACK_MELODY_E2_UNLOAD_INSTRUMENT_REQ) )
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO MELODY E2 BACKGROUND with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  audio_background_melody_e2_download_instrument_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                }
              #endif
            #endif
            #if (VOICE_MEMO)
              switch (audio_voice_memo_message_switch(p_message))
              {
                /* The message is for the voice memo play*/
                case AUDIO_VM_PLAY:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO VM PLAY with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the voice memo play manager */
                  audio_vm_play_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                  break;
                }
                /* The message is for the voice memo record */
                case AUDIO_VM_RECORD:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO VM RECORD with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the voice memo record manager */
                  audio_vm_record_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                  break;
                }
              } /* switch */
            #endif
            #if (L1_GTT == 1)
              if ( (p_message->msg_id == TTY_START_REQ) ||
                   (p_message->msg_id == TTY_STOP_REQ) ||
                   (p_message->msg_id == MMI_GTT_START_CON) ||
                   (p_message->msg_id == MMI_GTT_STOP_CON))
              {
                AUDIO_SEND_TRACE_PARAM("TTY with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                /* process the TTY manager */
                tty_manager(p_message);
                p_audio_gbl_var->message_processed = TRUE;
              }
            #endif
            #if (L1_VOICE_MEMO_AMR)&&(AUDIO_MEM_MANAGER)
              switch (audio_voice_memo_amr_memory_message_switch(p_message))
              {
                /* The message is for the voice memo play*/
                case AUDIO_VM_AMR_PLAY:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO VM AMR MMS PLAY from memory with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the voice memo play manager */
                  audio_vm_amr_play_from_memory_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                }
                break;
                /* The message is for the voice memo record */
                case AUDIO_VM_AMR_RECORD:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO VM AMR MMS RECORD to memory with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the voice memo record manager */
                  audio_vm_amr_record_to_memory_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                }
                break;
              } /* switch */
            #endif

            #if (L1_MIDI==1)
              if(audio_midi_message_switch(p_message)==AUDIO_MIDI)
              {
                AUDIO_SEND_TRACE_PARAM("AUDIO MIDI with the msg",p_message->msg_id,RV_TRACE_LEVEL_DEBUG_LOW);
                audio_midi_manager(p_message);
                p_audio_gbl_var->message_processed = TRUE;
              }
            #endif

            #if (L1_AUDIO_DRIVER)
              switch (audio_driver_message_switch(p_message))
              {
                /* The message is for the voice memo play*/
                case AUDIO_DRIVER_SWITCH:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the voice memo play manager */
                  audio_driver_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                }
                break;
                case AUDIO_DRIVER_VM_AMR_RECORD_SESSION_SWITCH:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER VM AMR RECORD with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the voice memo record manager */
                  audio_driver_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                }
                break;
                case AUDIO_DRIVER_VM_AMR_PLAY_SESSION_SWITCH:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER VM AMR PLAY with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the voice memo record manager */
                  audio_driver_manager(p_message);
                  p_audio_gbl_var->message_processed = TRUE;
                }
                break;
                case AUDIO_DRIVER_MIDI_SESSION_SWITCH:
                {
                  AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER MIDI with the msg",p_message->msg_id,RV_TRACE_LEVEL_DEBUG_LOW);
                  /* process the voice memo record manager */
                  audio_driver_manager(p_message);
                  p_audio_gbl_var->message_processed=TRUE;
                }
                break;
              } /* switch */
            #endif
            switch(audio_mode_message_switch(p_message))
            {
              case AUDIO_FULL_ACCESS_WRITE:
              {
                 AUDIO_SEND_TRACE_PARAM("AUDIO MODE FULL ACCESS WRITE with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                 audio_mode_full_access_write_manager(p_message);
                 p_audio_gbl_var->message_processed = TRUE;
                 break;
              }
              case AUDIO_MODE_SAVE:
              {
                 AUDIO_SEND_TRACE_PARAM("AUDIO MODE SAVE with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                 audio_mode_save_manager(p_message);
                 p_audio_gbl_var->message_processed = TRUE;
                 break;
              }
              case AUDIO_MODE_LOAD:
              {
                 AUDIO_SEND_TRACE_PARAM("AUDIO MODE LOAD with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                 audio_mode_load_manager(p_message);
                 p_audio_gbl_var->message_processed = TRUE;
                 break;
              }
              case AUDIO_SPEAKER_VOLUME:
              {
                 AUDIO_SEND_TRACE_PARAM("AUDIO MODE SPEAKER VOLUME with the msg", p_message->msg_id, RV_TRACE_LEVEL_DEBUG_LOW);
                 audio_mode_speaker_volume_manager (p_message);
                 p_audio_gbl_var->message_processed = TRUE;
                 break;
              }

            }

#ifdef _WINDOWS
          #if (L1_MIDI == 1)
            // l1 simulator for MIDI
            if(p_message->msg_id==MMI_MIDI_START_REQ || p_message->msg_id==MMI_MIDI_STOP_REQ)
            {
              AUDIO_SEND_TRACE_PARAM("AUDIO MIDI SIMUL with the msg",p_message->msg_id,RV_TRACE_LEVEL_DEBUG_LOW);
              audio_midi_l1_simulator(received_event,p_message);
              p_audio_gbl_var->message_processed = TRUE;
            }
          #endif
#endif // _WINDOWS

          } /* audio_compatibilities_manager */

          if (p_audio_gbl_var->message_processed == FALSE)
          {
            AUDIO_SEND_TRACE_PARAM(" AUDIO ERROR (env). A wrong message is received ",
                           p_message->msg_id, RV_TRACE_LEVEL_ERROR);
          }
          status = rvf_free_buf((T_RVF_BUFFER *)p_message);
          if (status != RVF_GREEN)
          {
            AUDIO_SEND_TRACE(" AUDIO ERROR (env). A wrong message is deallocated ",
                           RV_TRACE_LEVEL_ERROR);
          }
        } /* if (p_message != NULL) */
        else
        {
          AUDIO_SEND_TRACE(" AUDIO ERROR (env). Can't read the message received ",
                         RV_TRACE_LEVEL_ERROR);
        }
      } /* if (received_event & AUDIO_TASK_MBOX_EVT_MASK) */

       /* Wait timer simulation event to send notifications */
#ifdef _WINDOWS
    #if (L1_MIDI == 1)
      if(received_event & AUDIO_MIDI_L1_SIMUL_TIMER_EVT_MASK)
        audio_midi_l1_simulator(received_event,p_message);
    #endif
#endif
      
      /* If one of the occured events is unexpected (due to an unassigned */
      /* mailbox), then report an internal error.                         */
#ifdef _WINDOWS
      if(received_event & ~(AUDIO_TASK_MBOX_EVT_MASK | AUDIO_FFS_TIMER_EVT_MASK| AUDIO_MIDI_L1_SIMUL_TIMER_EVT_MASK))
#else
      if(received_event & ~(AUDIO_TASK_MBOX_EVT_MASK | AUDIO_FFS_TIMER_EVT_MASK))
#endif
      {
        AUDIO_SEND_TRACE(" AUDIO ERROR (env). One of the occured events is unexpected ",
                           RV_TRACE_LEVEL_ERROR);

        error_occured = TRUE;
      }
    } /* end of While */
    return(RV_INTERNAL_ERR);
  } /****************************** End of audio_task function **************************/

#endif /* #ifdef RVM_AUDIO_MAIN_SWE */