school/ecen427/sounds.c

216 lines
5.6 KiB
C

/*
* sounds.c
*
* Created on: Oct 26, 2013
* Author: superman
*/
#include "sounds.h"
extern int shoot_numberOfSamples;
extern int tankDeath_numberOfSamples;
extern int spaceShipSound_numberOfSamples;
extern int spaceShipDeathSound_numberOfSamples;
extern int alienDeathSound_numberOfSamples;
extern int alienMovement1Sound_numberOfSamples;
extern int alienMovement2Sound_numberOfSamples;
extern int alienMovement3Sound_numberOfSamples;
extern int alienMovement4Sound_numberOfSamples;
extern int shoot_soundData[];
extern int tankDeath_soundData[];
extern int spaceShipSound_soundData[];
extern int spaceShipDeathSound_soundData[];
extern int alienDeathSound_soundData[];
extern int alienMovement1Sound_soundData[];
extern int alienMovement2Sound_soundData[];
extern int alienMovement3Sound_soundData[];
extern int alienMovement4Sound_soundData[];
extern int alienSilenceSound_soundData[];
int haveTankBulletSound = 0;
int haveTankDeathSound = 0;
int haveSpaceShipSound = 0;
int haveSpaceShipDeathSound = 0;
int haveAlienDeathSound = 0;
int haveAlienMoveSound =1;
int bulletSoundIndex = 0;
int tankDeathIndex = 0;
int spaceShipIndex = 0;
int spaceShipDeathIndex = 0;
int alienDeathIndex = 0;
int alienCadenceIndex = 1;
int alien1Index=0;
int alien2Index=0;
int alien3Index=0;
int alien4Index=0;
int isHaveTankBulletSound() {
return haveTankBulletSound;
}
void setHaveTankBulletSound(int x) {
haveTankBulletSound = x;
}
int isHaveTankDeathSound() {
return haveTankDeathSound;
}
void setHaveTankDeathSound(int x) {
haveTankDeathSound = x;
}
int isHaveSpaceShipSound() {
return haveSpaceShipSound;
}
void setHaveSpaceShipSound(int x) {
haveSpaceShipSound = x;
}
int isHaveSpaceShipDeathSound() {
return haveSpaceShipDeathSound;
}
void setHaveSpaceShipDeathSound(int x) {
haveSpaceShipDeathSound = x;
}
int isHaveAlienDeathSound() {
return haveAlienDeathSound;
}
void setHaveAlienDeathSound(int x) {
haveAlienDeathSound = x;
}
int isAlienSoundCadence(){
return alienCadenceIndex;
}
void setAlienSoundCadence(int x){
alienCadenceIndex = x;
}
//Responsible for rotating the different alien sounds called in the timer
void incrementAlienSoundCadence(){
if(isAlienSoundCadence() == 8)
setAlienSoundCadence(1);
else
setAlienSoundCadence(isAlienSoundCadence() + 1);
}
void fillSound(){
int i;
for(i=0;i<256;i++){
Xuint32 sample = getNextSample();
XAC97_mSetInFifoData(XPAR_AXI_AC97_0_BASEADDR,sample);
}
}
Xuint32 getNextSample(){
Xuint32 sample = 0x00000000; //Play no sound
if (haveTankBulletSound != 0) {
sample = (shoot_soundData[bulletSoundIndex] | (shoot_soundData[bulletSoundIndex])<<16);
if(bulletSoundIndex < (shoot_numberOfSamples - 1)){
bulletSoundIndex++;
} else {
bulletSoundIndex = 0;
haveTankBulletSound = 0;
}
} else if (haveTankDeathSound != 0) {
sample = (tankDeath_soundData[tankDeathIndex] | (tankDeath_soundData[tankDeathIndex])<<16);
if (tankDeathIndex < (tankDeath_numberOfSamples - 1)) {
tankDeathIndex++;
} else {
tankDeathIndex = 0;
haveTankDeathSound = 0;
}
} else if (haveSpaceShipSound != 0 ) { //set in setHaveSpaceShip global
sample = (spaceShipSound_soundData[spaceShipIndex] | (spaceShipSound_soundData[spaceShipIndex])<<16);
if (spaceShipIndex < (spaceShipSound_numberOfSamples -1)) {
spaceShipIndex++;
} else {
spaceShipIndex = 0;
//Set no sound when it goes off the page - Done by setHaveSpaceShip global
}
} else if (haveSpaceShipDeathSound != 0) {
sample = (spaceShipDeathSound_soundData[spaceShipDeathIndex] | (spaceShipDeathSound_soundData[spaceShipDeathIndex])<<16);
if (spaceShipDeathIndex < (spaceShipDeathSound_numberOfSamples - 1)) {
spaceShipDeathIndex++;
} else {
spaceShipDeathIndex = 0;
haveSpaceShipDeathSound = 0;
}
}
else if (haveAlienDeathSound != 0) {
sample = (alienDeathSound_soundData[alienDeathIndex] | (alienDeathSound_soundData[alienDeathIndex])<<16);
if (alienDeathIndex < (alienDeathSound_numberOfSamples - 1)) {
alienDeathIndex++;
} else {
alienDeathIndex = 0;
haveAlienDeathSound = 0;
}
}
//Set to always on since aliens are always in the game
else if (haveAlienMoveSound != 0){
//Performs the change in the four different sounds which are incremented by the alienCounter which is in timer_interrupt_handler()
switch (isAlienSoundCadence()){
case 1:
sample = (alienMovement1Sound_soundData[alien1Index] | (alienMovement1Sound_soundData[alien1Index]) <<16);
if(alien1Index < (alienMovement1Sound_numberOfSamples -1)){
alien1Index++;
}
else{
alien1Index = 0;
}
break;
case 3:
sample = (alienMovement2Sound_soundData[alien2Index] | (alienMovement2Sound_soundData[alienCadenceIndex]) <<16);
if(alien2Index < (alienMovement2Sound_numberOfSamples -1)){
alien2Index++;
}
else{
alien2Index = 0;
}
break;
case 5:
sample = (alienMovement3Sound_soundData[alien3Index] | (alienMovement3Sound_soundData[alienCadenceIndex]) <<16);
if(alien3Index < (alienMovement3Sound_numberOfSamples -1)){
alien3Index++;
}
else{
alien3Index = 0;
}
break;
case 7:
sample = (alienMovement4Sound_soundData[alien4Index] | (alienMovement4Sound_soundData[alienCadenceIndex]) <<16);
if(alien4Index < (alienMovement4Sound_numberOfSamples -1)){
alien4Index++;
}
else{
alien4Index = 0;
}
break;
default:
sample = 0x00000080;
break;
}
}
return sample;
}