#include "precompile.h" #include "audiostream.h" #include "audiolog.h" #include "audiocontext.h" void audiostream_init(audioengine_t *engine, audiostream_vtbl_t *vtbl, audiostream_t *stream) { stream->vtbl = vtbl; stream->engine = engine; stream->ctx = NULL; stream->direction = STREAM_DIR_NONE; stream->user_data = NULL; stream->event_handler = NULL; stream->upstream = stream->downstream = NULL; } void audiostream_raise_event(audiostream_t *stream, int evt, int param1, int param2) { apr_status_t status; audiostream_t *p; if (stream->event_handler) { if ((*stream->event_handler)(stream, stream->user_data, evt, param1, param2)) return; } p = stream; while (p) { if (p->ctx) { status = audiocontext_put_stream_event(p->ctx, stream, evt, param1, param2); if (status != APR_SUCCESS) { AUDIO_LOG_ERROR("put stream event failed"); } break; } p = p->upstream; } } audiostream_t* audiostream_connect_pipeline(int direction, ...) { va_list arg; audiostream_t *first = NULL; audiostream_t *upstream = NULL; audiostream_t *downstream = NULL; va_start(arg, direction); for (;;) { audiostream_t *st = va_arg(arg, audiostream_t*); if (st) { if (!first) { first = st; first->direction = direction; } if (upstream) { st->upstream = upstream; upstream->downstream = st; } upstream = st; } else { break; } } va_end(arg); return first; } void audiostream_disconnect_pipeline(audiostream_t *stream) { audiostream_t *s; s = stream; while (s) { audiostream_t *next = s->downstream; s->upstream = NULL; s->downstream = NULL; s->direction = STREAM_DIR_NONE; s = next; } }