EGong

git clone git://xatko.vsos.ethz.ch/EGong.git
Log | Files | Refs

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 }