audiocustom.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "precompile.h"
  2. #include "audiocustom.h"
  3. #include "audiocontext.h"
  4. static apr_status_t read_frame(void *self, audioframe_t *frame)
  5. {
  6. audiocustom_t *audiocust = CONTAINING_RECORD(self, audiocustom_t, base);
  7. apr_status_t status;
  8. if (audiocust->base.downstream) {
  9. status = audiocust->base.downstream->vtbl->read_frame(audiocust->base.downstream, frame);
  10. if (status == APR_SUCCESS) {
  11. if (audiocust->on_read)
  12. (*audiocust->on_read)(self, frame, audiocust->user_data);
  13. }
  14. } else {
  15. if (audiocust->on_read)
  16. return (*audiocust->on_read)(self, frame, audiocust->user_data);
  17. }
  18. return APR_SUCCESS;
  19. }
  20. static apr_status_t write_frame(void *self, const audioframe_t *frame)
  21. {
  22. audiocustom_t *audiocust = CONTAINING_RECORD(self, audiocustom_t, base);
  23. apr_status_t status;
  24. if (audiocust->base.downstream) {
  25. status = audiocust->base.downstream->vtbl->write_frame(audiocust->base.downstream, frame);
  26. if (status == APR_SUCCESS) {
  27. if (audiocust->on_write)
  28. (*audiocust->on_write)(self, frame, audiocust->user_data);
  29. }
  30. } else {
  31. if (audiocust->on_write)
  32. (*audiocust->on_write)(self, frame, audiocust->user_data);
  33. }
  34. return APR_SUCCESS;
  35. }
  36. static audiostream_vtbl_t g_stream_vtbl = {
  37. &read_frame,
  38. &write_frame,
  39. };
  40. apr_status_t audiocustom_create(apr_pool_t *pool,
  41. audioengine_t *engine,
  42. audiocustom_on_read_frame on_read,
  43. audiocustom_on_write_frame on_write,
  44. void *user_data,
  45. audiocustom_t **p_audiocust)
  46. {
  47. audiocustom_t *audiocust;
  48. audiocust = apr_palloc(pool, sizeof(audiocustom_t));
  49. memset(audiocust, 0, sizeof(audiocustom_t));
  50. audiocust->on_read = on_read;
  51. audiocust->on_write = on_write;
  52. audiocust->user_data = user_data;
  53. audiostream_init(engine, &g_stream_vtbl, &audiocust->base);
  54. *p_audiocust = audiocust;
  55. return APR_SUCCESS;
  56. }
  57. apr_status_t audiocustom_destroy(audiocustom_t *audiocust)
  58. {
  59. return APR_SUCCESS;
  60. }