123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #include "precompile.h"
- #include "audioresize.h"
- #include "audiocontext.h"
- #include "audiolog.h"
- static apr_status_t read_frame(void *self, audioframe_t *frame)
- {
- audioresize_t *resize = CONTAINING_RECORD(self, audioresize_t, base);
- if (resize->read_upstream_psize == resize->read_downstream_psize) {
- apr_status_t status;
- status = resize->base.downstream->vtbl->read_frame(resize->base.downstream, frame);
- if (status != APR_SUCCESS) {
- AUDIO_LOG_ERROR("audioresize read_frame from downstream failed");
- }
- return status;
- }
- if (resize->pending_read.size < (unsigned long)resize->read_upstream_psize) {
- apr_status_t status;
- audioframe_t frm;
- if (SUGGEST_FRAME_SIZE-(resize->pending_read_offset+resize->pending_read.size) < resize->read_downstream_psize) {
- memmove(resize->pending_read.buffer, resize->pending_read.buffer+resize->pending_read_offset, resize->pending_read.size);
- resize->pending_read_offset = 0;
- }
- frm.buffer = resize->pending_read.buffer + resize->pending_read_offset + resize->pending_read.size;
- frm.size = SUGGEST_FRAME_SIZE - (resize->pending_read.size+resize->pending_read_offset);
- frm.dtmf = 0;
- status = resize->base.downstream->vtbl->read_frame(resize->base.downstream, &frm);
- if (status == APR_SUCCESS) {
- resize->pending_read.size += frm.size;
- resize->pending_read.dtmf = frm.dtmf;
- } else {
- AUDIO_LOG_ERROR("audioresize read_frame from downstream failed");
- return status;
- }
- }
- memcpy(frame->buffer, resize->pending_read.buffer+resize->pending_read_offset, resize->read_upstream_psize);
- frame->size = resize->read_upstream_psize;
- frame->dtmf = resize->pending_read.dtmf;
- resize->pending_read.size -= resize->read_upstream_psize;
- resize->pending_read_offset += resize->read_upstream_psize;
- resize->pending_read.dtmf = 0;
- return APR_SUCCESS;
- }
- static apr_status_t write_frame(void *self, const audioframe_t *frame)
- {
- audioresize_t *resize = CONTAINING_RECORD(self, audioresize_t, base);
- if (resize->write_upstream_psize == resize->write_downstream_psize) {
- apr_status_t status;
- status = resize->base.downstream->vtbl->write_frame(resize->base.downstream, frame);
- if (status != APR_SUCCESS)
- AUDIO_LOG_ERROR("audioresize write_frame from downstream failed");
- return status;
- }
- if (SUGGEST_FRAME_SIZE-(resize->pending_write_offset+resize->pending_write.size) < resize->write_upstream_psize) {
- memmove(resize->pending_write.buffer, resize->pending_write.buffer+resize->pending_write_offset, resize->pending_write.size);
- resize->pending_write_offset = 0;
- }
- if (frame->size == resize->write_upstream_psize) {
- memcpy(resize->pending_write.buffer+resize->pending_write_offset+resize->pending_write.size, frame->buffer, frame->size);
- resize->pending_write.size += resize->write_upstream_psize;
- } else {
- /** fill with zero */
- memset(resize->pending_write.buffer+resize->pending_write_offset+resize->pending_write.size, 0, resize->write_upstream_psize);
- resize->pending_write.size += resize->write_upstream_psize;
- }
- //OutputDebugStringA("o");
- resize->pending_write.dtmf = frame->dtmf;
- while (resize->pending_write.size >= (unsigned long)resize->write_downstream_psize) {
- apr_status_t status;
- audioframe_t frm;
- frm.buffer = resize->pending_write.buffer + resize->pending_write_offset;
- frm.size = resize->write_downstream_psize;
- frm.dtmf = resize->pending_write.dtmf;
- status = resize->base.downstream->vtbl->write_frame(resize->base.downstream, &frm);
- if (status != APR_SUCCESS)
- AUDIO_LOG_ERROR("audioresize write_frame from downstream failed");
- //OutputDebugStringA("x");
- resize->pending_write_offset += resize->write_downstream_psize;
- resize->pending_write.size -= resize->write_downstream_psize;
- resize->pending_write.dtmf = 0;
- if (resize->pending_write.size == 0)
- resize->pending_write_offset = 0;
- }
-
- return APR_SUCCESS;
- }
- static audiostream_vtbl_t g_stream_vtbl = {
- &read_frame,
- &write_frame,
- };
- apr_status_t audioresize_create(apr_pool_t *pool,
- audioengine_t *engine,
- int read_upsteam_psize,
- int read_downstream_psize,
- int write_upsteam_psize,
- int write_downstream_psize,
- audioresize_t **p_resize)
- {
- audioresize_t *resize;
- resize = apr_palloc(pool, sizeof(audioresize_t));
- audiostream_init(engine, &g_stream_vtbl, &resize->base);
- resize->base.direction = STREAM_DIR_BOTH;
- resize->read_upstream_psize = read_upsteam_psize;
- resize->read_downstream_psize = read_downstream_psize;
- resize->write_upstream_psize = write_upsteam_psize;
- resize->write_downstream_psize = write_downstream_psize;
- if (read_upsteam_psize != read_downstream_psize) {
- resize->pending_read.size = 0;
- resize->pending_read.dtmf = 0;
- resize->pending_read.buffer = apr_palloc(pool, SUGGEST_FRAME_SIZE);
- resize->pending_read_offset = 0;
- }
- if (write_upsteam_psize != write_downstream_psize) {
- resize->pending_write.size = 0;
- resize->pending_write.dtmf = 0;
- resize->pending_write.buffer = apr_palloc(pool, SUGGEST_FRAME_SIZE);
- resize->pending_write_offset = 0;
- }
- *p_resize = resize;
- return APR_SUCCESS;
- }
- void audioresize_destroy(audioresize_t *resize)
- {
-
- }
|