#include "pong.h" #include "sounds.h" int Difficulty = 1; atomic_int Ticks = 0; bool GameGoing = true; char VersionString[256]; mtx_t AudioQueueBeingModified; int AudioQueue[20]; int internal_clock() { const struct timespec Delay = { 0, 20000000 }; struct timespec Remaining; while(GameGoing == true) { atomic_fetch_add(&Ticks, 1); thrd_sleep(&Delay, &Remaining); } thrd_exit(0); } int audio() { int i; InitAudioDevice(); Sound Bounce = LoadSound("resources/bounce.wav"); Sound TitleScreen = LoadSound("resources/title.wav"); Sound Victory = LoadSound("resources/victory.wav"); Sound Defeat = LoadSound("resources/defeat.wav"); Sound PlayerScore = LoadSound("resources/score_player.wav"); Sound EnemyScore = LoadSound("resources/score_enemy.wav"); const struct timespec Delay = { 0, 20000000 }; struct timespec Remaining; while(GameGoing == true) { for(i = 0; i < 20; i++) { if(AudioQueue[i] != -1){ switch(AudioQueue[i]) { case 0: //Play bounce sound. PlaySoundMulti(Bounce); break; case 1: //Play game over PlaySoundMulti(Defeat); break; case 2: //Play win PlaySoundMulti(Victory); break; case 3: //Title Screen PlaySoundMulti(TitleScreen); break; case 4: //Player Score PlaySoundMulti(PlayerScore); break; case 5: //Enemy Score PlaySoundMulti(EnemyScore); break; case 99: //Stop All Sounds StopSoundMulti(); break; default: break; } while(mtx_trylock(&AudioQueueBeingModified) == thrd_busy) thrd_sleep(&Delay, &Remaining); AudioQueue[i] = -1; mtx_unlock(&AudioQueueBeingModified); } } thrd_sleep(&Delay, &Remaining); } thrd_exit(0); } bool play_audio(int SoundEffect) { unsigned int i; while(mtx_trylock(&AudioQueueBeingModified) == thrd_busy); for(i = 1; i != 20; i++) { if (AudioQueue[i-1] == -1) { AudioQueue[i-1] = AudioQueue[i]; } } for(i = 0; AudioQueue[i] != -1; i++) { if(i > sizeof(AudioQueue)) { mtx_unlock(&AudioQueueBeingModified); return false; } } AudioQueue[i] = SoundEffect; mtx_unlock(&AudioQueueBeingModified); return true; } int main() { //Raylib Init InitWindow(1280, 720, "Pong"); SetTargetFPS(60); SetExitKey(KEY_NULL); Image Icon = LoadImage("resources/ball.png"); SetWindowIcon(Icon); SetWindowState(FLAG_VSYNC_HINT); SetWindowState(FLAG_WINDOW_RESIZABLE); SetWindowMinSize(1280, 720); //Init Variables strncpy(VersionString, "Version 0.2 - AEOLUS", sizeof(VersionString)); //Populate Audio Queue for(unsigned int i = 0; i < 20; i++) { AudioQueue[i] = -1; } mtx_init(&AudioQueueBeingModified, mtx_plain); // Initialize Internal Clock thrd_t InternalClock; thrd_create(&InternalClock, internal_clock, NULL); thrd_t AudioThread; thrd_create(&AudioThread, audio, NULL); // Launch Game while (GameGoing == true) { switch(title_screen()) { case 0: //Versus play_audio(STOP_ALL_SOUNDS); versus_main(); break; case 1: //Marathon play_audio(STOP_ALL_SOUNDS); marathon_main(); break; default: break; } } GameGoing = false; // Make sure the game is going to end. thrd_join(AudioThread, NULL); thrd_join(InternalClock, NULL); CloseWindow(); return(0); }