]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
small tweak to resampler
authorBrian West <brian@freeswitch.org>
Wed, 30 Jan 2008 15:45:52 +0000 (15:45 +0000)
committerBrian West <brian@freeswitch.org>
Wed, 30 Jan 2008 15:45:52 +0000 (15:45 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7435 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/applications/mod_conference/mod_conference.c
src/switch_core_file.c
src/switch_core_io.c
src/switch_resample.c

index faa8829979c2e637a1af5e4f02f8ea16d2accb03..35ef69197b7a53f920e0f7f821839fd818cb61b6 100644 (file)
@@ -774,7 +774,7 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t * thread,
                                /* If the caller is not at the right sample rate resample him to suit and buffer accordingly */
                                if (imember->mux_resampler) {
                                        int16_t *bptr = (int16_t *) imember->frame;
-                                       int16_t out[1024];
+                                       int16_t out[SWITCH_RECOMMENDED_BUFFER_SIZE];
                                        int len = (int) imember->read;
 
                                        imember->mux_resampler->from_len = switch_short_to_float(bptr, imember->mux_resampler->from, (int) len / 2);
@@ -784,6 +784,10 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t * thread,
                                        switch_float_to_short(imember->mux_resampler->to, out, len);
                                        len = imember->mux_resampler->to_len * 2;
                                        
+                    if (len > SWITCH_RECOMMENDED_BUFFER_SIZE) {
+                        len = SWITCH_RECOMMENDED_BUFFER_SIZE;
+                    }
+
                                        switch_buffer_write(imember->resample_buffer, out, len);
                                        if (switch_buffer_inuse(imember->resample_buffer) >= bytes) {
                                                imember->read = (uint32_t) switch_buffer_read(imember->resample_buffer, imember->frame, bytes);
index 5d113ae9bbf8bc6fb85226a125e06e6fd99231ad..aee1344a600f48c3beb31d3ed55f0b86b23fcf54 100644 (file)
@@ -143,9 +143,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_read(switch_file_handle_t *fh,
                if (!fh->resampler) {
                        if (switch_resample_create(&fh->resampler,
                                                                           fh->native_rate,
-                                                                          orig_len * 10,
+                                                                          orig_len,
                                                                           fh->samplerate,
-                                                                          (uint32_t)orig_len * 10,
+                                                                          (uint32_t)orig_len,
                                                                           fh->memory_pool) != SWITCH_STATUS_SUCCESS) {
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n");
                                return SWITCH_STATUS_GENERR;
@@ -197,9 +197,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_write(switch_file_handle_t *fh,
                if (!fh->resampler) {
                        if (switch_resample_create(&fh->resampler,
                                                                           fh->native_rate,
-                                                                          orig_len * 10,
+                                                                          orig_len,
                                                                           fh->samplerate,
-                                                                          (uint32_t)orig_len * 10,
+                                                                          (uint32_t)orig_len,
                                                                           fh->memory_pool) != SWITCH_STATUS_SUCCESS) {
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Unable to create resampler!\n");
                                return SWITCH_STATUS_GENERR;
index 8b787c9568d8ea269968b3da4a714331208f26ed..f4d17eadb27bb043194b2bc5ab805b446b04660d 100644 (file)
@@ -192,9 +192,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_frame(switch_core_sessi
                                        switch_mutex_lock(session->resample_mutex);
                                        status = switch_resample_create(&session->read_resampler,
                                                                                                        read_frame->codec->implementation->actual_samples_per_second,
-                                                                                                       read_frame->codec->implementation->bytes_per_frame * 20,
+                                                                                                       read_frame->codec->implementation->bytes_per_frame,
                                                                                                        session->read_codec->implementation->actual_samples_per_second,
-                                                                                                       session->read_codec->implementation->bytes_per_frame * 20, session->pool);
+                                                                                                       session->read_codec->implementation->bytes_per_frame, session->pool);
                                        switch_mutex_unlock(session->resample_mutex);
                                        
                                        if (status != SWITCH_STATUS_SUCCESS) {
@@ -520,9 +520,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess
                                        switch_mutex_lock(session->resample_mutex);
                                        status = switch_resample_create(&session->write_resampler,
                                                                                                        frame->codec->implementation->actual_samples_per_second,
-                                                                                                       frame->codec->implementation->bytes_per_frame * 20,
+                                                                                                       frame->codec->implementation->bytes_per_frame,
                                                                                                        session->write_codec->implementation->actual_samples_per_second,
-                                                                                                       session->write_codec->implementation->bytes_per_frame * 20, session->pool);
+                                                                                                       session->write_codec->implementation->bytes_per_frame, session->pool);
                                        switch_mutex_unlock(session->resample_mutex);
                                        if (status != SWITCH_STATUS_SUCCESS) {
                                                goto done;
@@ -753,9 +753,9 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess
                                                                        switch_mutex_lock(session->resample_mutex);
                                                                        status = switch_resample_create(&session->read_resampler,
                                                                                                                                        frame->codec->implementation->actual_samples_per_second,
-                                                                                                                                       frame->codec->implementation->bytes_per_frame * 20,
+                                                                                                                                       frame->codec->implementation->bytes_per_frame,
                                                                                                                                        session->write_codec->implementation->actual_samples_per_second,
-                                                                                                                                       session->write_codec->implementation->bytes_per_frame * 20, session->pool);
+                                                                                                                                       session->write_codec->implementation->bytes_per_frame, session->pool);
                                                                        switch_mutex_unlock(session->resample_mutex);
                                                                        
                                                                        if (status != SWITCH_STATUS_SUCCESS) {
index c2984fcefc08ff5ed74d912aa079d66cc20b1945..409fed475347a61138245d2f850fc16daeae338e 100644 (file)
@@ -51,6 +51,8 @@
 #define MAX(a,b) ((a) > (b) ? (a) : (b))
 #endif
 
+#define resample_buffer(a, b, c) a > b ? ((a / 1000) / 2) * c : ((b / 1000) / 2) * c
+
 SWITCH_DECLARE(switch_status_t) switch_resample_create(switch_audio_resampler_t **new_resampler,
                                                                                                           int from_rate, switch_size_t from_size, int to_rate, uint32_t to_size, switch_memory_pool_t *pool)
 {
@@ -74,9 +76,9 @@ SWITCH_DECLARE(switch_status_t) switch_resample_create(switch_audio_resampler_t
        resampler->resampler = resample_open(QUALITY, resampler->factor, resampler->factor);
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Activate Resampler %d->%d %f\n", resampler->from_rate, resampler->to_rate,
                                          resampler->factor);
-       resampler->from_size = from_size;
+       resampler->from_size = resample_buffer(to_rate, from_rate, (uint32_t)from_size);
        resampler->from = (float *) switch_core_alloc(pool, resampler->from_size);
-       resampler->to_size = to_size;
+       resampler->to_size = resample_buffer(to_rate, from_rate, (uint32_t)to_size); ;
        resampler->to = (float *) switch_core_alloc(pool, resampler->to_size);
 
        *new_resampler = resampler;