FreeCalypso > hg > fc-tourmaline
comparison src/cs/services/audio/audio_midi.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4e78acac3d88 |
---|---|
1 /****************************************************************************/ | |
2 /* */ | |
3 /* File Name: audio_midi.c */ | |
4 /* */ | |
5 /* Purpose: This file contains all the functions used to manage MIDI */ | |
6 /* */ | |
7 /* Version 0.1 */ | |
8 /* */ | |
9 /* Date Modification */ | |
10 /* ------------------------------------ */ | |
11 /* 11 June 2003 Create */ | |
12 /* */ | |
13 /* Author */ | |
14 /* Fabrice Goucem */ | |
15 /* */ | |
16 /* (C) Copyright 2003 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 the usefull L1 header | |
28 #include "l1_confg.h" | |
29 | |
30 #include "rv/rv_general.h" | |
31 #include "rvm/rvm_gen.h" | |
32 #include "audio/audio_features_i.h" | |
33 #include "audio/audio_ffs_i.h" | |
34 #include "audio/audio_api.h" | |
35 #include "audio/audio_structs_i.h" | |
36 #include "audio/audio_var_i.h" | |
37 #include "audio/audio_messages_i.h" | |
38 #include "rvf/rvf_target.h" | |
39 #include "audio/audio_const_i.h" | |
40 #include "audio/audio_error_hdlr_i.h" | |
41 #include "audio/audio_macro_i.h" | |
42 | |
43 // include the useful L1 header | |
44 #define BOOL_FLAG | |
45 #define CHAR_FLAG | |
46 #include "l1_types.h" | |
47 #include "l1audio_cust.h" | |
48 #include "l1audio_msgty.h" | |
49 #include "l1audio_signa.h" | |
50 | |
51 | |
52 /********************************************************************************/ | |
53 /* */ | |
54 /* Function Name: audio_midi_start */ | |
55 /* */ | |
56 /* Purpose: This function is called to initiate a MIDI file playback */ | |
57 /* */ | |
58 /* Input Parameters: */ | |
59 /* Midi file parameters, */ | |
60 /* Return path. */ | |
61 /* */ | |
62 /* Output Parameters: */ | |
63 /* Validation of the MIDI parameters. */ | |
64 /* */ | |
65 /* Note: */ | |
66 /* None. */ | |
67 /* */ | |
68 /* Revision History: */ | |
69 /* None. */ | |
70 /* */ | |
71 /********************************************************************************/ | |
72 T_AUDIO_RET audio_midi_start(T_AUDIO_MIDI_PARAMETER *parameter, T_RV_RETURN *p_return_path) | |
73 { | |
74 #if (L1_MIDI==1) | |
75 // Declare local variables | |
76 T_RVF_MB_STATUS mb_status=RVF_GREEN; | |
77 T_AUDIO_MIDI_START *p_msg_start=NULL; | |
78 T_FFS_FD ffs_fd; | |
79 | |
80 /************************ audio_midi_start function begins ******************/ | |
81 | |
82 if(p_audio_gbl_var==NULL) | |
83 { | |
84 audio_midi_error_trace(AUDIO_ENTITY_NOT_START); | |
85 return(AUDIO_ERROR); | |
86 } | |
87 | |
88 // check if the midi file exists | |
89 #ifndef _WINDOWS | |
90 ffs_fd=ffs_open(parameter->midi_name,FFS_O_RDONLY); | |
91 if(ffs_fd<=0) | |
92 { | |
93 audio_midi_error_trace(AUDIO_ENTITY_FILE_ERROR); | |
94 return(AUDIO_ERROR); | |
95 } | |
96 #else | |
97 ffs_fd=0xdeadbeef; | |
98 #endif // _WINDOWS | |
99 | |
100 // allocate the memory for the message to send | |
101 mb_status=rvf_get_buf(p_audio_gbl_var->mb_external, | |
102 sizeof(T_AUDIO_MIDI_START), | |
103 (T_RVF_BUFFER **)(&p_msg_start)); | |
104 | |
105 // If insufficient resources, then report a memory error and abort | |
106 if(mb_status==RVF_YELLOW) | |
107 { | |
108 // deallocate the memory | |
109 rvf_free_buf((T_RVF_BUFFER *)p_msg_start); | |
110 audio_midi_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
111 #ifndef _WINDOWS | |
112 ffs_close(ffs_fd); | |
113 #endif | |
114 return(AUDIO_ERROR); | |
115 } | |
116 else | |
117 { | |
118 if(mb_status==RVF_RED) | |
119 { | |
120 audio_midi_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
121 #ifndef _WINDOWS | |
122 ffs_close(ffs_fd); | |
123 #endif | |
124 return (AUDIO_ERROR); | |
125 } | |
126 } | |
127 | |
128 // fill the message id | |
129 p_msg_start->os_hdr.msg_id=AUDIO_MIDI_START_REQ; | |
130 | |
131 // fill the address source id | |
132 p_msg_start->os_hdr.src_addr_id =rvf_get_taskid(); | |
133 p_msg_start->os_hdr.dest_addr_id=p_audio_gbl_var->addrId; | |
134 | |
135 // fill the message parameters | |
136 p_msg_start->audio_ffs_fd=ffs_fd; | |
137 | |
138 if(p_return_path->callback_func==NULL) | |
139 { | |
140 p_msg_start->return_path.addr_id=p_return_path->addr_id; | |
141 p_msg_start->return_path.callback_func=NULL; | |
142 } | |
143 else | |
144 p_msg_start->return_path.callback_func=p_return_path->callback_func; | |
145 | |
146 // send the messsage to the audio entity | |
147 rvf_send_msg(p_audio_gbl_var->addrId,p_msg_start); | |
148 | |
149 return(AUDIO_OK); | |
150 #else // L1_MIDI==1 | |
151 AUDIO_SEND_TRACE("MIDI not compiled",RV_TRACE_LEVEL_DEBUG_LOW); | |
152 return(AUDIO_ERROR); | |
153 #endif // L1_MIDI==1 | |
154 } /*********************** End of audio_midi_start function ******************/ | |
155 | |
156 | |
157 /********************************************************************************/ | |
158 /* */ | |
159 /* Function Name: audio_midi_stop */ | |
160 /* */ | |
161 /* Purpose: This function is called to stop MIDI file playback */ | |
162 /* */ | |
163 /* Input Parameters: */ | |
164 /* Return path. */ | |
165 /* */ | |
166 /* Output Parameters: */ | |
167 /* None. */ | |
168 /* */ | |
169 /* Note: */ | |
170 /* None. */ | |
171 /* */ | |
172 /* Revision History: */ | |
173 /* None. */ | |
174 /* */ | |
175 /********************************************************************************/ | |
176 T_AUDIO_RET audio_midi_stop(void) | |
177 { | |
178 #if (L1_MIDI==1) | |
179 // Declare local variables | |
180 T_RVF_MB_STATUS mb_status =RVF_GREEN; | |
181 T_AUDIO_MIDI_STOP *p_msg_stop=NULL; | |
182 | |
183 /************************ audio_midi_stop function begins ****************/ | |
184 | |
185 if(p_audio_gbl_var==NULL) | |
186 { | |
187 audio_midi_error_trace(AUDIO_ENTITY_NOT_START); | |
188 return(AUDIO_ERROR); | |
189 } | |
190 | |
191 // allocate the memory for the message to send | |
192 mb_status=rvf_get_buf(p_audio_gbl_var->mb_external, | |
193 sizeof(T_AUDIO_MIDI_STOP), | |
194 (T_RVF_BUFFER **)(&p_msg_stop)); | |
195 | |
196 // If insufficient resources, then report a memory error and abort | |
197 if(mb_status==RVF_YELLOW) | |
198 { | |
199 // deallocate the memory | |
200 rvf_free_buf((T_RVF_BUFFER *)p_msg_stop); | |
201 audio_midi_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
202 return(AUDIO_ERROR); | |
203 } | |
204 else | |
205 { | |
206 if(mb_status==RVF_RED) | |
207 { | |
208 audio_midi_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
209 return(AUDIO_ERROR); | |
210 } | |
211 } | |
212 | |
213 // fill the message id | |
214 p_msg_stop->os_hdr.msg_id=AUDIO_MIDI_STOP_REQ; | |
215 | |
216 // fill the address source id | |
217 p_msg_stop->os_hdr.src_addr_id =rvf_get_taskid(); | |
218 p_msg_stop->os_hdr.dest_addr_id=p_audio_gbl_var->addrId; | |
219 | |
220 // send the messsage to the audio entity | |
221 rvf_send_msg(p_audio_gbl_var->addrId,p_msg_stop); | |
222 | |
223 return(AUDIO_OK); | |
224 #else // L1_MIDI==1 | |
225 AUDIO_SEND_TRACE("MIDI not compiled",RV_TRACE_LEVEL_DEBUG_LOW); | |
226 return(AUDIO_ERROR); | |
227 #endif // L1_MIDI==1 | |
228 } /*********************** End of audio_midi_stop function *******************/ | |
229 | |
230 #if (L1_MIDI == 1) | |
231 | |
232 /********************************************************************************/ | |
233 /* */ | |
234 /* Function Name: audio_midi_message_switch */ | |
235 /* */ | |
236 /* Purpose: Manage the message supply */ | |
237 /* */ | |
238 /* Input Parameters: */ | |
239 /* start or stop message from midi features */ | |
240 /* */ | |
241 /* Output Parameters: */ | |
242 /* index of the manager */ | |
243 /* */ | |
244 /* Note: */ | |
245 /* None. */ | |
246 /* */ | |
247 /* Revision History: */ | |
248 /* None. */ | |
249 /* */ | |
250 /********************************************************************************/ | |
251 UINT8 audio_midi_message_switch(T_RV_HDR *p_message) | |
252 { | |
253 switch(p_message->msg_id) | |
254 { | |
255 case AUDIO_MIDI_START_REQ: | |
256 case AUDIO_MIDI_STOP_REQ: | |
257 return(AUDIO_MIDI); | |
258 break; | |
259 | |
260 // driver init => check session_id is MIDI | |
261 case AUDIO_DRIVER_INIT_STATUS_MSG: | |
262 { | |
263 UINT8 session_id=((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->session_id; | |
264 | |
265 // session_id is MIDI | |
266 if((session_id==AUDIO_MIDI_SESSION_ID) && (p_audio_gbl_var->midi.state!=AUDIO_IDLE)) | |
267 return(AUDIO_MIDI); | |
268 else | |
269 return(AUDIO_MIDI_NONE); | |
270 } | |
271 break; | |
272 | |
273 case AUDIO_DRIVER_NOTIFICATION_MSG: | |
274 { | |
275 UWORD8 channel_id; | |
276 channel_id=((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->channel_id; | |
277 if((channel_id==p_audio_gbl_var->midi.channel_id) && (p_audio_gbl_var->midi.state>AUDIO_WAIT_CHANNEL_ID)) | |
278 return(AUDIO_MIDI); | |
279 else | |
280 return(AUDIO_MIDI_NONE); | |
281 } | |
282 break; | |
283 | |
284 case AUDIO_DRIVER_STATUS_MSG: | |
285 { | |
286 UWORD8 channel_id; | |
287 channel_id=((T_AUDIO_DRIVER_STATUS *)p_message)->channel_id; | |
288 if((channel_id==p_audio_gbl_var->midi.channel_id) && (p_audio_gbl_var->midi.state>AUDIO_WAIT_CHANNEL_ID)) | |
289 return(AUDIO_MIDI); | |
290 else | |
291 return(AUDIO_MIDI_NONE); | |
292 } | |
293 break; | |
294 | |
295 default: | |
296 return(AUDIO_MIDI_NONE); | |
297 break; | |
298 } // switch | |
299 } | |
300 | |
301 | |
302 /********************************************************************************/ | |
303 /* */ | |
304 /* Function Name: audio_midi_send_status */ | |
305 /* */ | |
306 /* Purpose: This function sends the MIDI play status to the entity */ | |
307 /* */ | |
308 /* Input Parameters: */ | |
309 /* status, */ | |
310 /* return path */ | |
311 /* */ | |
312 /* Output Parameters: */ | |
313 /* None. */ | |
314 /* */ | |
315 /* Note: */ | |
316 /* None. */ | |
317 /* */ | |
318 /* Revision History: */ | |
319 /* None. */ | |
320 /* */ | |
321 /********************************************************************************/ | |
322 void audio_midi_send_status(T_AUDIO_RET status, T_RV_RETURN *return_path) | |
323 { | |
324 T_AUDIO_MIDI_STATUS *p_send_message; | |
325 T_RVF_MB_STATUS mb_status=RVF_RED; | |
326 | |
327 // allocate the message buffer | |
328 while(mb_status==RVF_RED) | |
329 { | |
330 mb_status=rvf_get_buf(p_audio_gbl_var->mb_external, | |
331 sizeof(T_AUDIO_MIDI_STATUS), | |
332 (T_RVF_BUFFER **)(&p_send_message)); | |
333 | |
334 // If insufficient resources, then report a memory error and abort | |
335 // and wait until more ressource is given | |
336 if(mb_status==RVF_RED) | |
337 { | |
338 audio_midi_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
339 rvf_delay(RVF_MS_TO_TICKS(1000)); | |
340 } | |
341 } | |
342 | |
343 // fill the header of the message | |
344 p_send_message->os_hdr.msg_id=AUDIO_MIDI_STATUS_MSG; | |
345 | |
346 // fill the status parameters | |
347 p_send_message->status=status; | |
348 | |
349 // send message or call callback | |
350 if(return_path->callback_func==NULL) | |
351 { | |
352 rvf_send_msg(return_path->addr_id,p_send_message); | |
353 } | |
354 else | |
355 { | |
356 (*(return_path->callback_func))((void *)p_send_message); | |
357 rvf_free_buf((T_RVF_BUFFER *)p_send_message); | |
358 } | |
359 } | |
360 | |
361 | |
362 | |
363 /********************************************************************************/ | |
364 /* */ | |
365 /* Function Name: audio_midi_manager */ | |
366 /* */ | |
367 /* Purpose: This function is called to manage a MIDI play manager */ | |
368 /* */ | |
369 /* Input Parameters: */ | |
370 /* Message to the audio entity */ | |
371 /* */ | |
372 /* Output Parameters: */ | |
373 /* None. */ | |
374 /* */ | |
375 /* Note: */ | |
376 /* None. */ | |
377 /* */ | |
378 /* Revision History: */ | |
379 /* None. */ | |
380 /* */ | |
381 /********************************************************************************/ | |
382 void audio_midi_manager(T_RV_HDR *p_message) | |
383 { | |
384 // Declare local variables | |
385 T_RV_HDR *p_send_message; | |
386 T_RVF_MB_STATUS mb_status; | |
387 T_RV_RETURN return_path; | |
388 | |
389 // initialize the return path | |
390 return_path.callback_func=NULL; | |
391 return_path.addr_id=p_audio_gbl_var->addrId; | |
392 | |
393 /**************** audio_midi_manager function begins ***********************/ | |
394 switch(p_audio_gbl_var->midi.state) | |
395 { | |
396 case AUDIO_IDLE: | |
397 { | |
398 switch(p_message->msg_id) | |
399 { | |
400 case AUDIO_MIDI_START_REQ: | |
401 { | |
402 T_AUDIO_DRIVER_PARAMETER driver_parameter; | |
403 p_audio_gbl_var->midi.stop_req_allowed=TRUE; | |
404 | |
405 // save the return path + ffs_fd | |
406 p_audio_gbl_var->midi.return_path.callback_func=((T_AUDIO_MIDI_START *)p_message)->return_path.callback_func; | |
407 p_audio_gbl_var->midi.return_path.addr_id=((T_AUDIO_MIDI_START *)p_message)->return_path.addr_id; | |
408 p_audio_gbl_var->midi.ffs_fd=((T_AUDIO_MIDI_START *)p_message)->audio_ffs_fd; | |
409 | |
410 // driver parameters | |
411 driver_parameter.nb_buffer = AUDIO_MIDI_NB_BUFFER; | |
412 driver_parameter.buffer_size = AUDIO_MIDI_SIZE; // 16 bit words | |
413 | |
414 // return_path for driver | |
415 return_path.callback_func = NULL; | |
416 return_path.addr_id = p_audio_gbl_var->addrId; | |
417 | |
418 // init driver | |
419 audio_driver_init_midi_session(&driver_parameter,&return_path); | |
420 | |
421 p_audio_gbl_var->midi.state=AUDIO_WAIT_CHANNEL_ID; | |
422 } | |
423 break; | |
424 case AUDIO_MIDI_STOP_REQ: | |
425 { | |
426 audio_midi_error_trace(AUDIO_ERROR_STOP_EVENT); | |
427 // do not send a status message because of pre-emption issues | |
428 // An automatic stop can pre-empt a stop request. A status is sent + back in state idle | |
429 // then the stop request is received and another status is sent, which can be misinterpreted | |
430 } | |
431 break; | |
432 } | |
433 } | |
434 break; // AUDIO_IDLE | |
435 | |
436 case AUDIO_WAIT_CHANNEL_ID: | |
437 { | |
438 switch(p_message->msg_id) | |
439 { | |
440 case AUDIO_DRIVER_INIT_STATUS_MSG: | |
441 { | |
442 UINT8 *play_buffer; | |
443 INT16 size_read; | |
444 | |
445 // check init is successfull otherwise, send status AUDIO_ERROR | |
446 if(((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->status==AUDIO_OK) | |
447 { | |
448 // get channel id | |
449 p_audio_gbl_var->midi.channel_id=((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->channel_id; | |
450 | |
451 // initializations | |
452 p_audio_gbl_var->midi.size = AUDIO_MIDI_SIZE << 1; | |
453 p_audio_gbl_var->midi.stop_req_allowed=TRUE; | |
454 | |
455 // fill all buffers in advance | |
456 while(audio_driver_get_play_buffer(p_audio_gbl_var->midi.channel_id,&play_buffer)==AUDIO_OK) | |
457 { | |
458 // write from FLASH to RAM buffer | |
459 if(p_audio_gbl_var->midi.ffs_fd!=NULL) | |
460 { | |
461 #ifndef _WINDOWS | |
462 size_read=ffs_read(p_audio_gbl_var->midi.ffs_fd,play_buffer,p_audio_gbl_var->midi.size); | |
463 #else | |
464 size_read=p_audio_gbl_var->midi.size; | |
465 #endif | |
466 if(size_read<EFFS_OK) | |
467 { | |
468 #ifndef _WINDOWS | |
469 if(ffs_close(p_audio_gbl_var->midi.ffs_fd)!=EFFS_OK) | |
470 audio_mem_error_trace(AUDIO_ENTITY_FILE_NO_CLOSE); | |
471 #endif | |
472 AUDIO_SEND_TRACE("AUDIO MIDI: FFS PLAY READ failed",RV_TRACE_LEVEL_DEBUG_LOW); | |
473 audio_mem_send_status(AUDIO_ERROR,p_audio_gbl_var->midi.channel_id,AUDIO_START_STATUS,return_path); | |
474 return; | |
475 } | |
476 } | |
477 | |
478 AUDIO_SEND_TRACE_PARAM("AUDIO MIDI: size read",size_read,RV_TRACE_LEVEL_DEBUG_LOW); | |
479 | |
480 audio_driver_play_buffer(p_audio_gbl_var->midi.channel_id,play_buffer); | |
481 } | |
482 | |
483 // send message | |
484 audio_driver_start_session(p_audio_gbl_var->midi.channel_id,return_path); | |
485 | |
486 // change state | |
487 p_audio_gbl_var->midi.state=AUDIO_WAIT_STOP; | |
488 } | |
489 else | |
490 { | |
491 audio_midi_error_trace(AUDIO_ERROR_START_EVENT); | |
492 audio_midi_send_status(AUDIO_ERROR, &p_audio_gbl_var->midi.return_path); | |
493 // change state | |
494 p_audio_gbl_var->midi.state=AUDIO_IDLE; | |
495 } | |
496 } | |
497 break; | |
498 case AUDIO_MIDI_STOP_REQ: | |
499 // change state | |
500 p_audio_gbl_var->midi.state=AUDIO_WAIT_CHANNEL_ID_TO_STOP; | |
501 break; | |
502 } | |
503 } // case AUDIO_WAIT_CHANNEL_ID: | |
504 break; | |
505 | |
506 case AUDIO_WAIT_STOP: | |
507 { | |
508 switch(p_message->msg_id) | |
509 { | |
510 case AUDIO_DRIVER_NOTIFICATION_MSG: | |
511 { | |
512 UINT8 *play_buffer; | |
513 INT16 size_read; | |
514 | |
515 // try to get a buffer | |
516 if(audio_driver_get_play_buffer(p_audio_gbl_var->midi.channel_id,&play_buffer)==AUDIO_OK) | |
517 { | |
518 #ifndef _WINDOWS | |
519 size_read=ffs_read(p_audio_gbl_var->midi.ffs_fd,play_buffer,p_audio_gbl_var->midi.size); | |
520 #else | |
521 size_read=p_audio_gbl_var->midi.size; | |
522 #endif | |
523 if(size_read<EFFS_OK) | |
524 { | |
525 AUDIO_SEND_TRACE("AUDIO MIDI: FFS PLAY READ FILED",RV_TRACE_LEVEL_DEBUG_LOW); | |
526 size_read=0; // will put END_MASK in whole buffer so stops play | |
527 } | |
528 audio_driver_play_buffer(p_audio_gbl_var->midi.channel_id,play_buffer); | |
529 | |
530 if(size_read>0) | |
531 AUDIO_SEND_TRACE_PARAM("AUDIO MIDI: size read",size_read,RV_TRACE_LEVEL_DEBUG_LOW); | |
532 else | |
533 AUDIO_SEND_TRACE("AUDIO MIDI: buffer not used",RV_TRACE_LEVEL_DEBUG_LOW); | |
534 } // if(audio_driver_get_play_buffer(channel_id,&p_buffer)==AUDIO_OK) | |
535 else | |
536 AUDIO_SEND_TRACE("AUDIO MIDI: no buffer available",RV_TRACE_LEVEL_DEBUG_LOW); | |
537 } | |
538 break; // case AUDIO_DRIVER_NOTIFICATION_MSG | |
539 | |
540 case AUDIO_MIDI_STOP_REQ: | |
541 if(p_audio_gbl_var->midi.stop_req_allowed==TRUE) | |
542 { | |
543 p_audio_gbl_var->midi.stop_req_allowed=FALSE; | |
544 audio_driver_stop_session(p_audio_gbl_var->midi.channel_id); | |
545 } | |
546 else | |
547 AUDIO_SEND_TRACE("AUDIO MIDI: second stop request received",RV_TRACE_LEVEL_WARNING); | |
548 break; | |
549 | |
550 case AUDIO_DRIVER_STATUS_MSG: | |
551 if(p_audio_gbl_var->midi.ffs_fd!=NULL) | |
552 { | |
553 #ifndef _WINDOWS | |
554 if(ffs_close(p_audio_gbl_var->midi.ffs_fd)!=EFFS_OK) audio_ffs_error_trace(AUDIO_ENTITY_FILE_NO_CLOSE); | |
555 #endif | |
556 AUDIO_SEND_TRACE("AUDIO MIDI: close FFS file", RV_TRACE_LEVEL_DEBUG_LOW); | |
557 } | |
558 audio_midi_send_status(AUDIO_OK,&p_audio_gbl_var->midi.return_path); | |
559 p_audio_gbl_var->midi.state=AUDIO_IDLE; | |
560 break; | |
561 } | |
562 } | |
563 break; // WAIT_STOP | |
564 | |
565 case AUDIO_WAIT_CHANNEL_ID_TO_STOP: | |
566 { | |
567 switch(p_message->msg_id) | |
568 { | |
569 case AUDIO_DRIVER_INIT_STATUS_MSG: | |
570 { | |
571 if(((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->status==AUDIO_OK) | |
572 { | |
573 // get channel_id | |
574 p_audio_gbl_var->midi.channel_id=((T_AUDIO_DRIVER_INIT_STATUS *)p_message)->channel_id; | |
575 | |
576 audio_driver_stop_session(p_audio_gbl_var->midi.channel_id); | |
577 | |
578 // change state | |
579 p_audio_gbl_var->midi.state=AUDIO_WAIT_DRIVER_STOP_CON; | |
580 } | |
581 else | |
582 { | |
583 // close file | |
584 if(p_audio_gbl_var->midi.ffs_fd!=NULL) | |
585 { | |
586 #ifndef _WINDOWS | |
587 if(ffs_close(p_audio_gbl_var->midi.ffs_fd)!=EFFS_OK) audio_ffs_error_trace(AUDIO_ENTITY_FILE_NO_CLOSE); | |
588 #endif | |
589 AUDIO_SEND_TRACE("AUDIO MIDI: close FFS file:",RV_TRACE_LEVEL_DEBUG_LOW); | |
590 } | |
591 | |
592 audio_midi_send_status(AUDIO_OK,&p_audio_gbl_var->midi.return_path); | |
593 | |
594 // change state | |
595 p_audio_gbl_var->midi.state=AUDIO_IDLE; | |
596 } | |
597 } | |
598 break; | |
599 case AUDIO_MIDI_STOP_REQ: | |
600 audio_midi_error_trace(AUDIO_ERROR_STOP_EVENT); | |
601 break; | |
602 } | |
603 } // case AUDIO_WAIT_CHANNEL_ID_TO_STOP: | |
604 break; | |
605 case AUDIO_WAIT_DRIVER_STOP_CON: | |
606 { | |
607 switch(p_message->msg_id) | |
608 { | |
609 case AUDIO_DRIVER_STATUS_MSG: | |
610 { | |
611 if(((T_AUDIO_DRIVER_STATUS *)p_message)->status_type==AUDIO_STOP_STATUS) | |
612 { | |
613 // close file | |
614 if(p_audio_gbl_var->midi.ffs_fd!=NULL) | |
615 { | |
616 #ifndef _WINDOWS | |
617 if(ffs_close(p_audio_gbl_var->midi.ffs_fd)!=EFFS_OK) audio_ffs_error_trace(AUDIO_ENTITY_FILE_NO_CLOSE); | |
618 #endif | |
619 AUDIO_SEND_TRACE("AUDIO MIDI: close FFS file",RV_TRACE_LEVEL_DEBUG_LOW); | |
620 } | |
621 | |
622 audio_midi_send_status(((T_AUDIO_DRIVER_STATUS *)p_message)->status, | |
623 &p_audio_gbl_var->midi.return_path); | |
624 p_audio_gbl_var->midi.state=AUDIO_IDLE; | |
625 } | |
626 } | |
627 break; | |
628 case AUDIO_MIDI_STOP_REQ: | |
629 audio_midi_error_trace(AUDIO_ERROR_STOP_EVENT); | |
630 break; | |
631 } | |
632 } //case AUDIO_WAIT_DRIVER_STOP_CON: | |
633 break; | |
634 } | |
635 } /*********************** End of audio_midi_manager function **********************/ | |
636 | |
637 /********************************************************************************/ | |
638 /* */ | |
639 /* Function Name: audio_driver_midi_manager */ | |
640 /* */ | |
641 /* Purpose: This function is called to manage a MIDI manager */ | |
642 /* */ | |
643 /* Input Parameters: */ | |
644 /* Message to the audio entity */ | |
645 /* */ | |
646 /* Output Parameters: */ | |
647 /* None. */ | |
648 /* */ | |
649 /* Note: */ | |
650 /* None. */ | |
651 /* */ | |
652 /* Revision History: */ | |
653 /* None. */ | |
654 /* */ | |
655 /********************************************************************************/ | |
656 T_AUDIO_RET audio_driver_midi_manager(T_RV_HDR *p_message, T_AUDIO_DRIVER_SESSION *p_session) | |
657 { | |
658 /**************** audio_driver_midi_manager function begins ***********************/ | |
659 switch(p_session->session_info.state) | |
660 { | |
661 case AUDIO_DRIVER_CHANNEL_WAIT_INIT: | |
662 // init buffer index, layer1 not valid until 1st buffer is filled | |
663 // index_l1 will be set to 0 when get_play_buffer() is called in WAIT_START state | |
664 p_session->session_info.index_l1 = 0xFF; | |
665 p_session->session_info.index_appli = 0; | |
666 p_session->session_info.play_api_state = AUDIO_PLAY_API_STATE_GET_BUF; | |
667 | |
668 // allocate the buffer for the message to the L1 | |
669 p_session->session_req.p_l1_send_message=audio_allocate_l1_message(sizeof(T_MMI_MIDI_REQ)); | |
670 ((T_MMI_MIDI_REQ *)(p_session->session_req.p_l1_send_message))->session_id=AUDIO_MIDI_SESSION_ID; | |
671 | |
672 if(p_session->session_req.p_l1_send_message!=NULL) | |
673 return(AUDIO_OK); | |
674 else | |
675 return(AUDIO_ERROR); | |
676 break; | |
677 | |
678 case AUDIO_DRIVER_CHANNEL_WAIT_START: | |
679 // send the start midi message to the L1 | |
680 audio_send_l1_message(MMI_MIDI_START_REQ,p_session->session_req.p_l1_send_message); | |
681 return(AUDIO_OK); | |
682 break; | |
683 | |
684 case AUDIO_DRIVER_CHANNEL_WAIT_STOP: | |
685 { | |
686 // send the stop command to the audio L1 | |
687 void *p_send_message=audio_allocate_l1_message(0); | |
688 if(p_send_message!=NULL) | |
689 { | |
690 // send the stop command to the audio L1 | |
691 audio_send_l1_message(MMI_MIDI_STOP_REQ,p_send_message); | |
692 return(AUDIO_OK); | |
693 } | |
694 return(AUDIO_ERROR); | |
695 } | |
696 break; | |
697 case AUDIO_DRIVER_CHANNEL_WAIT_START_CON_TO_STOP: | |
698 { | |
699 // send the stop command to the audio L1 | |
700 void *p_send_message=audio_allocate_l1_message(0); | |
701 if(p_send_message!=NULL) | |
702 { | |
703 // send the stop command to the audio L1 | |
704 audio_send_l1_message(MMI_MIDI_STOP_REQ,p_send_message); | |
705 return(AUDIO_OK); | |
706 } | |
707 return(AUDIO_ERROR); | |
708 } | |
709 break; | |
710 } | |
711 } /*********************** End of audio_driver_midi_manager function **********************/ | |
712 | |
713 | |
714 /********************************************************************************/ | |
715 /* */ | |
716 /* Function Name: audio_driver_init_midi_session */ | |
717 /* */ | |
718 /* Purpose: This function is called in order to initialize MIDI */ | |
719 /* */ | |
720 /* Input Parameters: */ | |
721 /* Specific MIDI parameters */ | |
722 /* Driver parameters */ | |
723 /* Return path */ | |
724 /* */ | |
725 /* Output Parameters: */ | |
726 /* Validation of the parameters */ | |
727 /* */ | |
728 /* Note: */ | |
729 /* None. */ | |
730 /* */ | |
731 /* Revision History: */ | |
732 /* None. */ | |
733 /* */ | |
734 /********************************************************************************/ | |
735 T_AUDIO_RET audio_driver_init_midi_session(T_AUDIO_DRIVER_PARAMETER *p_driver_parameter, T_RV_RETURN *p_return_path) | |
736 { | |
737 #if (L1_MIDI==1) | |
738 /* Declare local variables. */ | |
739 T_RVF_MB_STATUS mb_status = RVF_GREEN; | |
740 T_AUDIO_DRIVER_INIT_MIDI_SESSION *p_msg = NULL; | |
741 | |
742 /************************ audio_keybeep_stop function begins ****************/ | |
743 | |
744 if (p_audio_gbl_var == NULL ) | |
745 { | |
746 audio_driver_error_trace(AUDIO_ENTITY_NOT_START); | |
747 return(AUDIO_ERROR); | |
748 } | |
749 | |
750 /* If bad parameters report an error and abort.*/ | |
751 if(p_driver_parameter->nb_buffer<2) | |
752 { | |
753 audio_driver_error_trace(AUDIO_ENTITY_BAD_PARAMETER); | |
754 return (AUDIO_ERROR); | |
755 } | |
756 | |
757 /* allocate the memory for the message to send */ | |
758 mb_status = rvf_get_buf (p_audio_gbl_var->mb_internal, | |
759 sizeof (T_AUDIO_DRIVER_INIT_MIDI_SESSION), | |
760 (T_RVF_BUFFER **) (&p_msg)); | |
761 | |
762 /* If insufficient resources, then report a memory error and abort. */ | |
763 if (mb_status == RVF_YELLOW) | |
764 { | |
765 /* deallocate the memory */ | |
766 rvf_free_buf((T_RVF_BUFFER *)p_msg); | |
767 audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
768 return (AUDIO_ERROR); | |
769 } | |
770 else | |
771 if (mb_status == RVF_RED) | |
772 { | |
773 audio_driver_error_trace(AUDIO_ENTITY_NO_MEMORY); | |
774 return (AUDIO_ERROR); | |
775 } | |
776 | |
777 /* fill the message id */ | |
778 p_msg->os_hdr.msg_id = AUDIO_DRIVER_INIT_MIDI_SESSION; | |
779 p_msg->os_hdr.dest_addr_id = p_audio_gbl_var->addrId; | |
780 | |
781 /* fill parameters */ | |
782 p_msg->driver_parameter.buffer_size = p_driver_parameter->buffer_size; | |
783 p_msg->driver_parameter.nb_buffer = p_driver_parameter->nb_buffer; | |
784 | |
785 if (p_return_path->callback_func == NULL) | |
786 { | |
787 p_msg->return_path.addr_id = p_return_path->addr_id; | |
788 p_msg->return_path.callback_func = NULL; | |
789 } | |
790 else | |
791 p_msg->return_path.callback_func = p_return_path->callback_func; | |
792 | |
793 /* send the messsage to the audio entity */ | |
794 rvf_send_msg (p_audio_gbl_var->addrId, p_msg); | |
795 | |
796 return (AUDIO_OK); | |
797 #else // L1_MIDI==1 | |
798 AUDIO_SEND_TRACE("MIDI not compiled", RV_TRACE_LEVEL_DEBUG_LOW); | |
799 return (AUDIO_ERROR); | |
800 #endif // L1_MIDI==1 | |
801 } | |
802 | |
803 | |
804 /********************************************************************************/ | |
805 /* */ | |
806 /* Function Name: audio_midi_l1_simulator */ | |
807 /* */ | |
808 /* Purpose: This function simulates the L1 for MIDI */ | |
809 /* */ | |
810 /* Input Parameters: */ | |
811 /* event: Event that triggered the function */ | |
812 /* p_msg: Message (if any) associated with the event */ | |
813 /* */ | |
814 /* Note: */ | |
815 /* None. */ | |
816 /* */ | |
817 /* Revision History: */ | |
818 /* None. */ | |
819 /* */ | |
820 /********************************************************************************/ | |
821 void audio_midi_l1_simulator(UINT16 event, T_RV_HDR *p_message) | |
822 { | |
823 #ifdef _WINDOWS | |
824 enum { WAIT_START_REQ, WAIT_STOP }; | |
825 | |
826 T_RVF_MB_STATUS mb_status; | |
827 T_RV_RETURN *return_path=&(p_audio_gbl_var->audio_driver_session[p_audio_gbl_var->midi.channel_id].session_req.return_path); | |
828 | |
829 switch(p_audio_gbl_var->midi.l1_state) | |
830 { | |
831 case WAIT_START_REQ: | |
832 if(p_message->msg_id==MMI_MIDI_START_REQ) | |
833 { | |
834 rvf_start_timer(AUDIO_MIDI_L1_SIMUL_TIMER, | |
835 RVF_MS_TO_TICKS(1000), | |
836 AUDIO_MIDI_L1_SIMUL_ONE_SHOT_TIMER); | |
837 p_audio_gbl_var->midi.counter=10; | |
838 | |
839 // send MMI_MIDI_START_CON message to the Riviera audio entity | |
840 mb_status=rvf_get_buf(p_audio_gbl_var->mb_internal, | |
841 sizeof(T_AUDIO_DRIVER_NOTIFICATION), | |
842 (T_RVF_BUFFER **)(&p_message)); | |
843 if(mb_status==RVF_RED) | |
844 { | |
845 AUDIO_SEND_TRACE("AUDIO entity has no memory for driver notification",RV_TRACE_LEVEL_ERROR); | |
846 return; | |
847 } | |
848 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->header.msg_id=MMI_MIDI_START_CON; | |
849 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->channel_id=p_audio_gbl_var->midi.channel_id; | |
850 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->p_buffer=NULL; | |
851 if(return_path->callback_func==NULL) | |
852 rvf_send_msg(return_path->addr_id, p_message); | |
853 else | |
854 { | |
855 (*return_path->callback_func)((void *)(p_message)); | |
856 rvf_free_buf((T_RVF_BUFFER *)p_message); | |
857 } | |
858 | |
859 p_audio_gbl_var->midi.l1_state=WAIT_STOP; | |
860 return; | |
861 } | |
862 break; | |
863 | |
864 case WAIT_STOP: | |
865 if(event & AUDIO_MIDI_L1_SIMUL_TIMER_EVT_MASK) | |
866 { | |
867 p_audio_gbl_var->midi.counter--; | |
868 | |
869 // switch buffer | |
870 { | |
871 T_AUDIO_DRIVER_SESSION *p=&p_audio_gbl_var->audio_driver_session[p_audio_gbl_var->midi.channel_id]; | |
872 p->session_info.index_l1++; | |
873 if(p->session_info.index_l1==p->session_req.nb_buffer) p->session_info.index_l1=0; | |
874 } | |
875 | |
876 // send notification message to the Riviera audio entity | |
877 mb_status=rvf_get_buf(p_audio_gbl_var->mb_internal, | |
878 sizeof(T_AUDIO_DRIVER_NOTIFICATION), | |
879 (T_RVF_BUFFER **)(&p_message)); | |
880 if(mb_status==RVF_RED) | |
881 { | |
882 AUDIO_SEND_TRACE("AUDIO entity has no memory for driver notification",RV_TRACE_LEVEL_ERROR); | |
883 return; | |
884 } | |
885 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->header.msg_id=AUDIO_DRIVER_NOTIFICATION_MSG; | |
886 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->channel_id=p_audio_gbl_var->midi.channel_id; | |
887 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->p_buffer=NULL; | |
888 if(return_path->callback_func==NULL) | |
889 rvf_send_msg(return_path->addr_id, p_message); | |
890 else | |
891 { | |
892 (*return_path->callback_func)((void *)(p_message)); | |
893 rvf_free_buf((T_RVF_BUFFER *)p_message); | |
894 } | |
895 | |
896 // check if we're done with the simulation | |
897 if(p_audio_gbl_var->midi.counter==0) | |
898 { | |
899 rvf_stop_timer(AUDIO_MIDI_L1_SIMUL_TIMER); | |
900 | |
901 // send MMI_MIDI_STOP_CON message to the Riviera audio entity | |
902 mb_status=rvf_get_buf(p_audio_gbl_var->mb_internal, | |
903 sizeof(T_AUDIO_DRIVER_NOTIFICATION), | |
904 (T_RVF_BUFFER **)(&p_message)); | |
905 if(mb_status==RVF_RED) | |
906 { | |
907 AUDIO_SEND_TRACE("AUDIO entity has no memory for driver notification",RV_TRACE_LEVEL_ERROR); | |
908 return; | |
909 } | |
910 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->header.msg_id=MMI_MIDI_STOP_CON; | |
911 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->channel_id=p_audio_gbl_var->midi.channel_id; | |
912 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->p_buffer=NULL; | |
913 if(return_path->callback_func==NULL) | |
914 rvf_send_msg(return_path->addr_id, p_message); | |
915 else | |
916 { | |
917 (*return_path->callback_func)((void *)(p_message)); | |
918 rvf_free_buf((T_RVF_BUFFER *)p_message); | |
919 } | |
920 | |
921 p_audio_gbl_var->midi.l1_state=WAIT_START_REQ; | |
922 return; | |
923 } | |
924 rvf_start_timer(AUDIO_MIDI_L1_SIMUL_TIMER, | |
925 RVF_MS_TO_TICKS(1000), | |
926 AUDIO_MIDI_L1_SIMUL_ONE_SHOT_TIMER); | |
927 } | |
928 if(p_message->msg_id==MMI_MIDI_STOP_REQ) | |
929 { | |
930 rvf_stop_timer(AUDIO_MIDI_L1_SIMUL_TIMER); | |
931 | |
932 // send MMI_MIDI_STOP_CON message to the Riviera audio entity | |
933 mb_status=rvf_get_buf(p_audio_gbl_var->mb_internal, | |
934 sizeof(T_AUDIO_DRIVER_NOTIFICATION), | |
935 (T_RVF_BUFFER **)(&p_message)); | |
936 if(mb_status==RVF_RED) | |
937 { | |
938 AUDIO_SEND_TRACE("AUDIO entity has no memory for driver notification",RV_TRACE_LEVEL_ERROR); | |
939 return; | |
940 } | |
941 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->header.msg_id=MMI_MIDI_STOP_CON; | |
942 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->channel_id=p_audio_gbl_var->midi.channel_id; | |
943 ((T_AUDIO_DRIVER_NOTIFICATION *)p_message)->p_buffer=NULL; | |
944 if(return_path->callback_func==NULL) | |
945 rvf_send_msg(return_path->addr_id, p_message); | |
946 else | |
947 { | |
948 (*return_path->callback_func)((void *)(p_message)); | |
949 rvf_free_buf((T_RVF_BUFFER *)p_message); | |
950 } | |
951 | |
952 p_audio_gbl_var->midi.l1_state=WAIT_START_REQ; | |
953 return; | |
954 } | |
955 break; | |
956 } | |
957 #endif // _WINDOWS | |
958 } | |
959 | |
960 #endif // #if (L1_MIDI == 1) | |
961 #endif // #ifdef RVM_AUDIO_MAIN_SWE |