[beast/devel: 18/28] FLAC: optimize datahandle performance by improving flac_write_callback



commit 21853ee8b9229e4da82cc8016e8a2afe97e85281
Author: Stefan Westerfeld <stefan space twc de>
Date:   Sat Mar 23 15:38:56 2013 +0100

    FLAC: optimize datahandle performance by improving flac_write_callback

 bse/bsedatahandle-flac.cc |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)
---
diff --git a/bse/bsedatahandle-flac.cc b/bse/bsedatahandle-flac.cc
index f9c4949..1a2d8b9 100644
--- a/bse/bsedatahandle-flac.cc
+++ b/bse/bsedatahandle-flac.cc
@@ -112,16 +112,20 @@ private:
                        void                       *client_data)
   {
     DataHandleFlac *dh = static_cast<DataHandleFlac *> (client_data);
-    dh->m_buffer_start = frame->header.number.sample_number * frame->header.channels;
-    dh->m_buffer.clear();
+    const int channels = frame->header.channels;
+    dh->m_buffer_start = frame->header.number.sample_number * channels;
+    dh->m_buffer.resize (frame->header.blocksize * channels);
 
-    // scale with 1/32768 for 16 bit, 1/(2^23) for 24 bit
+    // scale with 1/32768 for 16 bit, 1/(2^23) for 24 bit; interleave channels
     double scale = 2.0 / (1 << frame->header.bits_per_sample);
-    for (int i = 0; i < frame->header.blocksize; i++)
+    for (int ch = 0; ch < channels; ch++)
       {
-        // interleave channels
-        for (int ch = 0; ch < frame->header.channels; ch++)
-          dh->m_buffer.push_back (buffer[ch][i] * scale);
+        int x = ch;
+        for (size_t i = 0; i < frame->header.blocksize; i++)
+          {
+            dh->m_buffer[x] = buffer[ch][i] * scale;
+            x += channels;
+          }
       }
     return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
   }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]