Index: /trunk/libffado/src/libieee1394/IsoHandlerManager.cpp =================================================================== --- /trunk/libffado/src/libieee1394/IsoHandlerManager.cpp (revision 782) +++ /trunk/libffado/src/libieee1394/IsoHandlerManager.cpp (revision 784) @@ -56,4 +56,8 @@ { stopHandlers(); + pruneHandlers(); + if(m_IsoHandlers.size() > 0) { + debugError("Still some handlers in use\n"); + } if (m_Thread) { m_Thread->Stop(); Index: /trunk/libffado/src/libstreaming/StreamProcessorManager.cpp =================================================================== --- /trunk/libffado/src/libstreaming/StreamProcessorManager.cpp (revision 783) +++ /trunk/libffado/src/libstreaming/StreamProcessorManager.cpp (revision 784) @@ -120,4 +120,8 @@ { if ( *it == processor ) { + if (*it == m_SyncSource) { + debugOutput(DEBUG_LEVEL_VERBOSE, "unregistering sync source"); + m_SyncSource = NULL; + } m_ReceiveProcessors.erase(it); return true; @@ -132,4 +136,8 @@ { if ( *it == processor ) { + if (*it == m_SyncSource) { + debugOutput(DEBUG_LEVEL_VERBOSE, "unregistering sync source"); + m_SyncSource = NULL; + } m_TransmitProcessors.erase(it); return true; @@ -289,4 +297,5 @@ bool StreamProcessorManager::syncStartAll() { + if(m_SyncSource == NULL) return false; // figure out when to get the SP's running. // the xmit SP's should also know the base timestamp @@ -434,4 +443,5 @@ StreamProcessorManager::alignReceivedStreams() { + if(m_SyncSource == NULL) return false; #define ALIGN_AVERAGE_TIME_MSEC 200 #define NB_ALIGN_TRIES 40 @@ -659,10 +669,9 @@ */ bool StreamProcessorManager::waitForPeriod() { + if(m_SyncSource == NULL) return false; int time_till_next_period; bool xrun_occurred = false; debugOutput( DEBUG_LEVEL_VERY_VERBOSE, "enter...\n"); - - assert(m_SyncSource); time_till_next_period=m_SyncSource->getTimeUntilNextPeriodSignalUsecs(); @@ -839,4 +848,5 @@ */ bool StreamProcessorManager::transfer(enum StreamProcessor::eProcessorType t) { + if(m_SyncSource == NULL) return false; debugOutput( DEBUG_LEVEL_VERY_VERBOSE, "transfer(%d) at TS=%011llu (%03us %04uc %04ut)...\n", t, m_time_of_transfer, @@ -909,4 +919,5 @@ */ bool StreamProcessorManager::transferSilence(enum StreamProcessor::eProcessorType t) { + if(m_SyncSource == NULL) return false; debugOutput( DEBUG_LEVEL_VERY_VERBOSE, "transferSilence(%d) at TS=%011llu (%03us %04uc %04ut)...\n", t, m_time_of_transfer, Index: /trunk/libffado/src/genericavc/avc_avdevice.cpp =================================================================== --- /trunk/libffado/src/genericavc/avc_avdevice.cpp (revision 750) +++ /trunk/libffado/src/genericavc/avc_avdevice.cpp (revision 784) @@ -57,4 +57,20 @@ getConfigRom().getNodeId() ); addOption(Util::OptionContainer::Option("snoopMode",false)); +} + +AvDevice::~AvDevice() +{ + for ( StreamProcessorVectorIterator it = m_receiveProcessors.begin(); + it != m_receiveProcessors.end(); + ++it ) + { + delete *it; + } + for ( StreamProcessorVectorIterator it = m_transmitProcessors.begin(); + it != m_transmitProcessors.end(); + ++it ) + { + delete *it; + } } Index: /trunk/libffado/src/genericavc/avc_avdevice.h =================================================================== --- /trunk/libffado/src/genericavc/avc_avdevice.h (revision 750) +++ /trunk/libffado/src/genericavc/avc_avdevice.h (revision 784) @@ -49,6 +49,6 @@ public: AvDevice( DeviceManager& d, std::auto_ptr( configRom )); - virtual ~AvDevice() {}; - + virtual ~AvDevice(); + static bool probe( ConfigRom& configRom ); virtual bool discover(); @@ -95,4 +95,5 @@ // streaming stuff typedef std::vector< Streaming::StreamProcessor * > StreamProcessorVector; + typedef std::vector< Streaming::StreamProcessor * >::iterator StreamProcessorVectorIterator; StreamProcessorVector m_receiveProcessors; StreamProcessorVector m_transmitProcessors; Index: /trunk/libffado/src/devicemanager.cpp =================================================================== --- /trunk/libffado/src/devicemanager.cpp (revision 777) +++ /trunk/libffado/src/devicemanager.cpp (revision 784) @@ -89,6 +89,4 @@ DeviceManager::~DeviceManager() { - delete m_processorManager; - for ( FFADODeviceVectorIterator it = m_avDevices.begin(); it != m_avDevices.end(); @@ -100,4 +98,7 @@ delete *it; } + + // the SP's are automatically unregistered at the SPM + delete m_processorManager; for ( FunctorVectorIterator it = m_busreset_functors.begin();