FreeCalypso > hg > fc-magnetite
view src/cs/services/audio/audio_driver.c @ 550:a1da09e02973
doc/Config-vars: TRACEMASK_IN_FFS addition documented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 18 Nov 2018 08:59:50 +0000 |
parents | 838eeafb0051 |
children |
line wrap: on
line source
/****************************************************************************/ /* */ /* File Name: audio_driver.c */ /* */ /* Purpose: This file contains all the functions used to manage the */ /* driver. */ /* */ /* Version 0.1 */ /* */ /* Date Modification */ /* ------------------------------------ */ /* 09 December 2002 Create */ /* */ /* Author Frederic Turgis */ /* */ /* (C) Copyright 2002 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" #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 #if (L1_AUDIO_DRIVER) #if (L1_VOICE_MEMO_AMR) extern T_AUDIO_RET audio_driver_vm_amr_play_manager (T_RV_HDR *p_message, T_AUDIO_DRIVER_SESSION *p_session); extern T_AUDIO_RET audio_driver_vm_amr_record_manager (T_RV_HDR *p_message, T_AUDIO_DRIVER_SESSION *p_session); extern T_AUDIO_RET audio_driver_midi_manager (T_RV_HDR *p_message, T_AUDIO_DRIVER_SESSION *p_session); #endif UINT8 audio_driver_message_switch(T_RV_HDR *p_message); void audio_driver_send_status (T_AUDIO_RET status, UINT8 status_type, UINT8 channel_id, T_RV_RETURN return_path); void audio_driver_init_send_status (T_AUDIO_RET status, UINT8 session_id, UINT8 channel_id, T_RV_RETURN return_path); void audio_driver_manager(T_RV_HDR *p_message); T_AUDIO_RET audio_driver_get_play_buffer(UINT8 channel_id, UINT8 **pp_buffer); T_AUDIO_RET audio_driver_play_buffer(UINT8 channel_id, UINT8 *p_buffer); UINT8 audio_driver_message_switch(T_RV_HDR *p_message) { switch (p_message->msg_id) { case AUDIO_DRIVER_START_SESSION: case AUDIO_DRIVER_STOP_SESSION: case AUDIO_DRIVER_FREE_SESSION: return(AUDIO_DRIVER_SWITCH); break; #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: case MMI_VM_AMR_RECORD_START_CON: case MMI_VM_AMR_RECORD_STOP_CON: return(AUDIO_DRIVER_VM_AMR_RECORD_SESSION_SWITCH); break; case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: case MMI_VM_AMR_PLAY_START_CON: case MMI_VM_AMR_PLAY_STOP_CON: return(AUDIO_DRIVER_VM_AMR_PLAY_SESSION_SWITCH); break; #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: case MMI_MIDI_START_CON: case MMI_MIDI_STOP_CON: return(AUDIO_DRIVER_MIDI_SESSION_SWITCH); break; #endif default: return(AUDIO_DRIVER_NONE); break; } // switch } void audio_driver_send_status (T_AUDIO_RET status, UINT8 status_type, UINT8 channel_id, T_RV_RETURN return_path) { T_AUDIO_DRIVER_STATUS *p_send_message; T_RVF_MB_STATUS mb_status = RVF_RED; while (mb_status == RVF_RED) { // allocate the message buffer mb_status = rvf_get_buf (p_audio_gbl_var->mb_external, sizeof (T_AUDIO_DRIVER_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_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); rvf_delay(RVF_MS_TO_TICKS(1000)); } } // fill the header of the message + parameters p_send_message->os_hdr.msg_id = AUDIO_DRIVER_STATUS_MSG; p_send_message->status = status; p_send_message->status_type = status_type; p_send_message->channel_id = channel_id; // 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_driver_init_send_status (T_AUDIO_RET status, UINT8 session_id, UINT8 channel_id, T_RV_RETURN return_path) { T_AUDIO_DRIVER_INIT_STATUS *p_send_message; T_RVF_MB_STATUS mb_status = RVF_RED; while (mb_status == RVF_RED) { // allocate the message buffer mb_status = rvf_get_buf (p_audio_gbl_var->mb_external, sizeof (T_AUDIO_DRIVER_INIT_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_driver_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_DRIVER_INIT_STATUS_MSG; // fill the status parameters p_send_message->status = status; p_send_message->session_id = session_id; p_send_message->channel_id = channel_id; // 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_driver_manager(T_RV_HDR *p_message) { T_AUDIO_DRIVER_SESSION *p_session; T_AUDIO_DRIVER_PARAMETER *driver_parameter; T_RV_RETURN return_path; T_RVF_MB_STATUS mb_status; UINT8 session_id, channel_id, state, j; // initialize return_path to default values return_path.callback_func=NULL; return_path.addr_id=0; // find state + extract information:channel_id or session_id + driver_parameter switch (p_message->msg_id) { // start/stop session messages have channel_id so we know the driver_session case AUDIO_DRIVER_START_SESSION: case AUDIO_DRIVER_STOP_SESSION: case AUDIO_DRIVER_FREE_SESSION: channel_id = ((T_AUDIO_DRIVER_HANDLE_SESSION *)p_message)->channel_id; p_session = &(p_audio_gbl_var->audio_driver_session[channel_id]); state = p_session->session_info.state; if (p_message->msg_id != AUDIO_DRIVER_STOP_SESSION) return_path = ((T_AUDIO_DRIVER_HANDLE_SESSION *)p_message)->return_path; else return_path = p_session->session_req.return_path; break; // messages which contain only session_id, must look for it in ACTIVE driver_session default: { switch (p_message->msg_id) { #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: session_id = AUDIO_VM_AMR_RECORD_SESSION_ID; driver_parameter = &(((T_AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION *)p_message)->driver_parameter); return_path = ((T_AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION *)p_message)->return_path; break; case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: session_id = AUDIO_VM_AMR_PLAY_SESSION_ID; driver_parameter = & (((T_AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION *)p_message)->driver_parameter); return_path = ((T_AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION *)p_message)->return_path; break; case MMI_VM_AMR_RECORD_START_CON: case MMI_VM_AMR_RECORD_STOP_CON: session_id = AUDIO_VM_AMR_RECORD_SESSION_ID; break; case MMI_VM_AMR_PLAY_START_CON: case MMI_VM_AMR_PLAY_STOP_CON: session_id = AUDIO_VM_AMR_PLAY_SESSION_ID; break; #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: session_id = AUDIO_MIDI_SESSION_ID; driver_parameter = &(((T_AUDIO_DRIVER_INIT_MIDI_SESSION *)p_message)->driver_parameter); return_path = ((T_AUDIO_DRIVER_INIT_MIDI_SESSION *)p_message)->return_path; break; case MMI_MIDI_START_CON: case MMI_MIDI_STOP_CON: session_id = AUDIO_MIDI_SESSION_ID; break; #endif } // initialize channel_id to browse all driver channels channel_id = 0; state = AUDIO_DRIVER_CHANNEL_WAIT_INIT; // look for an active session, which session_id matches the one from the message while ( (channel_id < AUDIO_DRIVER_MAX_CHANNEL)&& ((p_audio_gbl_var->audio_driver_session[channel_id].session_info.state == AUDIO_DRIVER_CHANNEL_WAIT_INIT)|| (p_audio_gbl_var->audio_driver_session[channel_id].session_req.session_id != session_id)) ) { channel_id++; } // if channel_id < MAX_CHANNEL, we found an active channel so we can derive channel_id + state if (channel_id < AUDIO_DRIVER_MAX_CHANNEL) { p_session = &(p_audio_gbl_var->audio_driver_session[channel_id]); state = p_session->session_info.state; return_path = p_session->session_req.return_path; } } break; // default } switch (state) { case AUDIO_DRIVER_CHANNEL_WAIT_INIT: { switch (p_message->msg_id) { #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: #endif { T_AUDIO_RET result; // Find a free channel channel_id = 0; while ( (p_audio_gbl_var->audio_driver_session[channel_id].session_info.state != AUDIO_DRIVER_CHANNEL_WAIT_INIT) && (channel_id < AUDIO_DRIVER_MAX_CHANNEL) ) channel_id++; if (channel_id == AUDIO_DRIVER_MAX_CHANNEL) { AUDIO_SEND_TRACE("no driver channel available", RV_TRACE_LEVEL_DEBUG_LOW); audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); return; } AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER: open channel", channel_id, RV_TRACE_LEVEL_DEBUG_LOW); // get session descriptor and fill REQ parameters p_session = &(p_audio_gbl_var->audio_driver_session[channel_id]); p_session->session_req.session_id = session_id; p_session->session_req.size = driver_parameter->buffer_size << 1;// we request 16-bit words buffers p_session->session_req.nb_buffer = driver_parameter->nb_buffer; // fill return_path parameters, may be used if next message is STOP_SESSION p_session->session_req.return_path.callback_func = return_path.callback_func; p_session->session_req.return_path.addr_id = return_path.addr_id; /************************************************************/ /* the driver must allocate the RAM buffers pointer */ /************************************************************/ mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal, sizeof(T_AUDIO_DRIVER_BUFFER_INFO)*p_session->session_req.nb_buffer, (T_RVF_BUFFER **) (&p_session->session_info.buffer)); // If insufficient resources, then report a memory error and abort. if (mb_status == RVF_RED) { audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); return; } /************************************************************/ /* the driver must allocate the RAM buffers */ /************************************************************/ for (j = 0; j < p_session->session_req.nb_buffer; j++) { mb_status = rvf_get_buf (p_audio_gbl_var->mb_audio_ffs, p_session->session_req.size, (T_RVF_BUFFER **) (&p_session->session_info.buffer[j].p_start_pointer)); // If insufficient resources, then report a memory error and abort. if (mb_status == RVF_RED) { UINT8 i; // free already allocated buffers + buffer pointer if (j > 0) { for (i = j - 1; i >= 0; i--) rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer[i].p_start_pointer); } rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer); audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); return; } // initialize parameters p_session->session_info.buffer[j].size = p_session->session_req.size; AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER: allocate buffer", p_session->session_info.buffer[j].p_start_pointer, RV_TRACE_LEVEL_DEBUG_LOW); } // info parameters (state must be changed before driver specific functions call p_session->session_info.index_l1 = 0; p_session->session_info.index_appli = 0; p_session->session_info.stop_request = 0; // conversion of parameters + prepare l1 start message switch(p_message->msg_id) { #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: result=audio_driver_vm_amr_record_manager(p_message,p_session); break; case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: result=audio_driver_vm_amr_play_manager(p_message,p_session); break; #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: result=audio_driver_midi_manager(p_message,p_session); break; #endif } // check L1 msg allocation was successfull if (result != AUDIO_OK) { AUDIO_SEND_TRACE("AUDIO DRIVER MANAGER: L1 msg allocation failed", RV_TRACE_LEVEL_DEBUG_LOW); audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); return; } // state (must be changed after driver specific functions calls) p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_START; audio_driver_init_send_status(AUDIO_OK, session_id, channel_id, return_path); } //case AUDIO_DRIVER_INIT_..._SESSION: break; case AUDIO_DRIVER_START_SESSION: audio_driver_error_trace(AUDIO_ERROR_START_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); break; case AUDIO_DRIVER_STOP_SESSION: audio_driver_error_trace(AUDIO_ERROR_STOP_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); break; case AUDIO_DRIVER_FREE_SESSION: audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); break; } // switch (p_message->msg_id) } //case AUDIO_DRIVER_CHANNEL_WAIT_INIT: break; case AUDIO_DRIVER_CHANNEL_WAIT_START: { switch (p_message->msg_id) { case AUDIO_DRIVER_START_SESSION: { T_AUDIO_RET result; // fill notification parameters p_session->session_req.return_path.callback_func = return_path.callback_func; p_session->session_req.return_path.addr_id = return_path.addr_id; // send l1 message switch(p_session->session_req.session_id) { #if (L1_VOICE_MEMO_AMR) case AUDIO_VM_AMR_RECORD_SESSION_ID: result=audio_driver_vm_amr_record_manager(p_message,p_session); break; case AUDIO_VM_AMR_PLAY_SESSION_ID: result=audio_driver_vm_amr_play_manager(p_message,p_session); break; #endif #if (L1_MIDI == 1) case AUDIO_MIDI_SESSION_ID: result=audio_driver_midi_manager(p_message,p_session); break; #endif } if (result != AUDIO_OK) { audio_driver_error_trace(AUDIO_ERROR_L1_START_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); return; } // change state p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_START_CON; } break; case AUDIO_DRIVER_STOP_SESSION: { // deallocate buffers for(j=0; j<p_session->session_req.nb_buffer; j++) { mb_status=rvf_free_buf((T_RVF_BUFFER *)(p_session->session_info.buffer[j].p_start_pointer)); AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER MANAGER: deallocate buffer", j, RV_TRACE_LEVEL_DEBUG_LOW); if (mb_status != RVF_GREEN) AUDIO_SEND_TRACE_PARAM("can't deallocate buffer", j, RV_TRACE_LEVEL_ERROR); } // Deallocate buffers pointer rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer); // deallocate l1 message audio_deallocate_l1_message(p_session->session_req.p_l1_send_message); // send status OK audio_driver_send_status(AUDIO_OK,AUDIO_STOP_STATUS,channel_id,return_path); // change state p_session->session_info.state=AUDIO_DRIVER_CHANNEL_WAIT_INIT; } break; #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: #endif audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); audio_driver_init_send_status(AUDIO_ERROR, session_id, 0, return_path); break; case AUDIO_DRIVER_FREE_SESSION: audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); break; } // switch } //case AUDIO_DRIVER_CHANNEL_WAIT_START: break; case AUDIO_DRIVER_CHANNEL_WAIT_START_CON: { switch (p_message->msg_id) { #if (L1_VOICE_MEMO_AMR) case MMI_VM_AMR_RECORD_START_CON: case MMI_VM_AMR_PLAY_START_CON: #endif #if (L1_MIDI == 1) case MMI_MIDI_START_CON: #endif // change state p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_STOP; break; case AUDIO_DRIVER_STOP_SESSION: // change state p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_START_CON_TO_STOP; break; #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: #endif audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); break; case AUDIO_DRIVER_START_SESSION: audio_driver_error_trace(AUDIO_ERROR_START_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); break; case AUDIO_DRIVER_FREE_SESSION: audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); break; } // switch } //case AUDIO_DRIVER_CHANNEL_WAIT_START_CON: break; case AUDIO_DRIVER_CHANNEL_WAIT_STOP: { switch (p_message->msg_id) { case AUDIO_DRIVER_STOP_SESSION: { // 1st stop request if (p_session->session_info.stop_request == 0) { T_AUDIO_RET result; // send l1 message STOP_REQ switch(p_session->session_req.session_id) { #if (L1_VOICE_MEMO_AMR) case AUDIO_VM_AMR_RECORD_SESSION_ID: result=audio_driver_vm_amr_record_manager(p_message,p_session); break; case AUDIO_VM_AMR_PLAY_SESSION_ID: result=audio_driver_vm_amr_play_manager(p_message,p_session); break; #endif #if (L1_MIDI == 1) case AUDIO_MIDI_SESSION_ID: result=audio_driver_midi_manager(p_message,p_session); break; #endif } // allocate or send L1 msg went wrong if (result != AUDIO_OK) { audio_driver_error_trace(AUDIO_ERROR_L1_STOP_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); return; } // STOP has been requested, no longer accept it p_session->session_info.stop_request = 1; } else { audio_driver_error_trace(AUDIO_ERROR_STOP_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); } } break; #if (L1_VOICE_MEMO_AMR) case MMI_VM_AMR_RECORD_STOP_CON: { // send last notification T_AUDIO_DRIVER_LAST_NOTIFICATION *p_status_message; // Allocate the Riviera buffer mb_status = RVF_RED; while (mb_status == RVF_RED) { mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal, sizeof (T_AUDIO_DRIVER_LAST_NOTIFICATION), (T_RVF_BUFFER **) (&p_status_message)); // If insufficient resources, then report a memory error and abort. if (mb_status == RVF_RED) { // the memory is insufficient to continue the non regression test audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); rvf_delay(RVF_MS_TO_TICKS(1000)); } } // Fill the message ID p_status_message->header.msg_id = AUDIO_DRIVER_LAST_NOTIFICATION_MSG; // fill parameters p_status_message->channel_id = channel_id; p_status_message->recorded_size = ((T_MMI_VM_AMR_RECORD_CON *)p_message)->recorded_size - SC_VM_AMR_END_MASK_SIZE; p_status_message->p_buffer = (UINT16 *)p_session->session_info.buffer[p_session->session_info.index_l1].p_start_pointer; if (return_path.callback_func == NULL) rvf_send_msg (return_path.addr_id, p_status_message); else { // call the callback function (*(return_path.callback_func))((void *)(p_status_message)); rvf_free_buf((T_RVF_BUFFER *)p_status_message); } // change state p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_FREE; } break; #endif // #if (L1_VOICE_MEMO_AMR) #if (L1_VOICE_MEMO_AMR) case MMI_VM_AMR_PLAY_STOP_CON: #endif #if (L1_MIDI == 1) case MMI_MIDI_STOP_CON: #endif { // deallocate buffers for (j = 0; j < p_session->session_req.nb_buffer; j++) { mb_status = rvf_free_buf ((T_RVF_BUFFER *) (p_session->session_info.buffer[j].p_start_pointer)); AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER MANAGER: deallocate buffer", j, RV_TRACE_LEVEL_DEBUG_LOW); if (mb_status != RVF_GREEN) AUDIO_SEND_TRACE_PARAM("can't deallocate buffer", j, RV_TRACE_LEVEL_ERROR); } // Deallocate buffers pointer rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer); audio_driver_send_status (AUDIO_OK, AUDIO_STOP_STATUS, channel_id, return_path); // change state p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_INIT; } break; #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: #endif audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); break; case AUDIO_DRIVER_START_SESSION: audio_driver_error_trace(AUDIO_ERROR_START_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); break; case AUDIO_DRIVER_FREE_SESSION: audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); break; } //switch } //case AUDIO_DRIVER_CHANNEL_WAIT_STOP: break; case AUDIO_DRIVER_CHANNEL_WAIT_START_CON_TO_STOP: { T_AUDIO_RET result = AUDIO_OK; switch (p_message->msg_id) { #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: #endif audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); return; break; case AUDIO_DRIVER_START_SESSION: audio_driver_error_trace(AUDIO_ERROR_START_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); return; break; case AUDIO_DRIVER_STOP_SESSION: audio_driver_error_trace(AUDIO_ERROR_STOP_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); return; break; case AUDIO_DRIVER_FREE_SESSION: audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); return; break; #if (L1_VOICE_MEMO_AMR) case MMI_VM_AMR_RECORD_START_CON: // send L1 stop msg result=audio_driver_vm_amr_record_manager(p_message, p_session); break; case MMI_VM_AMR_PLAY_START_CON: // send L1 stop msg result=audio_driver_vm_amr_play_manager(p_message, p_session); break; #endif #if (L1_MIDI == 1) case MMI_MIDI_START_CON: // send L1 stop msg result=audio_driver_midi_manager(p_message,p_session); break; #endif } if (result != AUDIO_OK) { audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); return; } else { // next state should be WAIT_STOP_CON, which is WAIT_STOP + stop_request == 1 p_session->session_info.stop_request = 1; // change state p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_STOP; } } break; case AUDIO_DRIVER_CHANNEL_WAIT_FREE: { switch (p_message->msg_id) { case AUDIO_DRIVER_FREE_SESSION: { // deallocate buffers for (j = 0; j < p_session->session_req.nb_buffer; j++) { mb_status = rvf_free_buf ((T_RVF_BUFFER *) (p_session->session_info.buffer[j].p_start_pointer)); AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER MANAGER: deallocate buffer", j, RV_TRACE_LEVEL_DEBUG_LOW); if (mb_status != RVF_GREEN) AUDIO_SEND_TRACE_PARAM("can't deallocate buffer", j, RV_TRACE_LEVEL_ERROR); } // Deallocate buffers pointer rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer); audio_driver_send_status (AUDIO_OK, AUDIO_FREE_STATUS, channel_id, return_path); // change state p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_INIT; } break; #if (L1_VOICE_MEMO_AMR) case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: #endif #if (L1_MIDI == 1) case AUDIO_DRIVER_INIT_MIDI_SESSION: #endif audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); break; case AUDIO_DRIVER_START_SESSION: audio_driver_error_trace(AUDIO_ERROR_START_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); break; case AUDIO_DRIVER_STOP_SESSION: audio_driver_error_trace(AUDIO_ERROR_STOP_EVENT); audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); break; } // switch } break; } } #endif // (L1_AUDIO_DRIVER) #endif // #ifdef RVM_AUDIO_MAIN_SWE