Functions | |
void | audio_queue_add (uns8 phrase) |
void | audio_queue_clear () |
uns8 | audio_queue_empty () |
void | audio_queue_process () |
Variables | |
uns8 | aq_end = 0 |
uns8 | aq_start = 0 |
bit | audio_playing = 0 |
uns8 | audio_queue_fifo [AUDIO_QUEUE_FIFO_SIZE] |
void audio_queue_add | ( | uns8 | phrase | ) |
00051 { 00052 00053 uns8 aq_next; 00054 00055 if ((aq_end == aq_start) && // Nothing in the fifo 00056 (audio_playing == 0)) { // And txreg is empty 00057 00058 somo_14d_set_file_id(phrase); 00059 audio_playing = 1; 00060 } else { // Put it in the buffer 00061 aq_next = aq_end + 1; // Get next buffer position 00062 if (aq_next == AUDIO_QUEUE_FIFO_SIZE) { // If we're at the end 00063 aq_next = 0; // wrap to the beginning 00064 } 00065 if (aq_next == aq_start) { 00066 // we're full! 00067 return; // just forget it for now 00068 } 00069 00070 audio_queue_fifo[aq_end] = phrase; // put it in 00071 aq_end = aq_next; // move pointer along 00072 } 00073 }
void audio_queue_clear | ( | ) |
00105 { 00106 // crit sec 00107 start_crit_sec(); 00108 aq_end = aq_start; 00109 if (audio_playing || somo_14d_is_busy()) { 00110 serial_print_str("<<BUSY>>"); 00111 delay_ms(10); 00112 somo_14d_stop(); 00113 while (somo_14d_is_busy()) {}; 00114 delay_ms(10); 00115 } 00116 audio_playing = 0; 00117 end_crit_sec(); 00118 // crit sec end 00119 }
uns8 audio_queue_empty | ( | ) |
00121 { 00122 return (audio_playing == 0); 00123 }
void audio_queue_process | ( | ) |
Call when audio file completes.
This routine will pluck the next file off the queue and start playing it. Assumes it is in an interrupt otherwise will need wrapping in critsec
00082 { 00083 uns8 aq_next; 00084 00085 if (aq_end == aq_start) { // anything in the fifo? 00086 //serial_print_str("End of queue\n"); 00087 audio_playing = 0; 00088 return; // nope 00089 } 00090 aq_next = aq_start + 1; // get next position 00091 if (aq_next == AUDIO_QUEUE_FIFO_SIZE) { // if we're at the end of the buffer 00092 aq_next = 0; // wrap to the beginning 00093 } 00094 if (aq_end == aq_next) { // if we've only got one character to send 00095 //?????clear_bit(pie1, TXIE); // then turn off interrupts 00096 } 00097 audio_playing = 1; 00098 00099 somo_14d_set_file_id(audio_queue_fifo[aq_start]); 00100 aq_start = aq_next; // move start position of fifo 00101 00102 }
uns8 aq_end = 0 |
Audio queue fifo end point
uns8 aq_start = 0 |
Audio queue fifo start point
bit audio_playing = 0 |
Audio playing at present
uns8 audio_queue_fifo[AUDIO_QUEUE_FIFO_SIZE] |
Audio queue fifo