audiostream.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "precompile.h"
  2. #include "audiostream.h"
  3. #include "audiolog.h"
  4. #include "audiocontext.h"
  5. void audiostream_init(audioengine_t *engine, audiostream_vtbl_t *vtbl, audiostream_t *stream)
  6. {
  7. stream->vtbl = vtbl;
  8. stream->engine = engine;
  9. stream->ctx = NULL;
  10. stream->direction = STREAM_DIR_NONE;
  11. stream->user_data = NULL;
  12. stream->event_handler = NULL;
  13. stream->upstream = stream->downstream = NULL;
  14. }
  15. void audiostream_raise_event(audiostream_t *stream, int evt, int param1, int param2)
  16. {
  17. apr_status_t status;
  18. audiostream_t *p;
  19. if (stream->event_handler) {
  20. if ((*stream->event_handler)(stream, stream->user_data, evt, param1, param2))
  21. return;
  22. }
  23. p = stream;
  24. while (p) {
  25. if (p->ctx) {
  26. status = audiocontext_put_stream_event(p->ctx, stream, evt, param1, param2);
  27. if (status != APR_SUCCESS) {
  28. AUDIO_LOG_ERROR("put stream event failed");
  29. }
  30. break;
  31. }
  32. p = p->upstream;
  33. }
  34. }
  35. audiostream_t* audiostream_connect_pipeline(int direction, ...)
  36. {
  37. va_list arg;
  38. audiostream_t *first = NULL;
  39. audiostream_t *upstream = NULL;
  40. audiostream_t *downstream = NULL;
  41. va_start(arg, direction);
  42. for (;;) {
  43. audiostream_t *st = va_arg(arg, audiostream_t*);
  44. if (st) {
  45. if (!first) {
  46. first = st;
  47. first->direction = direction;
  48. }
  49. if (upstream) {
  50. st->upstream = upstream;
  51. upstream->downstream = st;
  52. }
  53. upstream = st;
  54. } else {
  55. break;
  56. }
  57. }
  58. va_end(arg);
  59. return first;
  60. }
  61. void audiostream_disconnect_pipeline(audiostream_t *stream)
  62. {
  63. audiostream_t *s;
  64. s = stream;
  65. while (s) {
  66. audiostream_t *next = s->downstream;
  67. s->upstream = NULL;
  68. s->downstream = NULL;
  69. s->direction = STREAM_DIR_NONE;
  70. s = next;
  71. }
  72. }