/*************************************************************************************** * Audio - Interrupt Service Routine * * This interrupt service routine records or plays back audio, depending on which type * interrupt (read or write) is pending in the audio device. ****************************************************************************************/ void audio_ISR(alt_up_audio_dev* audio_dev, unsigned int id) { if (alt_up_audio_write_interrupt_pending(audio_dev)) // check for write interrupt { //int numToWrite = 0; //int spaceAvailable = alt_up_audio_write_fifo_space(audio_dev, ALT_UP_AUDIO_LEFT); int temp = 0, temp1 = 0; if(soundMixer->indexSize <= 0) return; temp = alt_up_audio_write_fifo(audio_dev, soundMixer->buffer[soundMixer->currIndex], 96, ALT_UP_AUDIO_LEFT); temp1 = alt_up_audio_write_fifo(audio_dev, soundMixer->buffer[soundMixer->currIndex], 96, ALT_UP_AUDIO_RIGHT); /*s->position += 96; if(s->position>=s->length) s->position = 0;*/ incIndex(); } return; }
void play_wav (unsigned int **arr) { alt_up_audio_reset_audio_core(audio); unsigned int * input; int k = 0; input = arr[k]; while (1) { if (alt_up_audio_write_interrupt_pending(audio) == 1) { alt_up_audio_write_fifo(audio, input, 100, ALT_UP_AUDIO_LEFT); alt_up_audio_write_fifo(audio, input, 100, ALT_UP_AUDIO_RIGHT); k++; input = arr[k]; } if (k >= 4377) break; } }
//Audio interrupt function, plays sound effects and/or loops audio //REQ: audmode->id must point to correct id void audio_isr(audisr * audmode, alt_u32 irq_id) { int i; unsigned int ** temp; unsigned int * second; if (audmode->resetmix == true) { audmode->resetmix = false; audio_isr_2 = 0; } //if (audmode->mode == 0) { if (audmode->id != audmode->oldid) { audio_isr_k = 0; seek = 0; init_copy(audmode->id, audmode->oldid); audmode->oldid = audmode->id; } if (audmode->id2 != audmode->oldid2) { audio_isr_2 = 0; audmode->oldid2 = audmode->id2; } if (audio_isr_k == 0) { copy_bgm(audmode->id); alt_up_rs232_write_data(uart, 0x6); alt_up_rs232_write_data(uart, (int)audiosecs[audmode->id]); } audio_log.bgmin = copyarr[audio_isr_k]; //Mode 0, loop music if (audmode->mode == 0) { for (i = 0; i < 96; i++) { audio_log.bgmin[i] = volume_adjust(audio_log.bgmin[i], audmode->newvolume); } } else if (audmode->mode == 1) { temp = arr[audmode->id2]; second = temp[audio_isr_2]; for (i = 0; i < 96; i++) { unsigned int tempmix = audio_log.bgmin[i]; audio_log.bgmin[i] = mix_adjust(tempmix,second[i],5); } audio_isr_2++; if (audio_isr_2 > audiosize[audmode->id2]) { audio_isr_2 = 0; audmode->mode = 0; } } if (alt_up_audio_write_interrupt_pending(audio) == 1) { alt_up_audio_write_fifo(audio, audio_log.bgmin, 96, ALT_UP_AUDIO_LEFT); alt_up_audio_write_fifo(audio, audio_log.bgmin, 96, ALT_UP_AUDIO_RIGHT); if (audmode->loop == true){ audio_isr_k = (audio_isr_k + 1) % audiosize[audmode->id]; seek = (seek + 1) % 333; if (seek == 0) { //alt_up_rs232_write_data(uart, 0x0A); } if (audio_isr_k == 0) { alt_up_rs232_write_data(uart, 0x3); } } else { if(audio_isr_k <= audiosize[audmode->id]) { audio_isr_k += 1; seek = (seek + 1) % 333; if (seek == 0) { //alt_up_rs232_write_data(uart, 0x0A); } } else { seek = 0; audmode->mode = 0; audio_isr_2 = 0; audio_isr_k = 0; //alt_up_rs232_write_data(uart, 0x3); alt_up_rs232_write_data(uart, 0x4); wait(); if (audmode->shuffle == false) { audmode->id += 1; if ((audmode->id >= audmode->files) && (audmode->listloop == true)) { audmode->id = 0; //printf("Restarting songs\n"); } else if((audmode->id >= audmode->files) && (audmode->listloop == false)) { printf("End of Playlist\n"); audmode->id = 0; alt_up_audio_disable_write_interrupt(audio); } } else { /* do { while(rs_flag == false); alt_up_rs232_read_data(uart, &data, &parity); }while((int)data == 0); */ wait(); alt_up_rs232_read_data(uart, &data, &parity); int nextindex = (int)data; nextindex -= 4; //printf("Next Index: %d\n", nextindex); if ((nextindex < 0) || (nextindex > audmode->files)) { nextindex = 0; printf("Error, next Index: %d\n", nextindex); } audmode->id = nextindex; } } } } //} /* else if (audmode->mode == 1) { if (audmode->id != audmode->oldid) { //TEMP audmode->id2 = audmode->id++; if (audmode->id2 >= audmode->files) { audmode->id2 = 0; } if (audiosize[audmode->id] > audiosize[audmode->id2]) { audmode->large = audmode->id; } else { audmode->large = audmode->id2; } // audio_isr_k = 0; init_copy(audmode->large, audmode->oldid); audmode->oldid = audmode->id; } if (audio_isr_k == 0) { copy_bgm(audmode->large); alt_up_rs232_write_data(uart, 0x6); } audio_log.bgmin = copyarr[audio_isr_k]; for (i = 0; i < 96; i++) { //audio_log.bgmin[i] = mix_adjust(audio_log.bgmin[i], ,audmode->newvolume); } if (alt_up_audio_write_interrupt_pending(audio) == 1) { audio_isr_k = 0; audmode->id += 1; alt_up_rs232_write_data(uart, 0x3); if ((audmode->id >= audmode->files) && (audmode->listloop == true)) { audmode->id = 0; printf("Restarting songs\n"); } else if((audmode->id >= audmode->files) && (audmode->listloop == false)) { printf("End of Playlist\n"); audmode->id = 0; alt_up_audio_disable_write_interrupt(audio); } } } */ }