diff --git a/src/net/java/sip/communicator/impl/media/MediaControl.java b/src/net/java/sip/communicator/impl/media/MediaControl.java index 87767d4d8..4a48b9a7c 100644 --- a/src/net/java/sip/communicator/impl/media/MediaControl.java +++ b/src/net/java/sip/communicator/impl/media/MediaControl.java @@ -91,7 +91,7 @@ public class MediaControl * The processor that will be handling content coming from our capture data * sources. */ - public Processor sourceProcessor = null; + private Processor sourceProcessor = null; /** * The list of readers currently using our processor. @@ -200,8 +200,7 @@ public void propertyChange(PropertyChangeEvent evt) private void initCaptureDevices() throws MediaException { - if (avDataSource != null) - avDataSource.disconnect(); + disposeBeforeInitCaptureDevices(); // Init audio device CaptureDeviceInfo audioDeviceInfo @@ -286,6 +285,33 @@ else if (videoDataSource != null) sourceProcessor = null; } + /** + * Allows this instance to dispose of any state which is to reinitialized by + * {@link #initCaptureDevices()}. For example, a vital requirement is to + * invoke {@link Controller#close()} on sourceProcessor + * regardless of the fact that it is soon to not be referenced at all or it + * will keep unnecessary threads alive and they will in turn keep just about + * anything created to an associated Call. + */ + private void disposeBeforeInitCaptureDevices() + { + if (avDataSource != null) + avDataSource.disconnect(); + if (sourceProcessor != null) + { + sourceProcessor.stop(); + if (sourceProcessor.getState() == Processor.Realized) + { + DataSource dataOutput = sourceProcessor.getDataOutput(); + + if (dataOutput != null) + dataOutput.disconnect(); + } + sourceProcessor.deallocate(); + sourceProcessor.close(); + } + } + /** * Opens the source pointed to by the debugMediaSource URL and * prepares to use it instead of capture devices. @@ -973,9 +999,6 @@ public void stopProcessingMedia(Object reader) if( sourceProcessor.getState() == Processor.Started ) { - avDataSource.disconnect(); - sourceProcessor.stop(); - try { initCaptureDevices(); @@ -1158,19 +1181,6 @@ public void setLocalVideoAllowed(boolean allowed) { localVideoAllowed = allowed; - if (sourceProcessor != null) - { - sourceProcessor.stop(); - if (sourceProcessor.getState() == Processor.Realized) - { - DataSource dataOutput = sourceProcessor.getDataOutput(); - - if (dataOutput != null) - dataOutput.disconnect(); - } - sourceProcessor.deallocate(); - sourceProcessor.close(); - } initCaptureDevices(); } }