gau_SampleSourceLoop* gau_sample_source_create_loop(ga_SampleSource* in_sampleSrc) { gau_SampleSourceLoop* ret = gcX_ops->allocFunc(sizeof(gau_SampleSourceLoop)); gau_SampleSourceLoopContext* ctx = &ret->context; gc_int32 sampleSize; ga_sample_source_init(&ret->sampleSrc); ga_sample_source_acquire(in_sampleSrc); ga_sample_source_format(in_sampleSrc, &ret->sampleSrc.format); sampleSize = ga_format_sampleSize(&ret->sampleSrc.format); ctx->triggerSample = -1; ctx->targetSample = -1; ctx->loopCount = 0; ctx->loopMutex = gc_mutex_create(); ctx->innerSrc = in_sampleSrc; ctx->sampleSize = sampleSize; ret->sampleSrc.flags = ga_sample_source_flags(in_sampleSrc); ret->sampleSrc.flags |= GA_FLAG_THREADSAFE; assert(ret->sampleSrc.flags & GA_FLAG_SEEKABLE); ret->sampleSrc.readFunc = &gauX_sample_source_loop_read; ret->sampleSrc.endFunc = &gauX_sample_source_loop_end; ret->sampleSrc.readyFunc = &gauX_sample_source_loop_ready; ret->sampleSrc.seekFunc = &gauX_sample_source_loop_seek; ret->sampleSrc.tellFunc = &gauX_sample_source_loop_tell; ret->sampleSrc.closeFunc = &gauX_sample_source_loop_close; return ret; }
ga_Handle* ga_handle_create(ga_Mixer* in_mixer, ga_SampleSource* in_sampleSrc) { ga_Handle* h = (ga_Handle*)gcX_ops->allocFunc(sizeof(ga_Handle)); ga_sample_source_acquire(in_sampleSrc); h->sampleSrc = in_sampleSrc; h->finished = 0; gaX_handle_init(h, in_mixer); gc_mutex_lock(in_mixer->mixMutex); gc_list_link(&in_mixer->mixList, &h->mixLink, h); gc_mutex_unlock(in_mixer->mixMutex); gc_mutex_lock(in_mixer->dispatchMutex); gc_list_link(&in_mixer->dispatchList, &h->dispatchLink, h); gc_mutex_unlock(in_mixer->dispatchMutex); return h; }
/* 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; }