audioresize.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "precompile.h"
  2. #include "audioresize.h"
  3. #include "audiocontext.h"
  4. #include "audiolog.h"
  5. static apr_status_t read_frame(void *self, audioframe_t *frame)
  6. {
  7. audioresize_t *resize = CONTAINING_RECORD(self, audioresize_t, base);
  8. if (resize->read_upstream_psize == resize->read_downstream_psize) {
  9. apr_status_t status;
  10. status = resize->base.downstream->vtbl->read_frame(resize->base.downstream, frame);
  11. if (status != APR_SUCCESS) {
  12. AUDIO_LOG_ERROR("audioresize read_frame from downstream failed");
  13. }
  14. return status;
  15. }
  16. if (resize->pending_read.size < (unsigned long)resize->read_upstream_psize) {
  17. apr_status_t status;
  18. audioframe_t frm;
  19. if (SUGGEST_FRAME_SIZE-(resize->pending_read_offset+resize->pending_read.size) < resize->read_downstream_psize) {
  20. memmove(resize->pending_read.buffer, resize->pending_read.buffer+resize->pending_read_offset, resize->pending_read.size);
  21. resize->pending_read_offset = 0;
  22. }
  23. frm.buffer = resize->pending_read.buffer + resize->pending_read_offset + resize->pending_read.size;
  24. frm.size = SUGGEST_FRAME_SIZE - (resize->pending_read.size+resize->pending_read_offset);
  25. frm.dtmf = 0;
  26. status = resize->base.downstream->vtbl->read_frame(resize->base.downstream, &frm);
  27. if (status == APR_SUCCESS) {
  28. resize->pending_read.size += frm.size;
  29. resize->pending_read.dtmf = frm.dtmf;
  30. } else {
  31. AUDIO_LOG_ERROR("audioresize read_frame from downstream failed");
  32. return status;
  33. }
  34. }
  35. memcpy(frame->buffer, resize->pending_read.buffer+resize->pending_read_offset, resize->read_upstream_psize);
  36. frame->size = resize->read_upstream_psize;
  37. frame->dtmf = resize->pending_read.dtmf;
  38. resize->pending_read.size -= resize->read_upstream_psize;
  39. resize->pending_read_offset += resize->read_upstream_psize;
  40. resize->pending_read.dtmf = 0;
  41. return APR_SUCCESS;
  42. }
  43. static apr_status_t write_frame(void *self, const audioframe_t *frame)
  44. {
  45. audioresize_t *resize = CONTAINING_RECORD(self, audioresize_t, base);
  46. if (resize->write_upstream_psize == resize->write_downstream_psize) {
  47. apr_status_t status;
  48. status = resize->base.downstream->vtbl->write_frame(resize->base.downstream, frame);
  49. if (status != APR_SUCCESS)
  50. AUDIO_LOG_ERROR("audioresize write_frame from downstream failed");
  51. return status;
  52. }
  53. if (SUGGEST_FRAME_SIZE-(resize->pending_write_offset+resize->pending_write.size) < resize->write_upstream_psize) {
  54. memmove(resize->pending_write.buffer, resize->pending_write.buffer+resize->pending_write_offset, resize->pending_write.size);
  55. resize->pending_write_offset = 0;
  56. }
  57. if (frame->size == resize->write_upstream_psize) {
  58. memcpy(resize->pending_write.buffer+resize->pending_write_offset+resize->pending_write.size, frame->buffer, frame->size);
  59. resize->pending_write.size += resize->write_upstream_psize;
  60. } else {
  61. /** fill with zero */
  62. memset(resize->pending_write.buffer+resize->pending_write_offset+resize->pending_write.size, 0, resize->write_upstream_psize);
  63. resize->pending_write.size += resize->write_upstream_psize;
  64. }
  65. //OutputDebugStringA("o");
  66. resize->pending_write.dtmf = frame->dtmf;
  67. while (resize->pending_write.size >= (unsigned long)resize->write_downstream_psize) {
  68. apr_status_t status;
  69. audioframe_t frm;
  70. frm.buffer = resize->pending_write.buffer + resize->pending_write_offset;
  71. frm.size = resize->write_downstream_psize;
  72. frm.dtmf = resize->pending_write.dtmf;
  73. status = resize->base.downstream->vtbl->write_frame(resize->base.downstream, &frm);
  74. if (status != APR_SUCCESS)
  75. AUDIO_LOG_ERROR("audioresize write_frame from downstream failed");
  76. //OutputDebugStringA("x");
  77. resize->pending_write_offset += resize->write_downstream_psize;
  78. resize->pending_write.size -= resize->write_downstream_psize;
  79. resize->pending_write.dtmf = 0;
  80. if (resize->pending_write.size == 0)
  81. resize->pending_write_offset = 0;
  82. }
  83. return APR_SUCCESS;
  84. }
  85. static audiostream_vtbl_t g_stream_vtbl = {
  86. &read_frame,
  87. &write_frame,
  88. };
  89. apr_status_t audioresize_create(apr_pool_t *pool,
  90. audioengine_t *engine,
  91. int read_upsteam_psize,
  92. int read_downstream_psize,
  93. int write_upsteam_psize,
  94. int write_downstream_psize,
  95. audioresize_t **p_resize)
  96. {
  97. audioresize_t *resize;
  98. resize = apr_palloc(pool, sizeof(audioresize_t));
  99. audiostream_init(engine, &g_stream_vtbl, &resize->base);
  100. resize->base.direction = STREAM_DIR_BOTH;
  101. resize->read_upstream_psize = read_upsteam_psize;
  102. resize->read_downstream_psize = read_downstream_psize;
  103. resize->write_upstream_psize = write_upsteam_psize;
  104. resize->write_downstream_psize = write_downstream_psize;
  105. if (read_upsteam_psize != read_downstream_psize) {
  106. resize->pending_read.size = 0;
  107. resize->pending_read.dtmf = 0;
  108. resize->pending_read.buffer = apr_palloc(pool, SUGGEST_FRAME_SIZE);
  109. resize->pending_read_offset = 0;
  110. }
  111. if (write_upsteam_psize != write_downstream_psize) {
  112. resize->pending_write.size = 0;
  113. resize->pending_write.dtmf = 0;
  114. resize->pending_write.buffer = apr_palloc(pool, SUGGEST_FRAME_SIZE);
  115. resize->pending_write_offset = 0;
  116. }
  117. *p_resize = resize;
  118. return APR_SUCCESS;
  119. }
  120. void audioresize_destroy(audioresize_t *resize)
  121. {
  122. }