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();