]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FSCORE-403
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 23 Jul 2009 15:55:13 +0000 (15:55 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 23 Jul 2009 15:55:13 +0000 (15:55 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14331 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_resample.h
src/mod/applications/mod_conference/mod_conference.c
src/switch_core_file.c
src/switch_core_io.c
src/switch_core_speech.c
src/switch_resample.c

index e6e491f02ec1ddd450f64daf875ca4c294f9559e..41a666dd9ad7b4ad7dab39c4a4385410aeb64244 100644 (file)
@@ -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
index 0791404c790185987489ed85e8562c71d7b290ba..256c523cd1db8ecaecabafeb51dde7c99455b719 100644 (file)
@@ -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;
                }
index 8c179562882dbcc0830fa6b885e8968daf1306b1..34b88e110f97c11e06441bcb45f135492625f12e 100644 (file)
@@ -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;
                                        }
index b522f08505a0abbef5463982684f97451c9ba7ea..bdc50b6dcf1e6c1f8feee810f482cbe580d065b5 100644 (file)
@@ -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);
 
index 5e9be3871d62c2db71f273bc0ef7efd3b2ae1f2c..0f28b623e689e9d4e2dadd93c1660ba32a9c9e60 100644 (file)
@@ -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;
                        }
index a4777b2eb0e63bf082dd5088de65fbb0fa4c3c7b..ee353d86631187458a1196b98883d41ca19d1c92 100644 (file)
@@ -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;
 }