From 0573d3cf09998342705681fd9275181e545167ab Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 23 Jul 2009 15:55:13 +0000 Subject: [PATCH] FSCORE-403 git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14331 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_resample.h | 3 +- .../mod_conference/mod_conference.c | 2 +- src/switch_core_file.c | 30 +++++++++++-------- src/switch_core_io.c | 6 ++-- src/switch_core_speech.c | 2 +- src/switch_resample.c | 5 ++-- 6 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/include/switch_resample.h b/src/include/switch_resample.h index e6e491f02e..41a666dd9a 100644 --- a/src/include/switch_resample.h +++ b/src/include/switch_resample.h @@ -80,10 +80,11 @@ typedef struct { SWITCH_DECLARE(switch_status_t) switch_resample_perform_create(switch_audio_resampler_t **new_resampler, uint32_t from_rate, uint32_t to_rate, uint32_t to_size, int quality, + uint32_t channels, const char *file, const char *func, int line); -#define switch_resample_create(_n, _fr, _tr, _ts, _q) switch_resample_perform_create(_n, _fr, _tr, _ts, _q, __FILE__, __SWITCH_FUNC__, __LINE__) +#define switch_resample_create(_n, _fr, _tr, _ts, _q, _c) switch_resample_perform_create(_n, _fr, _tr, _ts, _q, _c, __FILE__, __SWITCH_FUNC__, __LINE__) /*! \brief Destroy an existing resampler handle diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c index 0791404c79..256c523cd1 100644 --- a/src/mod/applications/mod_conference/mod_conference.c +++ b/src/mod/applications/mod_conference/mod_conference.c @@ -4795,7 +4795,7 @@ static int setup_media(conference_member_t *member, conference_obj_t *conference if (read_impl.actual_samples_per_second != conference->rate) { if (switch_resample_create(&member->read_resampler, read_impl.actual_samples_per_second, - conference->rate, member->frame_size, SWITCH_RESAMPLE_QUALITY) != SWITCH_STATUS_SUCCESS) { + conference->rate, member->frame_size, SWITCH_RESAMPLE_QUALITY, 1) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n"); goto done; } diff --git a/src/switch_core_file.c b/src/switch_core_file.c index 8c17956288..34b88e110f 100644 --- a/src/switch_core_file.c +++ b/src/switch_core_file.c @@ -123,6 +123,12 @@ SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file, } } + if (fh->pre_buffer_datalen) { + //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Prebuffering %d bytes\n", (int)fh->pre_buffer_datalen); + switch_buffer_create_dynamic(&fh->pre_buffer, fh->pre_buffer_datalen * fh->channels, fh->pre_buffer_datalen * fh->channels / 2, 0); + fh->pre_buffer_data = switch_core_alloc(fh->memory_pool, fh->pre_buffer_datalen * fh->channels); + } + if (fh->channels > 1 && (flags & SWITCH_FILE_FLAG_READ)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "File has %d channels, muxing to mono will occur.\n", fh->channels); } @@ -212,7 +218,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_read(switch_file_handle_t *fh, if (!switch_test_flag(fh, SWITCH_FILE_NATIVE) && fh->native_rate != fh->samplerate) { if (!fh->resampler) { if (switch_resample_create(&fh->resampler, - fh->native_rate, fh->samplerate, (uint32_t) orig_len, SWITCH_RESAMPLE_QUALITY) != SWITCH_STATUS_SUCCESS) { + fh->native_rate, fh->samplerate, (uint32_t) orig_len, SWITCH_RESAMPLE_QUALITY, 1) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n"); return SWITCH_STATUS_GENERR; } @@ -273,31 +279,31 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_write(switch_file_handle_t *fh, if (switch_resample_create(&fh->resampler, fh->native_rate, fh->samplerate, - (uint32_t) orig_len *fh->channels, - SWITCH_RESAMPLE_QUALITY) != SWITCH_STATUS_SUCCESS) { + (uint32_t) orig_len * 2 * fh->channels, + SWITCH_RESAMPLE_QUALITY, fh->channels) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n"); return SWITCH_STATUS_GENERR; } } - switch_resample_process(fh->resampler, data, (uint32_t)(*len * fh->channels)); - if (fh->resampler->to_len > orig_len * fh->channels) { + switch_resample_process(fh->resampler, data, (uint32_t)*len); + + if (fh->resampler->to_len > orig_len) { if (!fh->dbuf) { void *mem; - fh->dbuflen = fh->resampler->to_len * 2; + fh->dbuflen = fh->resampler->to_len * 2 * fh->channels; mem = realloc(fh->dbuf, fh->dbuflen); switch_assert(mem); fh->dbuf = mem; } switch_assert(fh->resampler->to_len * 2 <= fh->dbuflen); - memcpy(fh->dbuf, fh->resampler->to, fh->resampler->to_len * 2); + memcpy(fh->dbuf, fh->resampler->to, fh->resampler->to_len * 2 * fh->channels); data = fh->dbuf; } else { - memcpy(data, fh->resampler->to, fh->resampler->to_len * 2); + memcpy(data, fh->resampler->to, fh->resampler->to_len * 2 * fh->channels); } - *len = fh->resampler->to_len / fh->channels; - + *len = fh->resampler->to_len; } if (!*len) { @@ -316,7 +322,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_write(switch_file_handle_t *fh, if (rlen >= fh->pre_buffer_datalen) { if ((blen = switch_buffer_read(fh->pre_buffer, fh->pre_buffer_data, fh->pre_buffer_datalen))) { if (!asis) blen /= 2; - if (fh->channels) blen /= fh->channels; + if (fh->channels > 1) blen /= fh->channels; if ((status = fh->file_interface->file_write(fh, fh->pre_buffer_data, &blen)) != SWITCH_STATUS_SUCCESS) { *len = 0; } @@ -427,7 +433,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_close(switch_file_handle_t *fh) while((rlen = switch_buffer_inuse(fh->pre_buffer))) { if ((blen = switch_buffer_read(fh->pre_buffer, fh->pre_buffer_data, fh->pre_buffer_datalen))) { if (!asis) blen /= 2; - if (fh->channels) blen /= fh->channels; + if (fh->channels > 1) blen /= fh->channels; if (fh->file_interface->file_write(fh, fh->pre_buffer_data, &blen) != SWITCH_STATUS_SUCCESS) { break; } diff --git a/src/switch_core_io.c b/src/switch_core_io.c index b522f08505..bdc50b6dcf 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -271,7 +271,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi read_frame->codec->implementation->actual_samples_per_second, session->read_impl.actual_samples_per_second, session->read_impl.decoded_bytes_per_packet, - SWITCH_RESAMPLE_QUALITY); + SWITCH_RESAMPLE_QUALITY, 1); switch_mutex_unlock(session->resample_mutex); @@ -677,7 +677,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess frame->codec->implementation->actual_samples_per_second, session->write_impl.actual_samples_per_second, session->write_impl.decoded_bytes_per_packet, - SWITCH_RESAMPLE_QUALITY); + SWITCH_RESAMPLE_QUALITY, 1); switch_mutex_unlock(session->resample_mutex); @@ -961,7 +961,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess frame->codec->implementation->actual_samples_per_second, session->write_impl.actual_samples_per_second, session->write_impl.decoded_bytes_per_packet, - SWITCH_RESAMPLE_QUALITY); + SWITCH_RESAMPLE_QUALITY, 1); } switch_mutex_unlock(session->resample_mutex); diff --git a/src/switch_core_speech.c b/src/switch_core_speech.c index 5e9be3871d..0f28b623e6 100644 --- a/src/switch_core_speech.c +++ b/src/switch_core_speech.c @@ -227,7 +227,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_speech_read_tts(switch_speech_handle if (sh->native_rate && sh->samplerate && sh->native_rate != sh->samplerate) { if (!sh->resampler) { if (switch_resample_create(&sh->resampler, - sh->native_rate, sh->samplerate, (uint32_t) orig_len, SWITCH_RESAMPLE_QUALITY) != SWITCH_STATUS_SUCCESS) { + sh->native_rate, sh->samplerate, (uint32_t) orig_len, SWITCH_RESAMPLE_QUALITY, 1) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n"); return SWITCH_STATUS_GENERR; } diff --git a/src/switch_resample.c b/src/switch_resample.c index a4777b2eb0..ee353d8663 100644 --- a/src/switch_resample.c +++ b/src/switch_resample.c @@ -56,6 +56,7 @@ SWITCH_DECLARE(switch_status_t) switch_resample_perform_create(switch_audio_resa uint32_t from_rate, uint32_t to_rate, uint32_t to_size, int quality, + uint32_t channels, const char *file, const char *func, int line) { int err = 0; @@ -64,7 +65,7 @@ SWITCH_DECLARE(switch_status_t) switch_resample_perform_create(switch_audio_resa switch_zmalloc(resampler, sizeof(*resampler)); - resampler->resampler = speex_resampler_init(1, from_rate, to_rate, quality, &err); + resampler->resampler = speex_resampler_init(channels ? channels : 1, from_rate, to_rate, quality, &err); if (!resampler->resampler) { free(resampler); @@ -88,7 +89,7 @@ SWITCH_DECLARE(switch_status_t) switch_resample_perform_create(switch_audio_resa SWITCH_DECLARE(uint32_t) switch_resample_process(switch_audio_resampler_t *resampler, int16_t *src, uint32_t srclen) { resampler->to_len = resampler->to_size; - speex_resampler_process_int(resampler->resampler, 0, src, &srclen, resampler->to, &resampler->to_len); + speex_resampler_process_interleaved_int(resampler->resampler, src, &srclen, resampler->to, &resampler->to_len); return resampler->to_len; }