Audio.c (2163B)
1 #include <ao/ao.h> 2 #include <EGong/Interfaces.h> 3 #include <EGong/Util/Log.h> 4 #include <string.h> 5 #include <math.h> 6 7 8 #define BUFFERSIZE EGong_if_audio_format.bits/8 * EGong_if_audio_format.channels * EGong_if_audio_format.rate 9 10 ao_device *EGong_if_audio_device; 11 ao_sample_format EGong_if_audio_format; 12 int EGong_if_audio_driver; 13 char *EGong_if_audio_buffer; 14 15 int EGong_if_audio_setup(struct EGong_interface *interface){ 16 ao_initialize(); 17 do_log("Initialized audio", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 18 EGong_if_audio_driver = ao_default_driver_id(); 19 if(EGong_if_audio_driver==-1){ 20 do_log("Couldn't get default driver ID", LOG_TYPE_NORMAL, LOG_LEVEL_ERROR); 21 ao_shutdown(); 22 return EGONG_INTERFACE_RETURN_ERROR; 23 } 24 do_log("Got driver ID", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 25 26 memset(&EGong_if_audio_format, 0, sizeof(EGong_if_audio_format)); 27 EGong_if_audio_format.bits = 16; 28 EGong_if_audio_format.channels = 2; 29 EGong_if_audio_format.rate = 11025; 30 EGong_if_audio_format.byte_format = AO_FMT_LITTLE; 31 32 EGong_if_audio_device=ao_open_live(EGong_if_audio_driver, &EGong_if_audio_format, NULL); 33 if(EGong_if_audio_device==NULL){ 34 do_log("couldn't open device", LOG_TYPE_SIGNAL, LOG_LEVEL_ERROR); 35 ao_shutdown(); 36 return EGONG_INTERFACE_RETURN_ERROR; 37 } 38 do_log("Opened audio device", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 39 40 EGong_if_audio_buffer = calloc(BUFFERSIZE,sizeof(char)); 41 42 int sample,i; 43 for (i = 0; i < EGong_if_audio_format.rate; i++) { 44 sample = (int)(1 * 32768.0 * 45 sin(2 * M_PI * 440.0 * ((float) i/EGong_if_audio_format.rate))); 46 EGong_if_audio_buffer[4*i] = EGong_if_audio_buffer[4*i+2] = sample & 0xff; 47 EGong_if_audio_buffer[4*i+1] = EGong_if_audio_buffer[4*i+3] = (sample >> 8) & 0xff; 48 } 49 return EGONG_INTERFACE_RETURN_OK; 50 } 51 int EGong_if_audio_display(struct EGong_interface *interface, const String *msg){ 52 53 do_log("Playing Audio", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 54 ao_play(EGong_if_audio_device, EGong_if_audio_buffer, BUFFERSIZE); 55 return EGONG_INTERFACE_RETURN_OK; 56 } 57 58 int EGong_if_audio_shutdown(struct EGong_interface *interface){ 59 ao_close(EGong_if_audio_device); 60 ao_shutdown(); 61 return EGONG_INTERFACE_RETURN_OK; 62 }