#include "rockmacros.h" #include "defs.h" #include "pcm.h" /*#define ONEBUF*/ /* Note: I think the single buffer implementation is more * responsive with sound(less lag) but it creates more * choppyness overall to the sound. 2 buffer's don't seem to * make a difference, but 4 buffers is definately noticable */ struct pcm pcm IBSS_ATTR; bool sound = 1; #ifdef ONEBUF #define N_BUFS 1 #else #define N_BUFS 4 #endif #define BUF_SIZE 1024 #if CONFIG_CODEC == SWCODEC && !defined(SIMULATOR) #ifndef ONEBUF static short curbuf,gmcurbuf; #else bool doneplay=0; #endif static unsigned char *buf=0; static unsigned short *gmbuf; static bool newly_started; void get_more(unsigned char** start, size_t* size) { #ifdef ONEBUF doneplay=1; *start = (unsigned char*)(gmbuf); #else *start = (unsigned char*)(&gmbuf[pcm.len*curbuf]); #endif *size = BUF_SIZE*sizeof(short); } void pcm_init(void) { newly_started = true; pcm.hz = 11025; pcm.stereo = 1; pcm.len = BUF_SIZE; if(!buf){ buf = my_malloc(pcm.len * N_BUFS); gmbuf = my_malloc(pcm.len * N_BUFS*sizeof (short)); pcm.buf = buf; pcm.pos = 0; #ifndef ONEBUF curbuf = gmcurbuf= 0; #endif memset(gmbuf, 0, pcm.len * N_BUFS *sizeof(short)); memset(buf, 0, pcm.len * N_BUFS); } rb->pcm_play_stop(); rb->pcm_set_frequency(11025); /* 44100 22050 11025 */ } void pcm_close(void) { memset(&pcm, 0, sizeof pcm); newly_started = true; rb->pcm_play_stop(); rb->pcm_set_frequency(44100); } int pcm_submit(void) { if (!options.sound) return 1; register int i; if (!sound) { pcm.pos = 0; return 0; } if (pcm.pos < pcm.len) return 1; #ifndef ONEBUF curbuf = (curbuf + 1) % N_BUFS; pcm.buf = buf + pcm.len * curbuf; #endif pcm.pos = 0; /* gotta convert the 8 bit buffer to 16 */ for(i=0; ipcm_play_data(&get_more,NULL,0); newly_started = false; } /* this while loop and done play are in place to make sure the sound timing * is correct(although it's not) */ #ifdef ONEBUF while(doneplay==0) rb->yield(); doneplay=0; #endif return 1; } #else static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; /* 4 byte aligned */ void pcm_init(void) { pcm.hz = 11025; pcm.stereo = 1; pcm.buf = buf1_unal; pcm.len = (BUF_SIZE / sizeof(short)); pcm.pos = 0; } void pcm_close(void) { memset(&pcm, 0, sizeof pcm); } int pcm_submit(void) { pcm.pos =0; return 0; } #endif