FreeCalypso > hg > leo2moko-debug
comparison chipsetsw/services/Audio/audio_driver.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
| author | Space Falcon <falcon@ivan.Harhan.ORG> |
|---|---|
| date | Mon, 01 Jun 2015 03:24:05 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:509db1a7b7b8 |
|---|---|
| 1 /****************************************************************************/ | |
| 2 /* */ | |
| 3 /* File Name: audio_driver.c */ | |
| 4 /* */ | |
| 5 /* Purpose: This file contains all the functions used to manage the */ | |
| 6 /* driver. */ | |
| 7 /* */ | |
| 8 /* Version 0.1 */ | |
| 9 /* */ | |
| 10 /* Date Modification */ | |
| 11 /* ------------------------------------ */ | |
| 12 /* 09 December 2002 Create */ | |
| 13 /* */ | |
| 14 /* Author Frederic Turgis */ | |
| 15 /* */ | |
| 16 /* (C) Copyright 2002 by Texas Instruments Incorporated, All Rights Reserved*/ | |
| 17 /****************************************************************************/ | |
| 18 | |
| 19 #include "rv/rv_defined_swe.h" | |
| 20 #ifdef RVM_AUDIO_MAIN_SWE | |
| 21 #ifndef _WINDOWS | |
| 22 #include "config/swconfig.cfg" | |
| 23 #include "config/sys.cfg" | |
| 24 #include "config/chipset.cfg" | |
| 25 #endif | |
| 26 | |
| 27 #include "l1_confg.h" | |
| 28 #include "rvf/rvf_api.h" | |
| 29 #include "rv/rv_general.h" | |
| 30 #include "rvm/rvm_gen.h" | |
| 31 #include "audio/audio_features_i.h" | |
| 32 #include "audio/audio_api.h" | |
| 33 #include "audio/audio_env_i.h" | |
| 34 #include "audio/audio_ffs_i.h" | |
| 35 #include "audio/audio_structs_i.h" | |
| 36 #include "audio/audio_macro_i.h" | |
| 37 #include "rvf/rvf_target.h" | |
| 38 #include "audio/audio_const_i.h" | |
| 39 #include "audio/audio_var_i.h" | |
| 40 #include "audio/audio_error_hdlr_i.h" | |
| 41 #include "audio/audio_messages_i.h" | |
| 42 | |
| 43 #ifndef _WINDOWS | |
| 44 // include the usefull L1 header | |
| 45 #define BOOL_FLAG | |
| 46 #define CHAR_FLAG | |
| 47 #include "l1_types.h" | |
| 48 #include "cust_os.h" | |
| 49 #include "l1audio_cust.h" | |
| 50 #include "l1audio_msgty.h" | |
| 51 #include "l1audio_signa.h" | |
| 52 #include "l1_signa.h" | |
| 53 #else | |
| 54 // include the usefull L1 header | |
| 55 #define BOOL_FLAG | |
| 56 #define CHAR_FLAG | |
| 57 #include "l1_types.h" | |
| 58 #include "l1audio_const.h" | |
| 59 #include "l1audio_cust.h" | |
| 60 #include "l1audio_defty.h" | |
| 61 #include "l1audio_msgty.h" | |
| 62 #include "l1audio_signa.h" | |
| 63 #include "l1_const.h" | |
| 64 #include "l1_defty.h" | |
| 65 #include "l1_msgty.h" | |
| 66 #include "l1_signa.h" | |
| 67 #include "l1_varex.h" | |
| 68 #include "audio/tests/audio_test.h" | |
| 69 #endif | |
| 70 | |
| 71 #if (L1_AUDIO_DRIVER) | |
| 72 #if (L1_VOICE_MEMO_AMR) | |
| 73 extern T_AUDIO_RET audio_driver_vm_amr_play_manager (T_RV_HDR *p_message, T_AUDIO_DRIVER_SESSION *p_session); | |
| 74 extern T_AUDIO_RET audio_driver_vm_amr_record_manager (T_RV_HDR *p_message, T_AUDIO_DRIVER_SESSION *p_session); | |
| 75 extern T_AUDIO_RET audio_driver_midi_manager (T_RV_HDR *p_message, T_AUDIO_DRIVER_SESSION *p_session); | |
| 76 #endif | |
| 77 | |
| 78 UINT8 audio_driver_message_switch(T_RV_HDR *p_message); | |
| 79 void audio_driver_send_status (T_AUDIO_RET status, | |
| 80 UINT8 status_type, | |
| 81 UINT8 channel_id, | |
| 82 T_RV_RETURN return_path); | |
| 83 void audio_driver_init_send_status (T_AUDIO_RET status, | |
| 84 UINT8 session_id, | |
| 85 UINT8 channel_id, | |
| 86 T_RV_RETURN return_path); | |
| 87 void audio_driver_manager(T_RV_HDR *p_message); | |
| 88 T_AUDIO_RET audio_driver_get_play_buffer(UINT8 channel_id, UINT8 **pp_buffer); | |
| 89 T_AUDIO_RET audio_driver_play_buffer(UINT8 channel_id, UINT8 *p_buffer); | |
| 90 | |
| 91 UINT8 audio_driver_message_switch(T_RV_HDR *p_message) | |
| 92 { | |
| 93 switch (p_message->msg_id) | |
| 94 { | |
| 95 case AUDIO_DRIVER_START_SESSION: | |
| 96 case AUDIO_DRIVER_STOP_SESSION: | |
| 97 case AUDIO_DRIVER_FREE_SESSION: | |
| 98 return(AUDIO_DRIVER_SWITCH); | |
| 99 break; | |
| 100 #if (L1_VOICE_MEMO_AMR) | |
| 101 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 102 case MMI_VM_AMR_RECORD_START_CON: | |
| 103 case MMI_VM_AMR_RECORD_STOP_CON: | |
| 104 return(AUDIO_DRIVER_VM_AMR_RECORD_SESSION_SWITCH); | |
| 105 break; | |
| 106 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 107 case MMI_VM_AMR_PLAY_START_CON: | |
| 108 case MMI_VM_AMR_PLAY_STOP_CON: | |
| 109 return(AUDIO_DRIVER_VM_AMR_PLAY_SESSION_SWITCH); | |
| 110 break; | |
| 111 #endif | |
| 112 #if (L1_MIDI == 1) | |
| 113 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 114 case MMI_MIDI_START_CON: | |
| 115 case MMI_MIDI_STOP_CON: | |
| 116 return(AUDIO_DRIVER_MIDI_SESSION_SWITCH); | |
| 117 break; | |
| 118 #endif | |
| 119 default: | |
| 120 return(AUDIO_DRIVER_NONE); | |
| 121 break; | |
| 122 } // switch | |
| 123 } | |
| 124 | |
| 125 void audio_driver_send_status (T_AUDIO_RET status, | |
| 126 UINT8 status_type, | |
| 127 UINT8 channel_id, | |
| 128 T_RV_RETURN return_path) | |
| 129 { | |
| 130 T_AUDIO_DRIVER_STATUS *p_send_message; | |
| 131 T_RVF_MB_STATUS mb_status = RVF_RED; | |
| 132 | |
| 133 while (mb_status == RVF_RED) | |
| 134 { | |
| 135 // allocate the message buffer | |
| 136 mb_status = rvf_get_buf (p_audio_gbl_var->mb_external, | |
| 137 sizeof (T_AUDIO_DRIVER_STATUS), | |
| 138 (T_RVF_BUFFER **) (&p_send_message)); | |
| 139 | |
| 140 // If insufficient resources, then report a memory error and abort. | |
| 141 // and wait until more ressource is given | |
| 142 if (mb_status == RVF_RED) | |
| 143 { | |
| 144 audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
| 145 rvf_delay(RVF_MS_TO_TICKS(1000)); | |
| 146 } | |
| 147 } | |
| 148 | |
| 149 // fill the header of the message + parameters | |
| 150 p_send_message->os_hdr.msg_id = AUDIO_DRIVER_STATUS_MSG; | |
| 151 p_send_message->status = status; | |
| 152 p_send_message->status_type = status_type; | |
| 153 p_send_message->channel_id = channel_id; | |
| 154 | |
| 155 // send message or call callback | |
| 156 if (return_path.callback_func == NULL) | |
| 157 rvf_send_msg (return_path.addr_id, p_send_message); | |
| 158 else | |
| 159 { | |
| 160 (*return_path.callback_func)((void *)(p_send_message)); | |
| 161 rvf_free_buf((T_RVF_BUFFER *)p_send_message); | |
| 162 } | |
| 163 } | |
| 164 | |
| 165 void audio_driver_init_send_status (T_AUDIO_RET status, | |
| 166 UINT8 session_id, | |
| 167 UINT8 channel_id, | |
| 168 T_RV_RETURN return_path) | |
| 169 { | |
| 170 T_AUDIO_DRIVER_INIT_STATUS *p_send_message; | |
| 171 T_RVF_MB_STATUS mb_status = RVF_RED; | |
| 172 | |
| 173 while (mb_status == RVF_RED) | |
| 174 { | |
| 175 // allocate the message buffer | |
| 176 mb_status = rvf_get_buf (p_audio_gbl_var->mb_external, | |
| 177 sizeof (T_AUDIO_DRIVER_INIT_STATUS), | |
| 178 (T_RVF_BUFFER **) (&p_send_message)); | |
| 179 | |
| 180 // If insufficient resources, then report a memory error and abort. | |
| 181 // and wait until more ressource is given | |
| 182 if (mb_status == RVF_RED) | |
| 183 { | |
| 184 audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
| 185 rvf_delay(RVF_MS_TO_TICKS(1000)); | |
| 186 } | |
| 187 } | |
| 188 | |
| 189 // fill the header of the message | |
| 190 p_send_message->os_hdr.msg_id = AUDIO_DRIVER_INIT_STATUS_MSG; | |
| 191 | |
| 192 // fill the status parameters | |
| 193 p_send_message->status = status; | |
| 194 p_send_message->session_id = session_id; | |
| 195 p_send_message->channel_id = channel_id; | |
| 196 | |
| 197 // send message or call callback | |
| 198 if (return_path.callback_func == NULL) | |
| 199 rvf_send_msg (return_path.addr_id, p_send_message); | |
| 200 else | |
| 201 { | |
| 202 (*return_path.callback_func)((void *)(p_send_message)); | |
| 203 rvf_free_buf((T_RVF_BUFFER *)p_send_message); | |
| 204 } | |
| 205 } | |
| 206 | |
| 207 void audio_driver_manager(T_RV_HDR *p_message) | |
| 208 { | |
| 209 T_AUDIO_DRIVER_SESSION *p_session; | |
| 210 T_AUDIO_DRIVER_PARAMETER *driver_parameter; | |
| 211 T_RV_RETURN return_path; | |
| 212 T_RVF_MB_STATUS mb_status; | |
| 213 UINT8 session_id, channel_id, state, j; | |
| 214 | |
| 215 // initialize return_path to default values | |
| 216 return_path.callback_func=NULL; | |
| 217 return_path.addr_id=0; | |
| 218 | |
| 219 // find state + extract information:channel_id or session_id + driver_parameter | |
| 220 switch (p_message->msg_id) | |
| 221 { | |
| 222 // start/stop session messages have channel_id so we know the driver_session | |
| 223 case AUDIO_DRIVER_START_SESSION: | |
| 224 case AUDIO_DRIVER_STOP_SESSION: | |
| 225 case AUDIO_DRIVER_FREE_SESSION: | |
| 226 channel_id = ((T_AUDIO_DRIVER_HANDLE_SESSION *)p_message)->channel_id; | |
| 227 p_session = &(p_audio_gbl_var->audio_driver_session[channel_id]); | |
| 228 state = p_session->session_info.state; | |
| 229 if (p_message->msg_id != AUDIO_DRIVER_STOP_SESSION) | |
| 230 return_path = ((T_AUDIO_DRIVER_HANDLE_SESSION *)p_message)->return_path; | |
| 231 else | |
| 232 return_path = p_session->session_req.return_path; | |
| 233 break; | |
| 234 // messages which contain only session_id, must look for it in ACTIVE driver_session | |
| 235 default: | |
| 236 { | |
| 237 switch (p_message->msg_id) | |
| 238 { | |
| 239 #if (L1_VOICE_MEMO_AMR) | |
| 240 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 241 session_id = AUDIO_VM_AMR_RECORD_SESSION_ID; | |
| 242 driver_parameter = &(((T_AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION *)p_message)->driver_parameter); | |
| 243 return_path = ((T_AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION *)p_message)->return_path; | |
| 244 break; | |
| 245 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 246 session_id = AUDIO_VM_AMR_PLAY_SESSION_ID; | |
| 247 driver_parameter = & (((T_AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION *)p_message)->driver_parameter); | |
| 248 return_path = ((T_AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION *)p_message)->return_path; | |
| 249 break; | |
| 250 case MMI_VM_AMR_RECORD_START_CON: | |
| 251 case MMI_VM_AMR_RECORD_STOP_CON: | |
| 252 session_id = AUDIO_VM_AMR_RECORD_SESSION_ID; | |
| 253 break; | |
| 254 case MMI_VM_AMR_PLAY_START_CON: | |
| 255 case MMI_VM_AMR_PLAY_STOP_CON: | |
| 256 session_id = AUDIO_VM_AMR_PLAY_SESSION_ID; | |
| 257 break; | |
| 258 #endif | |
| 259 #if (L1_MIDI == 1) | |
| 260 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 261 session_id = AUDIO_MIDI_SESSION_ID; | |
| 262 driver_parameter = &(((T_AUDIO_DRIVER_INIT_MIDI_SESSION *)p_message)->driver_parameter); | |
| 263 return_path = ((T_AUDIO_DRIVER_INIT_MIDI_SESSION *)p_message)->return_path; | |
| 264 break; | |
| 265 case MMI_MIDI_START_CON: | |
| 266 case MMI_MIDI_STOP_CON: | |
| 267 session_id = AUDIO_MIDI_SESSION_ID; | |
| 268 break; | |
| 269 #endif | |
| 270 } | |
| 271 | |
| 272 // initialize channel_id to browse all driver channels | |
| 273 channel_id = 0; | |
| 274 state = AUDIO_DRIVER_CHANNEL_WAIT_INIT; | |
| 275 | |
| 276 // look for an active session, which session_id matches the one from the message | |
| 277 while ( (channel_id < AUDIO_DRIVER_MAX_CHANNEL)&& | |
| 278 ((p_audio_gbl_var->audio_driver_session[channel_id].session_info.state == AUDIO_DRIVER_CHANNEL_WAIT_INIT)|| | |
| 279 (p_audio_gbl_var->audio_driver_session[channel_id].session_req.session_id != session_id)) ) | |
| 280 { | |
| 281 channel_id++; | |
| 282 } | |
| 283 // if channel_id < MAX_CHANNEL, we found an active channel so we can derive channel_id + state | |
| 284 if (channel_id < AUDIO_DRIVER_MAX_CHANNEL) | |
| 285 { | |
| 286 p_session = &(p_audio_gbl_var->audio_driver_session[channel_id]); | |
| 287 state = p_session->session_info.state; | |
| 288 return_path = p_session->session_req.return_path; | |
| 289 } | |
| 290 } | |
| 291 break; // default | |
| 292 } | |
| 293 | |
| 294 switch (state) | |
| 295 { | |
| 296 case AUDIO_DRIVER_CHANNEL_WAIT_INIT: | |
| 297 { | |
| 298 switch (p_message->msg_id) | |
| 299 { | |
| 300 #if (L1_VOICE_MEMO_AMR) | |
| 301 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 302 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 303 #endif | |
| 304 #if (L1_MIDI == 1) | |
| 305 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 306 #endif | |
| 307 { | |
| 308 T_AUDIO_RET result; | |
| 309 | |
| 310 // Find a free channel | |
| 311 channel_id = 0; | |
| 312 while ( (p_audio_gbl_var->audio_driver_session[channel_id].session_info.state != AUDIO_DRIVER_CHANNEL_WAIT_INIT) && | |
| 313 (channel_id < AUDIO_DRIVER_MAX_CHANNEL) ) | |
| 314 channel_id++; | |
| 315 | |
| 316 if (channel_id == AUDIO_DRIVER_MAX_CHANNEL) | |
| 317 { | |
| 318 AUDIO_SEND_TRACE("no driver channel available", RV_TRACE_LEVEL_DEBUG_LOW); | |
| 319 audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); | |
| 320 return; | |
| 321 } | |
| 322 | |
| 323 AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER: open channel", channel_id, RV_TRACE_LEVEL_DEBUG_LOW); | |
| 324 | |
| 325 // get session descriptor and fill REQ parameters | |
| 326 p_session = &(p_audio_gbl_var->audio_driver_session[channel_id]); | |
| 327 p_session->session_req.session_id = session_id; | |
| 328 p_session->session_req.size = driver_parameter->buffer_size << 1;// we request 16-bit words buffers | |
| 329 p_session->session_req.nb_buffer = driver_parameter->nb_buffer; | |
| 330 // fill return_path parameters, may be used if next message is STOP_SESSION | |
| 331 p_session->session_req.return_path.callback_func = return_path.callback_func; | |
| 332 p_session->session_req.return_path.addr_id = return_path.addr_id; | |
| 333 | |
| 334 /************************************************************/ | |
| 335 /* the driver must allocate the RAM buffers pointer */ | |
| 336 /************************************************************/ | |
| 337 mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal, | |
| 338 sizeof(T_AUDIO_DRIVER_BUFFER_INFO)*p_session->session_req.nb_buffer, | |
| 339 (T_RVF_BUFFER **) (&p_session->session_info.buffer)); | |
| 340 | |
| 341 // If insufficient resources, then report a memory error and abort. | |
| 342 if (mb_status == RVF_RED) | |
| 343 { | |
| 344 audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
| 345 audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); | |
| 346 return; | |
| 347 } | |
| 348 | |
| 349 /************************************************************/ | |
| 350 /* the driver must allocate the RAM buffers */ | |
| 351 /************************************************************/ | |
| 352 for (j = 0; j < p_session->session_req.nb_buffer; j++) | |
| 353 { | |
| 354 mb_status = rvf_get_buf (p_audio_gbl_var->mb_audio_ffs, | |
| 355 p_session->session_req.size, | |
| 356 (T_RVF_BUFFER **) (&p_session->session_info.buffer[j].p_start_pointer)); | |
| 357 | |
| 358 // If insufficient resources, then report a memory error and abort. | |
| 359 if (mb_status == RVF_RED) | |
| 360 { | |
| 361 UINT8 i; | |
| 362 // free already allocated buffers + buffer pointer | |
| 363 if (j > 0) | |
| 364 { | |
| 365 for (i = j - 1; i >= 0; i--) | |
| 366 rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer[i].p_start_pointer); | |
| 367 } | |
| 368 rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer); | |
| 369 audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
| 370 audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); | |
| 371 return; | |
| 372 } | |
| 373 | |
| 374 // initialize parameters | |
| 375 p_session->session_info.buffer[j].size = p_session->session_req.size; | |
| 376 | |
| 377 AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER: allocate buffer", | |
| 378 p_session->session_info.buffer[j].p_start_pointer, RV_TRACE_LEVEL_DEBUG_LOW); | |
| 379 } | |
| 380 | |
| 381 // info parameters (state must be changed before driver specific functions call | |
| 382 p_session->session_info.index_l1 = 0; | |
| 383 p_session->session_info.index_appli = 0; | |
| 384 p_session->session_info.stop_request = 0; | |
| 385 | |
| 386 // conversion of parameters + prepare l1 start message | |
| 387 switch(p_message->msg_id) | |
| 388 { | |
| 389 #if (L1_VOICE_MEMO_AMR) | |
| 390 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 391 result=audio_driver_vm_amr_record_manager(p_message,p_session); | |
| 392 break; | |
| 393 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 394 result=audio_driver_vm_amr_play_manager(p_message,p_session); | |
| 395 break; | |
| 396 #endif | |
| 397 #if (L1_MIDI == 1) | |
| 398 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 399 result=audio_driver_midi_manager(p_message,p_session); | |
| 400 break; | |
| 401 #endif | |
| 402 } | |
| 403 | |
| 404 // check L1 msg allocation was successfull | |
| 405 if (result != AUDIO_OK) | |
| 406 { | |
| 407 AUDIO_SEND_TRACE("AUDIO DRIVER MANAGER: L1 msg allocation failed", RV_TRACE_LEVEL_DEBUG_LOW); | |
| 408 audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); | |
| 409 return; | |
| 410 } | |
| 411 | |
| 412 // state (must be changed after driver specific functions calls) | |
| 413 p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_START; | |
| 414 | |
| 415 audio_driver_init_send_status(AUDIO_OK, session_id, channel_id, return_path); | |
| 416 } //case AUDIO_DRIVER_INIT_..._SESSION: | |
| 417 break; | |
| 418 case AUDIO_DRIVER_START_SESSION: | |
| 419 audio_driver_error_trace(AUDIO_ERROR_START_EVENT); | |
| 420 audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); | |
| 421 break; | |
| 422 case AUDIO_DRIVER_STOP_SESSION: | |
| 423 audio_driver_error_trace(AUDIO_ERROR_STOP_EVENT); | |
| 424 audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); | |
| 425 break; | |
| 426 case AUDIO_DRIVER_FREE_SESSION: | |
| 427 audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); | |
| 428 audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); | |
| 429 break; | |
| 430 } // switch (p_message->msg_id) | |
| 431 } //case AUDIO_DRIVER_CHANNEL_WAIT_INIT: | |
| 432 break; | |
| 433 case AUDIO_DRIVER_CHANNEL_WAIT_START: | |
| 434 { | |
| 435 switch (p_message->msg_id) | |
| 436 { | |
| 437 case AUDIO_DRIVER_START_SESSION: | |
| 438 { | |
| 439 T_AUDIO_RET result; | |
| 440 | |
| 441 // fill notification parameters | |
| 442 p_session->session_req.return_path.callback_func = return_path.callback_func; | |
| 443 p_session->session_req.return_path.addr_id = return_path.addr_id; | |
| 444 | |
| 445 // send l1 message | |
| 446 switch(p_session->session_req.session_id) | |
| 447 { | |
| 448 #if (L1_VOICE_MEMO_AMR) | |
| 449 case AUDIO_VM_AMR_RECORD_SESSION_ID: | |
| 450 result=audio_driver_vm_amr_record_manager(p_message,p_session); | |
| 451 break; | |
| 452 case AUDIO_VM_AMR_PLAY_SESSION_ID: | |
| 453 result=audio_driver_vm_amr_play_manager(p_message,p_session); | |
| 454 break; | |
| 455 #endif | |
| 456 #if (L1_MIDI == 1) | |
| 457 case AUDIO_MIDI_SESSION_ID: | |
| 458 result=audio_driver_midi_manager(p_message,p_session); | |
| 459 break; | |
| 460 #endif | |
| 461 } | |
| 462 | |
| 463 if (result != AUDIO_OK) | |
| 464 { | |
| 465 audio_driver_error_trace(AUDIO_ERROR_L1_START_EVENT); | |
| 466 audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); | |
| 467 return; | |
| 468 } | |
| 469 | |
| 470 // change state | |
| 471 p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_START_CON; | |
| 472 } | |
| 473 break; | |
| 474 case AUDIO_DRIVER_STOP_SESSION: | |
| 475 { | |
| 476 // deallocate buffers | |
| 477 for(j=0; j<p_session->session_req.nb_buffer; j++) | |
| 478 { | |
| 479 mb_status=rvf_free_buf((T_RVF_BUFFER *)(p_session->session_info.buffer[j].p_start_pointer)); | |
| 480 | |
| 481 AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER MANAGER: deallocate buffer", | |
| 482 j, RV_TRACE_LEVEL_DEBUG_LOW); | |
| 483 | |
| 484 if (mb_status != RVF_GREEN) | |
| 485 AUDIO_SEND_TRACE_PARAM("can't deallocate buffer", j, RV_TRACE_LEVEL_ERROR); | |
| 486 } | |
| 487 | |
| 488 // Deallocate buffers pointer | |
| 489 rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer); | |
| 490 | |
| 491 // deallocate l1 message | |
| 492 audio_deallocate_l1_message(p_session->session_req.p_l1_send_message); | |
| 493 | |
| 494 // send status OK | |
| 495 audio_driver_send_status(AUDIO_OK,AUDIO_STOP_STATUS,channel_id,return_path); | |
| 496 | |
| 497 // change state | |
| 498 p_session->session_info.state=AUDIO_DRIVER_CHANNEL_WAIT_INIT; | |
| 499 } | |
| 500 break; | |
| 501 #if (L1_VOICE_MEMO_AMR) | |
| 502 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 503 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 504 #endif | |
| 505 #if (L1_MIDI == 1) | |
| 506 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 507 #endif | |
| 508 audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); | |
| 509 audio_driver_init_send_status(AUDIO_ERROR, session_id, 0, return_path); | |
| 510 break; | |
| 511 case AUDIO_DRIVER_FREE_SESSION: | |
| 512 audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); | |
| 513 audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); | |
| 514 break; | |
| 515 } // switch | |
| 516 } //case AUDIO_DRIVER_CHANNEL_WAIT_START: | |
| 517 break; | |
| 518 case AUDIO_DRIVER_CHANNEL_WAIT_START_CON: | |
| 519 { | |
| 520 switch (p_message->msg_id) | |
| 521 { | |
| 522 #if (L1_VOICE_MEMO_AMR) | |
| 523 case MMI_VM_AMR_RECORD_START_CON: | |
| 524 case MMI_VM_AMR_PLAY_START_CON: | |
| 525 #endif | |
| 526 #if (L1_MIDI == 1) | |
| 527 case MMI_MIDI_START_CON: | |
| 528 #endif | |
| 529 // change state | |
| 530 p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_STOP; | |
| 531 break; | |
| 532 case AUDIO_DRIVER_STOP_SESSION: | |
| 533 // change state | |
| 534 p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_START_CON_TO_STOP; | |
| 535 break; | |
| 536 #if (L1_VOICE_MEMO_AMR) | |
| 537 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 538 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 539 #endif | |
| 540 #if (L1_MIDI == 1) | |
| 541 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 542 #endif | |
| 543 audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); | |
| 544 audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); | |
| 545 break; | |
| 546 case AUDIO_DRIVER_START_SESSION: | |
| 547 audio_driver_error_trace(AUDIO_ERROR_START_EVENT); | |
| 548 audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); | |
| 549 break; | |
| 550 case AUDIO_DRIVER_FREE_SESSION: | |
| 551 audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); | |
| 552 audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); | |
| 553 break; | |
| 554 } // switch | |
| 555 } //case AUDIO_DRIVER_CHANNEL_WAIT_START_CON: | |
| 556 break; | |
| 557 case AUDIO_DRIVER_CHANNEL_WAIT_STOP: | |
| 558 { | |
| 559 switch (p_message->msg_id) | |
| 560 { | |
| 561 case AUDIO_DRIVER_STOP_SESSION: | |
| 562 { | |
| 563 // 1st stop request | |
| 564 if (p_session->session_info.stop_request == 0) | |
| 565 { | |
| 566 T_AUDIO_RET result; | |
| 567 | |
| 568 // send l1 message STOP_REQ | |
| 569 switch(p_session->session_req.session_id) | |
| 570 { | |
| 571 #if (L1_VOICE_MEMO_AMR) | |
| 572 case AUDIO_VM_AMR_RECORD_SESSION_ID: | |
| 573 result=audio_driver_vm_amr_record_manager(p_message,p_session); | |
| 574 break; | |
| 575 case AUDIO_VM_AMR_PLAY_SESSION_ID: | |
| 576 result=audio_driver_vm_amr_play_manager(p_message,p_session); | |
| 577 break; | |
| 578 #endif | |
| 579 #if (L1_MIDI == 1) | |
| 580 case AUDIO_MIDI_SESSION_ID: | |
| 581 result=audio_driver_midi_manager(p_message,p_session); | |
| 582 break; | |
| 583 #endif | |
| 584 } | |
| 585 | |
| 586 // allocate or send L1 msg went wrong | |
| 587 if (result != AUDIO_OK) | |
| 588 { | |
| 589 audio_driver_error_trace(AUDIO_ERROR_L1_STOP_EVENT); | |
| 590 audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); | |
| 591 return; | |
| 592 } | |
| 593 | |
| 594 // STOP has been requested, no longer accept it | |
| 595 p_session->session_info.stop_request = 1; | |
| 596 } | |
| 597 else | |
| 598 { | |
| 599 audio_driver_error_trace(AUDIO_ERROR_STOP_EVENT); | |
| 600 audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); | |
| 601 } | |
| 602 } | |
| 603 break; | |
| 604 #if (L1_VOICE_MEMO_AMR) | |
| 605 case MMI_VM_AMR_RECORD_STOP_CON: | |
| 606 { | |
| 607 // send last notification | |
| 608 T_AUDIO_DRIVER_LAST_NOTIFICATION *p_status_message; | |
| 609 | |
| 610 // Allocate the Riviera buffer | |
| 611 mb_status = RVF_RED; | |
| 612 while (mb_status == RVF_RED) | |
| 613 { | |
| 614 mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal, | |
| 615 sizeof (T_AUDIO_DRIVER_LAST_NOTIFICATION), | |
| 616 (T_RVF_BUFFER **) (&p_status_message)); | |
| 617 // If insufficient resources, then report a memory error and abort. | |
| 618 if (mb_status == RVF_RED) | |
| 619 { | |
| 620 // the memory is insufficient to continue the non regression test | |
| 621 audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
| 622 rvf_delay(RVF_MS_TO_TICKS(1000)); | |
| 623 } | |
| 624 } | |
| 625 | |
| 626 // Fill the message ID | |
| 627 p_status_message->header.msg_id = AUDIO_DRIVER_LAST_NOTIFICATION_MSG; | |
| 628 | |
| 629 // fill parameters | |
| 630 p_status_message->channel_id = channel_id; | |
| 631 p_status_message->recorded_size = ((T_MMI_VM_AMR_RECORD_CON *)p_message)->recorded_size - SC_VM_AMR_END_MASK_SIZE; | |
| 632 p_status_message->p_buffer = | |
| 633 (UINT16 *)p_session->session_info.buffer[p_session->session_info.index_l1].p_start_pointer; | |
| 634 | |
| 635 if (return_path.callback_func == NULL) | |
| 636 rvf_send_msg (return_path.addr_id, p_status_message); | |
| 637 else | |
| 638 { | |
| 639 // call the callback function | |
| 640 (*(return_path.callback_func))((void *)(p_status_message)); | |
| 641 rvf_free_buf((T_RVF_BUFFER *)p_status_message); | |
| 642 } | |
| 643 | |
| 644 // change state | |
| 645 p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_FREE; | |
| 646 } | |
| 647 break; | |
| 648 #endif // #if (L1_VOICE_MEMO_AMR) | |
| 649 #if (L1_VOICE_MEMO_AMR) | |
| 650 case MMI_VM_AMR_PLAY_STOP_CON: | |
| 651 #endif | |
| 652 #if (L1_MIDI == 1) | |
| 653 case MMI_MIDI_STOP_CON: | |
| 654 #endif | |
| 655 { | |
| 656 // deallocate buffers | |
| 657 for (j = 0; j < p_session->session_req.nb_buffer; j++) | |
| 658 { | |
| 659 mb_status = rvf_free_buf ((T_RVF_BUFFER *) (p_session->session_info.buffer[j].p_start_pointer)); | |
| 660 | |
| 661 AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER MANAGER: deallocate buffer", j, RV_TRACE_LEVEL_DEBUG_LOW); | |
| 662 | |
| 663 if (mb_status != RVF_GREEN) | |
| 664 AUDIO_SEND_TRACE_PARAM("can't deallocate buffer", j, RV_TRACE_LEVEL_ERROR); | |
| 665 } | |
| 666 // Deallocate buffers pointer | |
| 667 rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer); | |
| 668 | |
| 669 audio_driver_send_status (AUDIO_OK, AUDIO_STOP_STATUS, channel_id, | |
| 670 return_path); | |
| 671 // change state | |
| 672 p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_INIT; | |
| 673 } | |
| 674 break; | |
| 675 #if (L1_VOICE_MEMO_AMR) | |
| 676 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 677 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 678 #endif | |
| 679 #if (L1_MIDI == 1) | |
| 680 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 681 #endif | |
| 682 audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); | |
| 683 audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); | |
| 684 break; | |
| 685 case AUDIO_DRIVER_START_SESSION: | |
| 686 audio_driver_error_trace(AUDIO_ERROR_START_EVENT); | |
| 687 audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); | |
| 688 break; | |
| 689 case AUDIO_DRIVER_FREE_SESSION: | |
| 690 audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); | |
| 691 audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); | |
| 692 break; | |
| 693 } //switch | |
| 694 } //case AUDIO_DRIVER_CHANNEL_WAIT_STOP: | |
| 695 break; | |
| 696 case AUDIO_DRIVER_CHANNEL_WAIT_START_CON_TO_STOP: | |
| 697 { | |
| 698 T_AUDIO_RET result = AUDIO_OK; | |
| 699 switch (p_message->msg_id) | |
| 700 { | |
| 701 #if (L1_VOICE_MEMO_AMR) | |
| 702 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 703 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 704 #endif | |
| 705 #if (L1_MIDI == 1) | |
| 706 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 707 #endif | |
| 708 audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); | |
| 709 audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); | |
| 710 return; | |
| 711 break; | |
| 712 case AUDIO_DRIVER_START_SESSION: | |
| 713 audio_driver_error_trace(AUDIO_ERROR_START_EVENT); | |
| 714 audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); | |
| 715 return; | |
| 716 break; | |
| 717 case AUDIO_DRIVER_STOP_SESSION: | |
| 718 audio_driver_error_trace(AUDIO_ERROR_STOP_EVENT); | |
| 719 audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); | |
| 720 return; | |
| 721 break; | |
| 722 case AUDIO_DRIVER_FREE_SESSION: | |
| 723 audio_driver_error_trace(AUDIO_ERROR_FREE_EVENT); | |
| 724 audio_driver_send_status(AUDIO_ERROR, AUDIO_FREE_STATUS, channel_id, return_path); | |
| 725 return; | |
| 726 break; | |
| 727 #if (L1_VOICE_MEMO_AMR) | |
| 728 case MMI_VM_AMR_RECORD_START_CON: | |
| 729 // send L1 stop msg | |
| 730 result=audio_driver_vm_amr_record_manager(p_message, p_session); | |
| 731 break; | |
| 732 case MMI_VM_AMR_PLAY_START_CON: | |
| 733 // send L1 stop msg | |
| 734 result=audio_driver_vm_amr_play_manager(p_message, p_session); | |
| 735 break; | |
| 736 #endif | |
| 737 #if (L1_MIDI == 1) | |
| 738 case MMI_MIDI_START_CON: | |
| 739 // send L1 stop msg | |
| 740 result=audio_driver_midi_manager(p_message,p_session); | |
| 741 break; | |
| 742 #endif | |
| 743 } | |
| 744 | |
| 745 if (result != AUDIO_OK) | |
| 746 { | |
| 747 audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); | |
| 748 return; | |
| 749 } | |
| 750 else | |
| 751 { | |
| 752 // next state should be WAIT_STOP_CON, which is WAIT_STOP + stop_request == 1 | |
| 753 p_session->session_info.stop_request = 1; | |
| 754 // change state | |
| 755 p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_STOP; | |
| 756 } | |
| 757 } | |
| 758 break; | |
| 759 case AUDIO_DRIVER_CHANNEL_WAIT_FREE: | |
| 760 { | |
| 761 switch (p_message->msg_id) | |
| 762 { | |
| 763 case AUDIO_DRIVER_FREE_SESSION: | |
| 764 { | |
| 765 // deallocate buffers | |
| 766 for (j = 0; j < p_session->session_req.nb_buffer; j++) | |
| 767 { | |
| 768 mb_status = rvf_free_buf ((T_RVF_BUFFER *) (p_session->session_info.buffer[j].p_start_pointer)); | |
| 769 | |
| 770 AUDIO_SEND_TRACE_PARAM("AUDIO DRIVER MANAGER: deallocate buffer", j, RV_TRACE_LEVEL_DEBUG_LOW); | |
| 771 | |
| 772 if (mb_status != RVF_GREEN) | |
| 773 AUDIO_SEND_TRACE_PARAM("can't deallocate buffer", j, RV_TRACE_LEVEL_ERROR); | |
| 774 } | |
| 775 // Deallocate buffers pointer | |
| 776 rvf_free_buf((T_RVF_BUFFER *)p_session->session_info.buffer); | |
| 777 | |
| 778 audio_driver_send_status (AUDIO_OK, AUDIO_FREE_STATUS, channel_id, | |
| 779 return_path); | |
| 780 | |
| 781 // change state | |
| 782 p_session->session_info.state = AUDIO_DRIVER_CHANNEL_WAIT_INIT; | |
| 783 } | |
| 784 break; | |
| 785 #if (L1_VOICE_MEMO_AMR) | |
| 786 case AUDIO_DRIVER_INIT_VM_AMR_RECORD_SESSION: | |
| 787 case AUDIO_DRIVER_INIT_VM_AMR_PLAY_SESSION: | |
| 788 #endif | |
| 789 #if (L1_MIDI == 1) | |
| 790 case AUDIO_DRIVER_INIT_MIDI_SESSION: | |
| 791 #endif | |
| 792 audio_driver_error_trace(AUDIO_ERROR_INIT_EVENT); | |
| 793 audio_driver_init_send_status(AUDIO_ERROR, session_id, channel_id, return_path); | |
| 794 break; | |
| 795 case AUDIO_DRIVER_START_SESSION: | |
| 796 audio_driver_error_trace(AUDIO_ERROR_START_EVENT); | |
| 797 audio_driver_send_status(AUDIO_ERROR, AUDIO_START_STATUS, channel_id, return_path); | |
| 798 break; | |
| 799 case AUDIO_DRIVER_STOP_SESSION: | |
| 800 audio_driver_error_trace(AUDIO_ERROR_STOP_EVENT); | |
| 801 audio_driver_send_status(AUDIO_ERROR, AUDIO_STOP_STATUS, channel_id, return_path); | |
| 802 break; | |
| 803 } // switch | |
| 804 } | |
| 805 break; | |
| 806 } | |
| 807 } | |
| 808 #endif // (L1_AUDIO_DRIVER) | |
| 809 | |
| 810 #endif // #ifdef RVM_AUDIO_MAIN_SWE |
