From 3aa5fc3c21c054675462b257ccbf47ec420940c7 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Wed, 27 Jan 2021 17:43:35 -0800 Subject: [PATCH] Mixer: Avoid some unnecessary reallocations when changing channel count. --- mixer/src/Chain.C | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/mixer/src/Chain.C b/mixer/src/Chain.C index 75c2404..5d94973 100644 --- a/mixer/src/Chain.C +++ b/mixer/src/Chain.C @@ -180,6 +180,7 @@ Chain::~Chain ( ) for ( unsigned int i = scratch_port.size(); i--; ) free( (sample_t*)scratch_port[i].buffer() ); + scratch_port.clear(); /* if we leave this up to FLTK, it will happen after we've already destroyed the client */ @@ -388,17 +389,21 @@ Chain::configure_ports ( void ) if ( scratch_port.size() < req_buffers ) { - for ( unsigned int i = scratch_port.size(); i--; ) - free(scratch_port[i].buffer()); - scratch_port.clear(); - - for ( unsigned int i = 0; i < req_buffers; ++i ) - { - Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO ); + for ( unsigned int i = req_buffers - scratch_port.size(); i--; ) + { + Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO ); p.set_buffer( buffer_alloc( client()->nframes() ) ); buffer_fill_with_silence( (sample_t*)p.buffer(), client()->nframes() ); scratch_port.push_back( p ); - } + } + } + else if ( scratch_port.size() > req_buffers ) + { + for ( unsigned int i = scratch_port.size() - req_buffers; i--; ) + { + free(scratch_port.back().buffer()); + scratch_port.pop_back(); + } } build_process_queue();