/* Stream Manager */ ga_StreamManager* ga_stream_manager_create() { ga_StreamManager* ret = (ga_StreamManager*)gcX_ops->allocFunc(sizeof(ga_StreamManager)); ret->streamListMutex = gc_mutex_create(); gc_list_head(&ret->streamList); return ret; }
/* Mixer Functions */ ga_Mixer* ga_mixer_create(ga_Format* in_format, gc_int32 in_numSamples) { ga_Mixer* ret = gcX_ops->allocFunc(sizeof(ga_Mixer)); gc_int32 mixSampleSize; gc_list_head(&ret->dispatchList); gc_list_head(&ret->mixList); ret->numSamples = in_numSamples; memcpy(&ret->format, in_format, sizeof(ga_Format)); ret->mixFormat.bitsPerSample = 32; ret->mixFormat.numChannels = in_format->numChannels; ret->mixFormat.sampleRate = in_format->sampleRate; mixSampleSize = ga_format_sampleSize(&ret->mixFormat); ret->mixBuffer = (gc_int32*)gcX_ops->allocFunc(in_numSamples * mixSampleSize); ret->dispatchMutex = gc_mutex_create(); ret->mixMutex = gc_mutex_create(); return ret; }
/* Stream */ ga_BufferedStream* ga_stream_create(ga_StreamManager* in_mgr, ga_SampleSource* in_sampleSrc, gc_int32 in_bufferSize) { ga_BufferedStream* ret = gcX_ops->allocFunc(sizeof(ga_BufferedStream)); ret->refCount = 1; ret->refMutex = gc_mutex_create(); ga_sample_source_acquire(in_sampleSrc); ga_sample_source_format(in_sampleSrc, &ret->format); gc_list_head(&ret->tellJumps); ret->innerSrc = in_sampleSrc; ret->nextSample = 0; ret->seek = 0; ret->tell = 0; ret->end = 0; ret->bufferSize = in_bufferSize; ret->flags = ga_sample_source_flags(in_sampleSrc); assert(ret->flags & GA_FLAG_THREADSAFE); ret->produceMutex = gc_mutex_create(); ret->seekMutex = gc_mutex_create(); ret->readMutex = gc_mutex_create(); ret->buffer = gc_buffer_create(in_bufferSize); ret->streamLink = (gc_Link*)gaX_stream_manager_add(in_mgr, ret); return ret; }