int main(int argc, char** argv) { ga_Format fmt; ga_Device* dev; gc_int16* buf; gc_int32 numSamples; gc_int32 sampleSize; gc_int32 numToQueue; gc_int32 i; gc_int16 sample; gc_float32 pan = 1.0f; gc_float32 t = 0.0f; /* Initialize library + device */ gc_initialize(0); memset(&fmt, 0, sizeof(ga_Format)); fmt.bitsPerSample = 16; fmt.numChannels = 2; fmt.sampleRate = 44100; numSamples = 2048; sampleSize = ga_format_sampleSize(&fmt); dev = ga_device_open(GA_DEVICE_TYPE_DEFAULT, 2, 2048, &fmt); if(!dev) return 1; /* Allocate buffer */ buf = (gc_int16*)malloc(numSamples * sampleSize); /* Infinite mix loop */ while(1) { numToQueue = ga_device_check(dev); while(numToQueue--) { for(i = 0; i < numSamples * 2; i = i + 2) { sample = (gc_int16)(sin(t) * 32768); sample = (sample > -32768 ? (sample < 32767 ? sample : 32767) : -32768); pan = (gc_float32)sin(t / 300) / 2.0f + 0.5f; buf[i] = (gc_int16)(sample * pan); buf[i + 1] = (gc_int16)(sample * (1.0f - pan)); t = t + 0.03f; if(t > 3.14159265f) t -= 3.14159265f; } ga_device_queue(dev, (char*)buf); } } /* Clean up device + library */ ga_device_close(dev); gc_shutdown(); /* Free buffer */ free(buf); return 0; }
gau_Manager* gau_manager_create_custom(gc_int32 in_devType, gc_int32 in_threadPolicy, gc_int32 in_numBuffers, gc_int32 in_bufferSamples) { gau_Manager* ret = gcX_ops->allocFunc(sizeof(gau_Manager)); assert(in_threadPolicy == GAU_THREAD_POLICY_SINGLE || in_threadPolicy == GAU_THREAD_POLICY_MULTI); assert(in_bufferSamples > 128); assert(in_numBuffers >= 2); /* Open device */ memset(&ret->format, 0, sizeof(ga_Format)); ret->format.bitsPerSample = 16; ret->format.numChannels = 2; ret->format.sampleRate = 44100; ret->device = ga_device_open(in_devType, in_numBuffers, in_bufferSamples, &ret->format); assert(ret->device); /* Initialize mixer */ ret->mixer = ga_mixer_create(&ret->format, in_bufferSamples); ret->streamMgr = ga_stream_manager_create(); ret->sampleSize = ga_format_sampleSize(&ret->format); ret->mixBuffer = (gc_int16*)gcX_ops->allocFunc(ret->mixer->numSamples * ret->sampleSize); /* Create and run mixer and stream threads */ ret->threadPolicy = in_threadPolicy; ret->killThreads = 0; if(ret->threadPolicy == GAU_THREAD_POLICY_MULTI) { ret->mixThread = gc_thread_create(gauX_mixThreadFunc, ret, GC_THREAD_PRIORITY_HIGH, 64 * 1024); ret->streamThread = gc_thread_create(gauX_streamThreadFunc, ret, GC_THREAD_PRIORITY_HIGH, 64 * 1024); gc_thread_run(ret->mixThread); gc_thread_run(ret->streamThread); } else { ret->mixThread = 0; ret->streamThread = 0; } return ret; }