git.y1.nz

SameBoy

Accurate GB/GBC emulator
download: https://git.y1.nz/archives/sameboy.tar.gz
README | Files | Log | Refs | LICENSE

SDL/audio.c

      1 #include <stdbool.h>
      2 #include <stddef.h>
      3 #include <stdlib.h>
      4 #include <Core/gb.h>
      5 #include "audio/audio.h"
      6 #include "configuration.h"
      7 
      8 #define likely(x)   GB_likely(x)
      9 #define unlikely(x) GB_unlikely(x)
     10 
     11 static const GB_audio_driver_t *driver = NULL;
     12 
     13 bool GB_audio_init(void)
     14 {
     15     const GB_audio_driver_t *drivers[] = {
     16 #ifdef _WIN32
     17         GB_AUDIO_DRIVER_REF(XAudio2),
     18 #endif
     19         GB_AUDIO_DRIVER_REF(SDL),
     20 #ifdef ENABLE_OPENAL
     21         GB_AUDIO_DRIVER_REF(OpenAL),
     22 #endif
     23     };
     24     
     25     // First try the preferred driver
     26     for (unsigned i = 0; i < sizeof(drivers) / sizeof(drivers[0]); i++) {
     27         driver = drivers[i];
     28         if (strcmp(driver->name, configuration.audio_driver) != 0) {
     29             continue;
     30         }
     31         if (driver->audio_init()) {
     32             if (driver->audio_deinit) {
     33                 atexit(driver->audio_deinit);
     34             }
     35             return true;
     36         }
     37     }
     38     
     39     // Else go by priority
     40     for (unsigned i = 0; i < sizeof(drivers) / sizeof(drivers[0]); i++) {
     41         driver = drivers[i];
     42         if (driver->audio_init()) {
     43             atexit(driver->audio_deinit);
     44             return true;
     45         }
     46     }
     47     
     48     driver = NULL;
     49     return false;
     50 }
     51 
     52 bool GB_audio_is_playing(void)
     53 {
     54     if (unlikely(!driver)) return false;
     55     return driver->audio_is_playing();
     56 }
     57 
     58 void GB_audio_set_paused(bool paused)
     59 {
     60     if (unlikely(!driver)) return;
     61     return driver->audio_set_paused(paused);
     62 }
     63 
     64 void GB_audio_clear_queue(void)
     65 {
     66     if (unlikely(!driver)) return;
     67     return driver->audio_clear_queue();
     68 }
     69 
     70 unsigned GB_audio_get_frequency(void)
     71 {
     72     if (unlikely(!driver)) return 0;
     73     return driver->audio_get_frequency();
     74 }
     75 
     76 size_t GB_audio_get_queue_length(void)
     77 {
     78     if (unlikely(!driver)) return 0;
     79     return driver->audio_get_queue_length();
     80 }
     81 
     82 void GB_audio_queue_sample(GB_sample_t *sample)
     83 {
     84     if (unlikely(!driver)) return;
     85     return driver->audio_queue_sample(sample);
     86 }
     87 
     88 const char *GB_audio_driver_name(void)
     89 {
     90     if (unlikely(!driver)) return "None";
     91     return driver->name;
     92 }
     93 
     94 const char *GB_audio_driver_name_at_index(unsigned index)
     95 {
     96     const GB_audio_driver_t *drivers[] = {
     97 #ifdef _WIN32
     98         GB_AUDIO_DRIVER_REF(XAudio2),
     99 #endif
    100         GB_AUDIO_DRIVER_REF(SDL),
    101 #ifdef ENABLE_OPENAL
    102         GB_AUDIO_DRIVER_REF(OpenAL),
    103 #endif
    104     };
    105     if (index >= sizeof(drivers) / sizeof(drivers[0])) {
    106         return "";
    107     }
    108     return drivers[index]->name;
    109 }

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.