示例#1
0
/***************************************************************************************
 * 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;
}
示例#2
0
文件: audio.c 项目: RedTn/niostank
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;
	}

}
示例#3
0
文件: audio.c 项目: RedTn/niosmusic
//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);
			}
		}

	}
	 */
}