FreeCalypso > hg > fc-magnetite
view src/cs/layer1/audio_cust0/l1audio_cust.c @ 347:78d1df0b8487
aci2: AT%CBC and AT@CHARGE implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 16 Dec 2017 00:37:43 +0000 |
parents | b870b6a44d31 |
children |
line wrap: on
line source
/************* Revision Controle System Header ************* * GSM Layer 1 software * L1AUDIO_CUST.C * * Filename l1audio_cust.c * Copyright 2003 (C) Texas Instruments * ************* Revision Controle System Header *************/ /************************************/ /* Include files... */ /************************************/ #include "l1_macro.h" #include "l1_confg.h" #if (AUDIO_TASK == 1) #include "l1_types.h" #include "sys_types.h" #if (CODE_VERSION == SIMULATION) && (AUDIO_SIMULATION) #include "tc_defs.h" #include <stdlib.h> #include <string.h> #include "iq.h" // Debug / Init hardware ("eva3.lib") #include "l1_ver.h" #include "l1_const.h" #include "l1_signa.h" #if TESTMODE #include "l1tm_defty.h" #endif #include "l1audio_const.h" #include "l1audio_cust.h" #include "l1audio_defty.h" #include "l1audio_msgty.h" #include "l1audio_varex.h" #include "l1audio_signa.h" #if (L1_GTT == 1) #include "l1gtt_const.h" #include "l1gtt_defty.h" #endif #if (L1_MP3 == 1) #include "l1mp3_defty.h" #endif #if (L1_MIDI == 1) #include "l1midi_defty.h" #endif #if (L1_AAC == 1) #include "l1aac_defty.h" #endif #include "l1_defty.h" #include "cust_os.h" #include "l1_msgty.h" #include "l1_varex.h" #include "l1_mftab.h" #include "l1_tabs.h" #include "l1_ctl.h" #include "l1_time.h" #include "l1_scen.h" #if L1_GPRS #include "l1p_cons.h" #include "l1p_msgt.h" #include "l1p_deft.h" #include "l1p_vare.h" #include "l1p_tabs.h" #include "l1p_macr.h" #include "l1p_sign.h" #endif #include "sim_cfg.h" #include "sim_cons.h" #include "sim_def.h" #include "sim_var.h" #include "sim_prot.h" #include "audio_sim_cons.h" #include "audio_sim_def.h" #include "mmi_simul.h" #include "audio_sim_var.h" #else // Layer1 and debug include files. #include <ctype.h> #include <string.h> #include <math.h> #include "l1_ver.h" #include "l1_const.h" #include "l1_signa.h" #if TESTMODE #include "l1tm_defty.h" #endif #include "l1audio_const.h" #include "l1audio_cust.h" #include "l1audio_defty.h" #include "l1audio_msgty.h" #include "l1audio_varex.h" #include "l1audio_signa.h" #if (L1_GTT == 1) #include "l1gtt_const.h" #include "l1gtt_defty.h" #endif #if (L1_MP3 == 1) #include "l1mp3_defty.h" #endif #if (L1_MIDI == 1) #include "l1midi_defty.h" #endif #include "l1_defty.h" #include "cust_os.h" #include "l1_msgty.h" #include "tpudrv.h" // TPU drivers. ("eva3.lib") #include "l1_varex.h" #include "l1_proto.h" #include "l1_mftab.h" #include "l1_tabs.h" #include "mem.h" #include "armio.h" #include "timer.h" #include "timer1.h" #include "dma.h" #include "inth.h" #include "ulpd.h" #include "rhea_arm.h" #include "clkm.h" // Clockm ("eva3.lib") #include "l1_ctl.h" #include "l1_time.h" #if L2_L3_SIMUL #include "l1_scen.h" #endif #if (AUDIO_L1_STANDALONE) #include "mmi_simul.h" #endif #if (OP_RIV_AUDIO == 1) #if (MELODY_E1) || (VOICE_MEMO) || (SPEECH_RECO) || (L1_EXT_AUDIO_MGT) || (MELODY_E2) #include "rv_general.h" #include "audio_api.h" #include "audio_structs_i.h" #include "audio_var_i.h" #include "audio_ffs_i.h" #include "audio_const_i.h" #include "audio_error_hdlr_i.h" #include "ffs/ffs_api.h" #include "audio_macro_i.h" #endif #endif #endif #include "l1_trace.h" //extern void L1_trace_string(char *s); //extern void L1_trace_char (char s); /**************************************/ /* Prototypes for L1 ASYNCH task */ /**************************************/ #if (SPEECH_RECO) void Cust_srback_save_model (UWORD8 database, UWORD8 index, API *RAM_address); void Cust_srback_save_speech (UWORD8 database, UWORD8 index, UWORD16 *start_buffer, UWORD16 *stop_buffer, UWORD16 *start_speech, UWORD16 *stop_speech); void Cust_srback_load_model (UWORD8 database, UWORD8 index, API *RAM_address); #endif UWORD8 Cust_get_pointer (UWORD16 **ptr, UWORD16 *buffer_size, UWORD8 session_id); #if (L1_EXT_AUDIO_MGT) void Cust_ext_audio_mgt_hisr(void); #endif void l1a_bt_audio_noti_process(void); /**************************************/ /* External prototypes */ /**************************************/ #if (OP_RIV_AUDIO == 1) #if (SPEECH_RECO) extern void audio_sr_error_trace(UINT8 error_id); #endif #endif /***************************************/ /* Global variables for MP3 management */ /***************************************/ #if (L1_MP3 == 1) UWORD8 mp3_tempbuf_idx; UWORD16 Cust_get_pointer_mp3_last_buffer_size; BOOL Cust_get_pointer_mp3_buffer_last; #endif /***************************************/ /* Global variables for AAC management */ /***************************************/ #if (L1_AAC == 1) UWORD8 aac_tempbuf_idx; UWORD16 Cust_get_pointer_aac_last_buffer_size; BOOL Cust_get_pointer_aac_buffer_last; #endif /* * FreeCalypso TCS211 reconstruction: the following unused trivial * function has been reconstruction in order to aid the diffing * of the functions that follow. */ void audio_test_callback(void *buffer) { rvf_free_buf(buffer); } #if (SPEECH_RECO) /*-------------------------------------------------------*/ /* Cust_srback_save_model() */ /*-------------------------------------------------------*/ /* */ /* Parameters : database */ /* index */ /* RAM_address */ /* */ /* Return : none */ /* */ /* Description : save the model into a database. */ /* */ /*-------------------------------------------------------*/ void Cust_srback_save_model (UWORD8 database, UWORD8 index, API *RAM_address) { #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) UWORD16 model_size; UWORD16 *ptr_dst; UWORD8 frame_size; // initialize the pointer to the database ptr_dst = sr_mmi_database[database][index].model; // look the size of the model in model frame unit (16 words unit) model_size = *RAM_address++; // save the header of the model *ptr_dst++ = model_size; while( (model_size != 0) && (l1_srback_com.emergency_stop == FALSE) ) { frame_size = SC_SR_MODEL_FRAME_SIZE; while ( (frame_size != 0) && (l1_srback_com.emergency_stop == FALSE) ) { *ptr_dst++ = *RAM_address++; frame_size--; } model_size--; } #endif #if (OP_RIV_AUDIO == 1) T_FFS_FD ffs_fd; UWORD16 model_size; UWORD8 i; char *p_model_path; if (p_audio_gbl_var->speech_reco.sr_enroll.state != AUDIO_SR_ENROLL_IDLE) { ffs_fd = p_audio_gbl_var->speech_reco.sr_enroll.sr_ffs_fd; } else if (p_audio_gbl_var->speech_reco.sr_update.state != AUDIO_SR_UPDATE_IDLE) { /* reach the path of the corresponding model */ p_model_path = p_audio_gbl_var->speech_reco.sr_update.p_database; for (i=0; i<index; i++) { p_model_path += AUDIO_PATH_NAME_MAX_SIZE; } ffs_fd = ffs_open(p_model_path, FFS_O_CREATE | FFS_O_WRONLY | FFS_O_TRUNC | FFS_O_APPEND); if ( ffs_fd <= 0) { audio_sr_error_trace(AUDIO_ENTITY_MODEL_NO_SAVED); return; } } /* look the size of the model in model frame unit (16 words unit) */ model_size = ((*RAM_address)<<1); model_size *= SC_SR_MODEL_FRAME_SIZE; /* save the model in flash */ if (ffs_write(ffs_fd, (void *)RAM_address, model_size) <= EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_MODEL_NO_SAVED); } /* close the model file flash */ if (ffs_close(ffs_fd) != EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_MODEL_NO_SAVED); } #endif // OP_RIV_AUDIO } /*-------------------------------------------------------*/ /* Cust_srback_save_speech() */ /*-------------------------------------------------------*/ /* */ /* Parameters : database */ /* index */ /* start_buffer */ /* stop_buffer */ /* start_speech */ /* stop_speech */ /* */ /* Return : none */ /* */ /* Description : save the speech from a circular buffer */ /* to a database. And add the end VM mask */ /* */ /*-------------------------------------------------------*/ void Cust_srback_save_speech (UWORD8 database, UWORD8 index, UWORD16 *start_buffer, UWORD16 *stop_buffer, UWORD16 *start_speech, UWORD16 *stop_speech) { #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) UWORD16 *ptr_dst; // initialize the pointer to the database ptr_dst = sr_mmi_database[database][index].speech; // The speech samples can be in two positions in the circular buffer: // Position 1: // [.............XXXXXXXXXXXXX.............] // ^ ^ ^ ^ // | | | | // start_buffer start_speech stop_speech stop_buffer if (start_speech < stop_speech) { while ( (start_speech < stop_speech) && (l1_srback_com.emergency_stop == FALSE) ) { *ptr_dst++ = *start_speech++; } // Write the end VM mask *ptr_dst = SC_VM_END_MASK; } else // Position 2: // [XXXXXXXXXXXX..............XXXXXXXXXXXXX] // ^ ^ ^ ^ // | | | | // start_buffer stop_speech start_speech stop_buffer { while ( (start_speech < stop_buffer) && (l1_srback_com.emergency_stop == FALSE) ) { *ptr_dst++ = *start_speech++; } while ( (start_buffer < stop_speech) && (l1_srback_com.emergency_stop == FALSE) ) { *ptr_dst++ = *start_buffer++; } // Write the end VM mask *ptr_dst = SC_VM_END_MASK; } #endif #if (OP_RIV_AUDIO == 1) T_FFS_FD ffs_fd; UWORD16 speech_size; char *p_model_path, sr_speech_path[AUDIO_SR_PATH_NAME_MAX_SIZE]; UWORD8 i; if (p_audio_gbl_var->speech_reco.sr_enroll.state !=AUDIO_SR_ENROLL_IDLE ) { ffs_fd = p_audio_gbl_var->speech_reco.sr_enroll.voice_ffs_fd; } else if (p_audio_gbl_var->speech_reco.sr_update.state != AUDIO_SR_UPDATE_IDLE) { /* reach the path of the corresponding model */ p_model_path = p_audio_gbl_var->speech_reco.sr_update.p_database; for (i=0; i<index; i++) { p_model_path += AUDIO_PATH_NAME_MAX_SIZE; } /* build the speech path name */ speech_size = ( strlen(p_model_path)- 3); strncpy(sr_speech_path, p_model_path, speech_size); sr_speech_path[speech_size] = 0; ffs_fd = ffs_open(sr_speech_path, FFS_O_CREATE | FFS_O_WRONLY | FFS_O_TRUNC | FFS_O_APPEND); if (ffs_fd <= 0) { audio_sr_error_trace(AUDIO_ENTITY_SPEECH_NO_SAVED); return; } } // The speech samples can be in two positions in the circular buffer: // Position 1: // [.............XXXXXXXXXXXXX.............] // ^ ^ ^ ^ // | | | | // start_buffer start_speech stop_speech stop_buffer if (start_speech < stop_speech) { /* Calculate the size of the speech file */ speech_size = (stop_speech - start_speech)<<1; /* save the model in flash */ if (ffs_write(ffs_fd, (void *)start_speech, speech_size) <= EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_SPEECH_NO_SAVED); } } else // Position 2: // [XXXXXXXXXXXX..............XXXXXXXXXXXXX] // ^ ^ ^ ^ // | | | | // start_buffer stop_speech start_speech stop_buffer { /* Calculate the size of the speech file */ speech_size = (stop_buffer - start_speech)<<1; /* save the model in flash */ if (ffs_write(ffs_fd, (void *)start_speech, speech_size) <= EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_SPEECH_NO_SAVED); } /* Calculate the size of the speech file */ speech_size = (stop_speech - start_buffer)<<1; /* save the model in flash */ if (ffs_write(ffs_fd, (void *)start_speech, speech_size) <= EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_SPEECH_NO_SAVED); } } // Write the end VM mask speech_size = SC_VM_END_MASK; if (ffs_write(ffs_fd, (void *)(&speech_size), 2) <= EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_MODEL_NO_SAVED); } /* close the speech file flash */ if (ffs_close(ffs_fd) != EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_MODEL_NO_SAVED); } #endif // OP_RIV_AUDIO } /*-------------------------------------------------------*/ /* Cust_srback_load_model() */ /*-------------------------------------------------------*/ /* */ /* Parameters : database */ /* index */ /* RAM_address */ /* */ /* Return : none */ /* */ /* Description : load the model into the API. */ /* */ /*-------------------------------------------------------*/ void Cust_srback_load_model (UWORD8 database, UWORD8 index, API *RAM_address) { #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) UWORD16 model_size; UWORD16 *ptr_src; UWORD8 frame_size; // initialize the pointer to the database ptr_src = sr_mmi_database[database][index].model; // look the size of the model in model frame unit (16 words unit) model_size = *ptr_src++; // save the header of the model *RAM_address++ = model_size; while( (model_size != 0) && (l1_srback_com.emergency_stop == FALSE) ) { frame_size = SC_SR_MODEL_FRAME_SIZE; while ( (frame_size != 0) && (l1_srback_com.emergency_stop == FALSE) ) { *RAM_address++ = *ptr_src++; frame_size--; } model_size--; } #endif #if (OP_RIV_AUDIO == 1) char *p_model_path; T_FFS_FD ffs_fd; UWORD8 i; if (p_audio_gbl_var->speech_reco.sr_reco.state !=AUDIO_SR_RECO_IDLE ) { p_model_path = p_audio_gbl_var->speech_reco.sr_reco.p_database; } else if (p_audio_gbl_var->speech_reco.sr_update.state != AUDIO_SR_UPDATE_IDLE) { p_model_path = p_audio_gbl_var->speech_reco.sr_update.p_database; } /* reach the path of the corresponding model */ for (i=0; i<index; i++) { p_model_path += AUDIO_PATH_NAME_MAX_SIZE; } /* open the model file flash */ ffs_fd = ffs_open(p_model_path, FFS_O_RDONLY); if ( ffs_fd <= 0) { audio_sr_error_trace(AUDIO_ENTITY_MODEL_NO_LOAD); return; } /* download the model to the API buffer */ if (ffs_read(ffs_fd, (void *)RAM_address, (SC_SR_MODEL_API_SIZE<<1)) <= EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_MODEL_NO_LOAD); } /* close the model file flash */ if (ffs_close(ffs_fd) != EFFS_OK) { audio_sr_error_trace(AUDIO_ENTITY_MODEL_NO_LOAD); } #endif // OP_RIV_AUDIO } #endif // SPEECH_RECO /*-------------------------------------------------------*/ /* Cust_get_pointer */ /*-------------------------------------------------------*/ /* */ /* Parameters : ptr */ /* buffer_size */ /* session_id */ /* */ /* Return : error_id : */ /* DATA_AVAILABLE: 0, no error occured */ /* SESSION_ERROR: 1, wrong session id */ /* POINTER_ERROR: 2, wrong ptr */ /* DATA_AVAIL_ERROR: 3, no more data */ /* available */ /* DATA_LAST: 4, last buffer available */ /* buffer_size */ /* ptr */ /* */ /* Description : */ /* The L1 calls this function to request new data buffer */ /* (requested size: buffer_size). This function returns */ /* the description of the new data buffer */ /* (start address: ptr and the size: buffer_size) */ /* Moreover, the L1 indicates the position of the last */ /* data used via the ptr argument. */ /* Note that this function can be returns an error. */ /* */ /*-------------------------------------------------------*/ UWORD8 Cust_get_pointer (UWORD16 **ptr, UWORD16 *buffer_size, UWORD8 session_id) { #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) UWORD8 database_id, word_index; switch (session_id & 0x0F) { #if (MELODY_E1) // Melody E1 0 case 0: { if (*ptr == NULL) { *ptr = (UWORD16 *)&melody_0; *buffer_size = SC_MELODY_0_SCORE_SIZE>>1; } else { *buffer_size = SC_MELODY_0_SCORE_SIZE>>1; } return(DATA_AVAILABLE); } //omaps00090550 break; // Melody E1 1 case 1: { if (*ptr == NULL) { *ptr = (UWORD16 *)&melody_1; *buffer_size = SC_MELODY_1_SCORE_SIZE>>1; } else { *buffer_size = SC_MELODY_1_SCORE_SIZE>>1; } return(DATA_AVAILABLE); } //omaps00090550 break; #endif // MELODY_E1 #if (VOICE_MEMO) // Voice memo play case 2: { if (*ptr == NULL) { *ptr = (UWORD16 *)&voice_memo_buffer; *buffer_size = SC_VM_BUFFER_SIZE>>1; } else { *buffer_size = (SC_VM_BUFFER_SIZE>>1) + 1; } return(DATA_AVAILABLE); } //omaps00090550 break; // Voice memo record case 3: { if (*ptr == NULL) { *ptr = (UWORD16 *)&voice_memo_buffer; *buffer_size = SC_VM_BUFFER_SIZE>>1; } else { *buffer_size = (SC_VM_BUFFER_SIZE>>1) + 1; } return(DATA_AVAILABLE); } //omaps00090550 break; #endif // VOICE_MEMO #if (SPEECH_RECO) case 4: { database_id = 0; word_index = (session_id & 0xF0)>>4; *ptr = (UWORD16 *)&(sr_mmi_database[database_id][word_index].speech); *buffer_size = SC_SR_MMI_DB_SPEECH_SIZE; return(DATA_AVAILABLE); } break; case 5: { database_id = 1; word_index = (session_id & 0xF0)>>4; *ptr = (UWORD16 *)&(sr_mmi_database[database_id][word_index].speech); *buffer_size = SC_SR_MMI_DB_SPEECH_SIZE; return(DATA_AVAILABLE); } break; #endif // SPEECH_RECO #if (MELODY_E2 && FIR) // Melody E2 // Tchaikowski case 6: { if (*ptr == NULL) { *ptr = (UWORD16 *)&Tchaikowski_danse_russe; *buffer_size = TCHAIKOWSKI_DANSE_RUSSE>>1; } else { *buffer_size = TCHAIKOWSKI_DANSE_RUSSE>>1; } return(DATA_AVAILABLE); } break; // Small melody case 7: { if (*ptr == NULL) { *ptr = (UWORD16 *)&Small_melody_E2; *buffer_size = SMALL_MELODY_E2>>1; } else { *buffer_size = SMALL_MELODY_E2>>1; } return(DATA_AVAILABLE); } break; // CPU load case 8: { if (*ptr == NULL) { *ptr = (UWORD16 *)&Cpu_load_E2; *buffer_size = CPU_LOAD_E2>>1; } else { *buffer_size = CPU_LOAD_E2>>1; } return(DATA_AVAILABLE); } break; // USA hymn case 9: { if (*ptr == NULL) { *ptr = (UWORD16 *)&Usa_E2; *buffer_size = USA_E2>>1; } else { *buffer_size = USA_E2>>1; } return(DATA_AVAILABLE); } break; #endif // MELODY_E2 #if (L1_VOICE_MEMO_AMR) // Voice memo amr play case 10: { if (*ptr == NULL) { *ptr = (UWORD16 *)&voice_memo_buffer; *buffer_size = SC_VM_BUFFER_SIZE>>1; } else { *buffer_size = (SC_VM_BUFFER_SIZE>>1) + 1; } return(DATA_AVAILABLE); } //omaps00090550 break; // Voice memo record case 11: { if (*ptr == NULL) { *ptr = (UWORD16 *)&voice_memo_buffer; *buffer_size = SC_VM_BUFFER_SIZE>>1; } else { *buffer_size = (SC_VM_BUFFER_SIZE>>1) + 1; } return(DATA_AVAILABLE); } //omaps00090550 break; #endif // L1_VOICE_MEMO_AMR #if (L1_MIDI == 1) // MIDI case 12: { extern struct MIDI_FILE midi_file; UWORD8 **ptr_char=(UWORD8 **)ptr; static UWORD8 *last_ptr; if(*ptr_char==NULL) { midi_file_offset=0; *ptr_char=&(midi_file.midi_file_buffer[0]); last_ptr=*ptr_char; // All MIDI file available due to SMF1 format constraints // For SMF0, *buffer_size should be set to MIDI_BUFFER_SIZE *buffer_size=midi_file.midi_file_size; return DATA_LAST; } else { *buffer_size=MIDI_BUFFER_SIZE; *ptr_char=last_ptr+MIDI_BUFFER_SIZE; // Check if pointer is out of bounds if(*ptr_char > &(midi_file.midi_file_buffer[0])+midi_file.midi_file_size-1) { *ptr_char=&(midi_file.midi_file_buffer[0]); return DATA_AVAIL_ERROR; } // Check if it's the last valid buffer if((*ptr_char+*buffer_size) > &(midi_file.midi_file_buffer[0])+midi_file.midi_file_size-1) { *buffer_size=MIDI_BUFFER_SIZE-(UWORD16)(*ptr_char+MIDI_BUFFER_SIZE-&(midi_file.midi_file_buffer[0])-midi_file.midi_file_size+1); // Update offset in the MIDI file midi_file_offset+=*ptr_char-last_ptr; last_ptr=*ptr_char; return DATA_LAST; } else { // Update offset in the MIDI file midi_file_offset+=*ptr_char-last_ptr; last_ptr=*ptr_char; return DATA_AVAILABLE; } } } #endif // L1_MIDI #if L1_PCM_EXTRACTION case 13: { *ptr = (UWORD16 *)&pcm_download_buffer; *buffer_size = SC_PCM_DOWNLOAD_BUFFER_SIZE; return DATA_AVAILABLE; } //omaps00090550 break; case 14: { *ptr = (UWORD16 *)&pcm_upload_buffer; *buffer_size = SC_PCM_UPLOAD_BUFFER_SIZE; return DATA_AVAILABLE; } //omaps00090550 break; #endif /* L1_PCM_EXTRACTION */ default: { return(SESSION_ERROR); } //omaps00090550 break; } #endif #if (OP_RIV_AUDIO == 1) #if (MELODY_E1) || (VOICE_MEMO) || (MELODY_E2) || (L1_VOICE_MEMO_AMR) || (L1_EXT_AUDIO_MGT) UWORD8 index_l1, *current_ptr_8; UWORD16 *current_ptr, *size_ptr, *end_ptr; UWORD32 current, end; T_AUDIO_FFS_SESSION *p_session; #if (L1_AUDIO_DRIVER == 1) T_AUDIO_DRIVER_SESSION *p_driver_session; UINT8 channel_id; xSignalHeaderRec *msg; /* special handling for features in driver */ if ((session_id == AUDIO_VM_AMR_RECORD_SESSION_ID) || (session_id == AUDIO_VM_AMR_PLAY_SESSION_ID)) { channel_id = 0; /* find active channel_id associated to session_id */ 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++; } /* get driver session */ p_driver_session = &(p_audio_gbl_var->audio_driver_session[channel_id]); /* first buffer, index_l1 = 0 */ if (*ptr == NULL) { *ptr = (UWORD16 *)(p_driver_session->session_info.buffer[0].p_start_pointer); *buffer_size = (p_driver_session->session_info.buffer[0].size >> 1); return(DATA_AVAILABLE); } /* following buffers */ else { /* prepare notification */ msg = os_alloc_sig(sizeof(T_L1_AUDIO_DRIVER_IND)); DEBUGMSG(status,NU_ALLOC_ERR) msg->SignalCode = L1_AUDIO_DRIVER_IND; ((T_L1_AUDIO_DRIVER_IND *)msg->SigP)->channel_id = channel_id; ((T_L1_AUDIO_DRIVER_IND *)msg->SigP)->p_buffer = NULL; /* fill message with current buffer for record */ index_l1 = p_driver_session->session_info.index_l1; if (session_id == AUDIO_VM_AMR_RECORD_SESSION_ID) ((T_L1_AUDIO_DRIVER_IND *)msg->SigP)->p_buffer = (UWORD16 *)p_driver_session->session_info.buffer[index_l1].p_start_pointer; /* give new buffer = index_l1++ % nb_buffer */ p_driver_session->session_info.index_l1++; if ((p_driver_session->session_info.index_l1) == (p_driver_session->session_req.nb_buffer)) p_driver_session->session_info.index_l1 =(UINT8)( 0);//omaps /* Update new current buffer parameters */ index_l1 = (UWORD8)(p_driver_session->session_info.index_l1);//oamps *ptr = (UWORD16 *)(p_driver_session->session_info.buffer[index_l1].p_start_pointer); *buffer_size = (p_driver_session->session_info.buffer[index_l1].size >> 1); // Send confirmation message... os_send_sig(msg, L1C1_QUEUE); DEBUGMSG(status,NU_SEND_QUEUE_ERR) return (DATA_AVAILABLE); } } /* Other features */ else { #endif // L1_AUDIO_DRIVER p_session = &(p_audio_gbl_var->audio_ffs_session[session_id]); switch (p_session->session_info.cust_get_pointer_state) { case AUDIO_CUST_GET_POINTER_INIT: { /* the first buffer, the index_l1 is already OK so the index_l1 doesn't change */ index_l1 = p_session->session_info.index_l1; *ptr = (UWORD16 *)(p_session->session_info.buffer[index_l1].p_start_pointer); *buffer_size = (p_session->session_info.buffer[index_l1].size>>1); p_session->session_info.cust_get_pointer_state = AUDIO_CUST_GET_POINTER_NORMAL; break; } case AUDIO_CUST_GET_POINTER_NORMAL: { /* in loopback mode, when the melody restarts, the L1 pointer management is different */ if ( (*buffer_size == 0) && (p_session->session_req.loop_mode == TRUE) ) { p_session->session_info.cust_get_pointer_state = AUDIO_CUST_GET_POINTER_LOOP; break; } /* The index_l1 needs to be changed */ p_session->session_info.index_l1++; if (p_session->session_info.index_l1 == AUDIO_MAX_FFS_BUFFER_PER_SESSION) { p_session->session_info.index_l1 = 0; } index_l1 = p_session->session_info.index_l1; *ptr = (UWORD16 *)(p_session->session_info.buffer[index_l1].p_start_pointer); *buffer_size = (p_session->session_info.buffer[index_l1].size>>1); break; } case AUDIO_CUST_GET_POINTER_LOOP: { /* in loopback mode, the next melody data is contiguous to the first */ /* if it's the end of the buffer , we use the next buffer */ index_l1 = p_session->session_info.index_l1; current_ptr = (UWORD16 *)(*ptr); current_ptr_8 = (UWORD8 *)(*ptr); end_ptr = (UWORD16 *)(p_session->session_info.buffer[index_l1].p_stop_pointer); if ( current_ptr >= end_ptr ) { p_session->session_info.index_l1++; if (p_session->session_info.index_l1 == AUDIO_MAX_FFS_BUFFER_PER_SESSION) { p_session->session_info.index_l1 = 0; } index_l1 = p_session->session_info.index_l1; *ptr = (UWORD16 *)(p_session->session_info.buffer[index_l1].p_start_pointer); *buffer_size = (p_session->session_info.buffer[index_l1].size>>1); } else { // Realign the pointer to the next 16 bit in case of melody E2 current = (UWORD32)current_ptr_8; if (current & 0x01) { current_ptr_8++; *ptr = (UWORD16 *)current_ptr_8; } end = (UWORD32)end_ptr; current = (UWORD32)current_ptr; *buffer_size = (UWORD16)((end-current)>>1); } p_session->session_info.cust_get_pointer_state = AUDIO_CUST_GET_POINTER_NORMAL; break; } } /* switch(p_session->session_info.cust_get_pointer_state) */ return(DATA_AVAILABLE); #if (L1_AUDIO_DRIVER == 1) } // added #endif #endif // MELODY_E1 || VOICE_MEMO || MELODY_E2 #endif // OP_RIV_AUDIO } #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) /*-------------------------------------------------------*/ /* Cust_get_next_buffer_status */ /*-------------------------------------------------------*/ /* */ /* Parameters : */ /* */ /* Return : */ /* */ /* Description : */ /* */ /*-------------------------------------------------------*/ UWORD8 Cust_get_next_buffer_status(void) { return (FALSE); } #endif #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) /*-------------------------------------------------------*/ /* Cust_get_pointer_next_buffer */ /*-------------------------------------------------------*/ /* */ /* Parameters : ptr */ /* buffer_size */ /* session_id */ /* */ /* Return : error_id : */ /* DATA_AVAILABLE: 0, no error occured */ /* SESSION_ERROR: 1, wrong session id */ /* POINTER_ERROR: 2, wrong ptr */ /* DATA_AVAIL_ERROR: 3, no more data */ /* available */ /* DATA_LAST: 4, returned buffer is the */ /* last */ /* buffer_size */ /* ptr */ /* */ /* Description : */ /* This function acts the same as Cust_get_pointer() but */ /* does not send notification to upper layers to free */ /* current buffer */ /* */ /*-------------------------------------------------------*/ UWORD8 Cust_get_pointer_next_buffer(UWORD16 **ptr, UWORD16 *buffer_size, UWORD8 session_id) { #if (L1_MP3 == 1) extern UWORD32 mp3_file_size; #endif #if (L1_AAC == 1) extern UWORD32 aac_file_size; #endif switch(session_id&0x0F) { #if (L1_MP3 == 1) case 13: { if(*ptr==NULL) { // Reset flag Cust_get_pointer_mp3_buffer_last=FALSE; // Set pointer to first buffer with corresponding size mp3_tempbuf_idx=0; *ptr=mp3_tempbuf0; *buffer_size=C_MP3_L1STANDALONE_BUFFER_SIZE; Cust_get_pointer_mp3_last_buffer_size=C_MP3_L1STANDALONE_BUFFER_SIZE; #if (CODE_VERSION == NOT_SIMULATION) if(mp3_file_size<C_MP3_L1STANDALONE_BUFFER_SIZE) { *buffer_size=(UWORD16)mp3_file_size; Cust_get_pointer_mp3_buffer_last=TRUE; return DATA_LAST; } #endif return DATA_AVAILABLE; } else { switch(mp3_tempbuf_idx) { case 0: *ptr=mp3_tempbuf1; break; case 1: *ptr=mp3_tempbuf0; break; } // Swap buffer index mp3_tempbuf_idx^=1; *buffer_size=Cust_get_pointer_mp3_last_buffer_size; if(Cust_get_pointer_mp3_buffer_last==FALSE) return DATA_AVAILABLE; else { if(l1a_l1s_com.mp3_task.parameters.loopback==TRUE) Cust_get_pointer_mp3_buffer_last=FALSE; return DATA_LAST; } } } //omaps00090550 break; #endif // L1_MP3 #if (L1_AAC == 1) case 14: // session id for AAC { if(*ptr==NULL) { // Reset flag Cust_get_pointer_aac_buffer_last=FALSE; // Set pointer to first buffer with corresponding size aac_tempbuf_idx=0; *ptr=aac_tempbuf0; *buffer_size=C_AAC_L1STANDALONE_BUFFER_SIZE; Cust_get_pointer_aac_last_buffer_size=C_AAC_L1STANDALONE_BUFFER_SIZE; #if (CODE_VERSION == NOT_SIMULATION) if(aac_file_size<C_AAC_L1STANDALONE_BUFFER_SIZE) { *buffer_size=(UWORD16)aac_file_size; Cust_get_pointer_aac_buffer_last=TRUE; return DATA_LAST; } #endif return DATA_AVAILABLE; } else { switch(aac_tempbuf_idx) { case 0: *ptr=aac_tempbuf1; break; case 1: *ptr=aac_tempbuf0; break; } // Swap buffer index aac_tempbuf_idx^=1; *buffer_size=Cust_get_pointer_aac_last_buffer_size; if(Cust_get_pointer_aac_buffer_last==FALSE) return DATA_AVAILABLE; else { if(l1a_l1s_com.aac_task.parameters.loopback==TRUE) Cust_get_pointer_aac_buffer_last=FALSE; return DATA_LAST; } } } //omaps00090550 break; #endif // L1_AAC default: { return SESSION_ERROR; } //omaps00090550 break; } } #endif // (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) /*------------------------------------------------------------------*/ /* Cust_get_pointer_notify */ /*------------------------------------------------------------------*/ /* */ /* Parameters : ptr */ /* session_id */ /* */ /* Return : n/a */ /* */ /* Description : */ /* This function sends notification to upper layers to */ /* fill next buffer. */ /* This function should be used with Cust_get_pointer_next_buffer() */ /* */ /*------------------------------------------------------------------*/ void Cust_get_pointer_notify(UWORD8 session_id) { switch(session_id&0x0F) { #if (L1_MP3 == 1) case 13: { #if (CODE_VERSION == NOT_SIMULATION) UWORD32 size; UWORD8 *dst; extern UWORD32 mp3_file_size; // Check if file is ending if(mp3_file_offset+C_MP3_L1STANDALONE_BUFFER_SIZE > mp3_file_size) { size=mp3_file_size-mp3_file_offset; Cust_get_pointer_mp3_buffer_last=TRUE; } else { size=C_MP3_L1STANDALONE_BUFFER_SIZE; Cust_get_pointer_mp3_buffer_last=FALSE; } switch(mp3_tempbuf_idx) { case 0: { // L1 is working on buffer 0 -> fill buffer 1 dst=(UWORD8 *)mp3_tempbuf1; } break; case 1: { // L1 is working on buffer 1 -> fill buffer 0 dst=(UWORD8 *)mp3_tempbuf0; } break; } memcpy(dst,(UWORD8 *)mp3_file+mp3_file_offset,size); // Update MP3 read offset mp3_file_offset+=C_MP3_L1STANDALONE_BUFFER_SIZE; // Rewind if loopback mode is on if((l1a_l1s_com.mp3_task.parameters.loopback==TRUE) && (Cust_get_pointer_mp3_buffer_last==TRUE)) mp3_file_offset=0; // Keep track of buffer size Cust_get_pointer_mp3_last_buffer_size=(UWORD16)size; #else // CODE_VERSION == NOT_SIMULATION UWORD16 i; UWORD8 *dst; switch(mp3_tempbuf_idx) { case 0: dst=(UWORD8 *)mp3_tempbuf1; break; case 1: dst=(UWORD8 *)mp3_tempbuf0; break; } for(i=0; i<C_MP3_L1STANDALONE_BUFFER_SIZE/2; i++) { dst[2*i] =0x12; dst[2*i+1]=0x24; } #endif } break; #endif // L1_MP3 #if (L1_AAC == 1) case 14: { #if (CODE_VERSION == NOT_SIMULATION) UWORD32 size; UWORD8 *dst; extern UWORD32 aac_file_size; // Check if file is ending if(aac_file_offset+C_AAC_L1STANDALONE_BUFFER_SIZE > aac_file_size) { size=aac_file_size-aac_file_offset; Cust_get_pointer_aac_buffer_last=TRUE; } else { size=C_AAC_L1STANDALONE_BUFFER_SIZE; Cust_get_pointer_aac_buffer_last=FALSE; } switch(aac_tempbuf_idx) { case 0: { // L1 is working on buffer 0 -> fill buffer 1 dst=(UWORD8 *)aac_tempbuf1; } break; case 1: { // L1 is working on buffer 1 -> fill buffer 0 dst=(UWORD8 *)aac_tempbuf0; } break; } memcpy(dst,(UWORD8 *)aac_file+aac_file_offset,size); // Update AAC read offset aac_file_offset+=C_AAC_L1STANDALONE_BUFFER_SIZE; // Rewind if loopback mode is on if((l1a_l1s_com.aac_task.parameters.loopback==TRUE) && (Cust_get_pointer_aac_buffer_last==TRUE)) aac_file_offset=0; // Keep track of buffer size Cust_get_pointer_aac_last_buffer_size=(UWORD16)size; #else // CODE_VERSION == NOT_SIMULATION UWORD16 i; UWORD8 *dst; switch(aac_tempbuf_idx) { case 0: dst=(UWORD8 *)aac_tempbuf1; break; case 1: dst=(UWORD8 *)aac_tempbuf0; break; } for(i=0; i<C_AAC_L1STANDALONE_BUFFER_SIZE/2; i++) { dst[2*i] =0x10; dst[2*i+1]=0x20; } #endif } break; #endif // L1_AAC } // switch(session_id&0x0F) } #endif // (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) #if (MELODY_E2 && FIR) /*-------------------------------------------------------*/ /* Cust_audio_melody_E2_load_instrument */ /*-------------------------------------------------------*/ /* */ /* Parameters : customer_instrument_id: */ /* Identifier of the instrument */ /* API_address */ /* address where the insturment */ /* is downloaded */ /* allowed_size */ /* maximum size of the instrument */ /* */ /* Return : instrument_size : */ /* size of the insturment downloaded in */ /* 16-bit word */ /* */ /* Description : */ /* The audio background task calls this function to */ /* request to the MMI to download a new instrument */ /* description at the API_address. */ /* */ /*-------------------------------------------------------*/ UWORD16 Cust_audio_melody_E2_load_instrument (UWORD8 customer_instrument_id, API *API_address, UWORD16 allowed_size) { #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) UWORD16 instrument_size = 0, i, *instrument_ptr; // default.lsi file: // 0 piano31 0x0 // 1 piano15 0x1 // 2 pia_811 0x2 // 3 eba_2536 0x3 // 4 tsax_255 0x4 // 5 asax_124 0x5 // 6 clar_121 0x6 // 7 clar_130 0x7 // 8 stdr_515 0x8 // 9 timp_661 0x9 // 10 agog_406 0xA // 11 wood_110 0xB // 12 vib_3836 0xC // 13 xylo_120 0xD // 14 xylo_315 0xE // 15 xylo_516 0xF // 16 kali_215 0x10 // 17 viol_231 0x11 // 18 viol_215 0x12 // 19 viol_211 0x13 // 20 viol_108 0x14 // 21 flut_436 0x15 // 22 flut_308 0x16 // 23 porg_131 0x17 // 24 acco_211 0x18 // 25 stng_231 0x19 // 26 stng_058 0x1A // 27 ldsa_131 0x1B // 28 sin7 0x1C // 29 egu_3036 0x1D // 30 jgui_215 0x1E // 31 banj_315 0x1F // 32 trum_231 0x20 // 33 tromb31 0x21 // 34 cho_2116 0x22 // 35 vooh_331 0x23 // 36 crc_1210 0x24 // 37 chc_1210 0x25 // 38 ohc_1610 0x26 // 39 lbon_121 0x27 // 40 esn_0210 0x28 // 41 crc_0210 0x29 // 42 ric_0210 0x2A // 43 bdm_0122 0x2B // 44 vib_0415 0x2C // 45 ngu_0343 0x2D // 46 sgu_0230 0x2E // 47 xyl_0315 0x2F switch (customer_instrument_id) { case 0: // Piano31.mwa { instrument_size = MELODY_E2_PIANO31_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_piano31[0]); break; } case 1: // Piano15.mwa { instrument_size = MELODY_E2_PIANO15_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_piano15[0]); break; } case 2: // Pia_811.mwa { instrument_size = MELODY_E2_PIA_811_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_pia_811[0]); break; } case 3: // eba_2536.mwa { instrument_size = MELODY_E2_EBA_2536_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_eba_2536[0]); break; } case 4: // tsax_255.mwa { instrument_size = MELODY_E2_TSAX_255_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_tsax_255[0]); break; } case 5: // asax_124.mwa { instrument_size = MELODY_E2_ASAX_124_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_asax_124[0]); break; } case 6: // clar_121.mwa { instrument_size = MELODY_E2_CLAR_121_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_clar_121[0]); break; } case 7: // clar_130.mwa { instrument_size = MELODY_E2_CLAR_130_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_clar_130[0]); break; } case 8: // stdr_515.mwa { instrument_size = MELODY_E2_STDR_515_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_stdr_515[0]); break; } case 9: // timp_661.mwa { instrument_size = MELODY_E2_TIMP_661_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_timp_661[0]); break; } case 10: // agog_406.mwa { instrument_size = MELODY_E2_AGOG_406_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_agog_406[0]); break; } case 11: // wood_110.mwa { instrument_size = MELODY_E2_WOOD_110_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_wood_110[0]); break; } case 12: // vib_3836.mwa { instrument_size = MELODY_E2_VIB_3836_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_vib_3836[0]); break; } case 13: // xylo_120.mwa { instrument_size = MELODY_E2_XYLO_120_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_xylo_120[0]); break; } case 14: // xylo_315.mwa { instrument_size = MELODY_E2_XYLO_315_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_xylo_315[0]); break; } case 15: // xylo_516.mwa { instrument_size = MELODY_E2_XYLO_516_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_xylo_516[0]); break; } case 16: // kali_215.mwa { instrument_size = MELODY_E2_KALI_215_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_kali_215[0]); break; } case 17: // viol_231 { instrument_size = MELODY_E2_VIOL_231_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_viol_231[0]); break; } case 18: // viol_215.mwa { instrument_size = MELODY_E2_VIOL_215_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_viol_215[0]); break; } case 19: // viol_211.mwa { instrument_size = MELODY_E2_VIOL_211_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_viol_211[0]); break; } case 20: // viol_108.mwa { instrument_size = MELODY_E2_VIOL_108_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_viol_108[0]); break; } case 21: // flut_436 { instrument_size = MELODY_E2_FLUT_436_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_flut_436[0]); break; } case 22: // flut_308.mwa { instrument_size = MELODY_E2_FLUT_308_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_flut_308[0]); break; } case 23: // porg_131 { instrument_size = MELODY_E2_PORG_131_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_porg_131[0]); break; } case 24: // acco_211.mwa { instrument_size = MELODY_E2_ACCO_211_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_acco_211[0]); break; } case 25: // stng_231 { instrument_size = MELODY_E2_STNG_231_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_stng_231[0]); break; } case 26: // stng_058.mwa { instrument_size = MELODY_E2_STNG_058_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_stng_058[0]); break; } case 27: // ldsa_131 { instrument_size = MELODY_E2_LDSA_131_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_ldsa_131[0]); break; } case 28: // sin7.mwa { instrument_size = MELODY_E2_SIN7_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_sin7[0]); break; } case 29: // Egu_3036.mwa { instrument_size = MELODY_E2_EGU_3036_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_egu_3036[0]); break; } case 30: // Jgui_215.mwa { instrument_size = MELODY_E2_JGUI_215_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_jgui_215[0]); break; } case 31: // Banj_315.mwa { instrument_size = MELODY_E2_BANJ_315_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_banj_315[0]); break; } case 32: // trum_231 { instrument_size = MELODY_E2_TRUM_231_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_trum_231[0]); break; } case 33: // tromb31 { instrument_size = MELODY_E2_TROMB31_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_tromb31[0]); break; } case 34: // cho_2116 { instrument_size = MELODY_E2_CHO_2116_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_cho_2116[0]); break; } case 35: // vooh_331.mwa { instrument_size = MELODY_E2_VOOH_331_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_vooh_331[0]); break; } case 36: // crc_1210.mwa { instrument_size = MELODY_E2_CRC_1210_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_crc_1210[0]); break; } case 37: // chc_1210.mwa { instrument_size = MELODY_E2_CHC_1210_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_chc_1210[0]); break; } case 38: // ohc_1610 { instrument_size = MELODY_E2_OHC_1610_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_ohc_1610[0]); break; } case 39: // lbon_121 { instrument_size = MELODY_E2_LBON_121_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_lbon_121[0]); break; } case 40: // esn_0210 { instrument_size = MELODY_E2_ESN_0210_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_esn_0210[0]); break; } case 41: // crc_0210 { instrument_size = MELODY_E2_CRC_0210_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_crc_0210[0]); break; } case 42: // ric_0210 { instrument_size = MELODY_E2_RIC_0210_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_ric_0210[0]); break; } case 43: // bdm_0122 { instrument_size = MELODY_E2_BDM_0122_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_bdm_0122[0]); break; } case 44: // vib_0415 { instrument_size = MELODY_E2_VIB_0415_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_vib_0415[0]); break; } case 45: // ngu_0343 { instrument_size = MELODY_E2_NGU_0343_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_ngu_0343[0]); break; } case 46: // sgu_0230 { instrument_size = MELODY_E2_SGU_0230_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_sgu_0230[0]); break; } case 47: // xyl_0315 { instrument_size = MELODY_E2_XYL_0315_MWA_SIZE; instrument_ptr = (UWORD16 *)(&melody_E2_xyl_0315[0]); break; } } i = instrument_size; while ( (i != 0) && (l1a_l1s_com.melody0_e2_task.parameters.emergency_stop == FALSE) ) { *API_address++ = *instrument_ptr++; i--; } return(instrument_size); #endif // (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE) #if (OP_RIV_AUDIO == 1) #ifndef _WINDOWS T_FFS_FD ffs_fd_1, ffs_fd_2; T_FFS_STAT stat; /* Nb of instruments in the .lsi file */ INT8 i = 0; INT16 instrument_id = -1; /* basic structure of the .lsi file */ T_AUDIO_MELODY_E2_ID_NAME file_E2; /**** Find the size of the .lsi file ****/ /* the .lsi file is stores into the flash */ /* check if the .lsi file exists */ ffs_fd_1 = ffs_open(p_audio_gbl_var->melody_E2_load_file_instruments.instrument_file_name, FFS_O_RDONLY ); if (ffs_fd_1 < EFFS_OK) { audio_melody_E2_error_trace(AUDIO_ENTITY_LOAD_FILE_INSTR_ERROR); return (0); } /* find the .mwa file */ while ( (i < p_audio_gbl_var->melody_E2_load_file_instruments.nb_of_instruments) && (customer_instrument_id != instrument_id)) { /* Load the instruments file from the FFS */ if ( (ffs_read ( ffs_fd_1, (&file_E2), (sizeof(INT8) + AUDIO_PATH_NAME_MAX_SIZE))) < EFFS_OK ) { AUDIO_SEND_TRACE("AUDIO MELODY E2: impossible to load the .lsi file", RV_TRACE_LEVEL_ERROR); /* Close the file */ ffs_close(ffs_fd_1); return (0); } instrument_id = file_E2.id; } /* Close the file */ ffs_close(ffs_fd_1); if (i == p_audio_gbl_var->melody_E2_load_file_instruments.nb_of_instruments) { AUDIO_SEND_TRACE("AUDIO MELODY E2: the instrument doesn't exist in the .lsi file", RV_TRACE_LEVEL_ERROR); return (0); } /* Open the corresponding .mwa file */ ffs_fd_2 = ffs_open( file_E2.melody_name, FFS_O_RDONLY ); if (ffs_fd_2 < EFFS_OK) { AUDIO_SEND_TRACE("AUDIO MELODY E2: impossible to open the .mwa file instruments", RV_TRACE_LEVEL_ERROR); /* Close the .mwa file */ ffs_close(ffs_fd_2); return (0); } /* download the instrument description */ ffs_stat(file_E2.melody_name,&stat); /* check if the file contains some data */ if (stat.size ==0) { /* the file doesn't contains data */ /* an error is generated */ audio_melody_E2_error_trace(AUDIO_ENTITY_FILE_ERROR); /* Close the .mwa file */ ffs_close(ffs_fd_2); return(0); } /* check if there's enough memory in the API for this instrument */ if (allowed_size < (stat.size>>1)) { /* an error is generated */ audio_melody_E2_error_trace(AUDIO_ERROR_INSTRUMENT_SIZE); /* Close the .mwa file */ ffs_close(ffs_fd_2); return(0); } ffs_read ( ffs_fd_2, (void *)API_address, stat.size ); /* Close the file */ ffs_close(ffs_fd_2); return((stat.size>>1)); #endif //_WINDOWS #endif // OP_RIV_AUDIO } #endif // MELODY_E2 #if (L1_EXT_AUDIO_MGT) /*-------------------------------------------------------*/ /* Cust_ext_audio_mgt_hisr */ /*-------------------------------------------------------*/ /* */ /* Parameters : none */ /* */ /* Return : none */ /* */ /* Description : */ /* handle the DMA interrupt in order to request a new */ /* buffer */ /* */ /*-------------------------------------------------------*/ void Cust_ext_audio_mgt_hisr() { UWORD8 error_id = 0; UWORD16 requested_size = l1a_l1s_com.stereopath_drv_task.parameters.frame_number*2; error_id = Cust_get_pointer((UWORD16 **)&l1a_l1s_com.stereopath_drv_task.parameters.source_buffer_address, &requested_size, l1s.ext_audio_mgt.session_id); } #endif #if 0 /* FreeCalypso: removing functions not present in TCS211 */ void l1a_bt_audio_noti_process() { UINT8 channel_id=0; void *p_message = NULL; //omaps00090550 T_RVF_MB_STATUS mb_status; //omaps00090550 T_AUDIO_DRIVER_SESSION *p_session; T_RV_RETURN *return_path; /* find active channel_id associated to session_id */ 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 != AUDIO_EXT_MIDI_SESSION_ID)) ) { channel_id++; } /* get driver session */ p_session = &(p_audio_gbl_var->audio_driver_session[channel_id]); p_session->session_info.index_l1=1-p_session->session_info.index_l1; return_path = &(p_session->session_req.return_path); /* Translate the l1 message into the Riviera compliant message */ /* Allocate the Riviera buffer */ mb_status = rvf_get_buf ( p_audio_gbl_var->mb_external, sizeof (T_AUDIO_DRIVER_NOTIFICATION), (T_RVF_BUFFER **) (&p_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_SEND_TRACE("AUDIO entity has no memory for driver notification",RV_TRACE_LEVEL_ERROR); return; } /* Fill the message ID + parameters */ ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->header.msg_id = AUDIO_DRIVER_NOTIFICATION_MSG; ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->channel_id = channel_id; ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->p_buffer = NULL; /* send answer */ if (return_path->callback_func == NULL) rvf_send_msg (return_path->addr_id, p_message); else { (*return_path->callback_func)((void *)(p_message)); rvf_free_buf((T_RVF_BUFFER *)p_message); } } //NAVC start/stop/read energy // Parameters :d_navc_start_stop_read // 1=start,2=stop,3=read energy // UWORD32 d_navc_ctrl_status_energy_val // 0=action not performed,1=action perf, xxx-value // Description : this function will called to start/stop the NAVC and also to read the energy value during call //The bit map of d_navc_ctrl_status is as follows. // Bit 0: Start command: If 1 NAVC start. Set to 1 by MCU , Reset by DSp after module start Bit 1: Stop command : // If 1 NAVC stop. Set to 1 by MCU , Reset by DSP after module stop. Bit 15: Status: Set and reset by DSP. If 1 // module is active. If 0 module is not active. UWORD32 Cust_navc_ctrl_status(UWORD8 d_navc_start_stop_read) { UWORD32 d_navc_ctrl_status_energy_val=0; switch (d_navc_start_stop_read) { case 1: /* Start NAVC */ { if((l1s_dsp_com.dsp_ndb_ptr->d_navc_ctrl_status & 0x8000)==0)l1s_dsp_com.dsp_ndb_ptr->d_navc_ctrl_status |= 0x01; //check 15th bit and if not active-put the last bit to 1 to start d_navc_ctrl_status_energy_val=1; //indicates action performed } break; case 2: /* Stop NAVC */ { if((l1s_dsp_com.dsp_ndb_ptr->d_navc_ctrl_status & 0x8000)==0x8000)l1s_dsp_com.dsp_ndb_ptr->d_navc_ctrl_status |= 0x02; //check 15th bit and if active-put the last bit to 1 to start d_navc_ctrl_status_energy_val=1; //indicates action performed } break; case 3: /* NAVC read energy */ { if((l1s_dsp_com.dsp_ndb_ptr->d_navc_ctrl_status & 0x8000) == 0x8000)//check 15th bit and if active- read the value-- { d_navc_ctrl_status_energy_val = l1s_dsp_com.dsp_ndb_ptr->d_vad_noise_ene_ndb[0]; //MSB part d_navc_ctrl_status_energy_val= (d_navc_ctrl_status_energy_val<<16)|(l1s_dsp_com.dsp_ndb_ptr->d_vad_noise_ene_ndb[1]); //MSB <<16 | LSB - indicates the energy value } } break; /*intended fall through */ default: break; } #if (L1_NAVC_TRACE == 1) //to see the NAVC trace l1_trace_navc(d_navc_start_stop_read,d_navc_ctrl_status_energy_val); #endif return (d_navc_ctrl_status_energy_val); } #endif #endif // AUDIO_TASK== 1