From 063d4c75f5ef7942e289de855a6f554e5e73db31 Mon Sep 17 00:00:00 2001
From: Alexandre Savard <alexandresavard@alexandresavard-desktop.(none)>
Date: Wed, 18 Nov 2009 15:49:54 -0500
Subject: [PATCH] [#2366] Set callback to null when deleting Pulseaudio streams

---
 sflphone-common/src/audio/pulseaudio/audiostream.cpp | 11 +++++++++--
 sflphone-common/src/audio/pulseaudio/pulselayer.cpp  | 10 +++-------
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/sflphone-common/src/audio/pulseaudio/audiostream.cpp b/sflphone-common/src/audio/pulseaudio/audiostream.cpp
index 89986506ee..38608fbf2b 100644
--- a/sflphone-common/src/audio/pulseaudio/audiostream.cpp
+++ b/sflphone-common/src/audio/pulseaudio/audiostream.cpp
@@ -101,15 +101,22 @@ AudioStream::disconnectStream (void)
 {
     _debug ("Destroy audio streams\n");
 
-    // pa_threaded_mainloop_lock (_mainloop);
+    pa_threaded_mainloop_lock (_mainloop);
 
     if (_audiostream) {
         pa_stream_disconnect (_audiostream);
+
+	// make sure we don't get any further callback
+	pa_stream_set_state_callback(_audiostream, NULL, NULL);
+	pa_stream_set_write_callback (_audiostream, NULL, NULL);
+	pa_stream_set_underflow_callback (_audiostream, NULL, NULL);
+	pa_stream_set_overflow_callback (_audiostream, NULL, NULL);
+
         pa_stream_unref (_audiostream);
         _audiostream = NULL;
     }
 
-    // pa_threaded_mainloop_unlock (_mainloop);
+    pa_threaded_mainloop_unlock (_mainloop);
 
     return true;
 }
diff --git a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
index 8f5b94c5a0..906ba0a541 100644
--- a/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
+++ b/sflphone-common/src/audio/pulseaudio/pulselayer.cpp
@@ -134,7 +134,7 @@ PulseLayer::closeLayer (void)
     // record->disconnectStream();
     // closeCaptureStream();
 
-    disconnectAudioStream();
+    // disconnectAudioStream();
 
     if (context) {
         pa_context_disconnect (context);
@@ -219,7 +219,7 @@ void PulseLayer::context_state_callback (pa_context* c, void* user_data)
 
 bool PulseLayer::disconnectAudioStream (void)
 {
-    _debug (" PulseLayer::disconnectAudioStream( void ) \n");
+    _debug ("PulseLayer::disconnectAudioStream( void ) \n");
 
     closePlaybackStream();
 
@@ -294,9 +294,7 @@ void PulseLayer::closeCaptureStream (void)
 {
     if (record) {
 
-        pa_threaded_mainloop_lock (m);
         delete record;
-        pa_threaded_mainloop_unlock (m);
         record=NULL;
     }
 }
@@ -305,9 +303,7 @@ void PulseLayer::closePlaybackStream (void)
 {
     if (playback) {
 
-        pa_threaded_mainloop_lock (m);
         delete playback;
-        pa_threaded_mainloop_unlock (m);
         playback=NULL;
     }
 }
@@ -662,7 +658,6 @@ void PulseLayer::readFromMic (void)
     size_t r;
 
     // if (record->getStreamState()
-    // pa_threaded_mainloop_lock (m);
 
     int readableSize = pa_stream_readable_size (record->pulseStream());
 
@@ -672,6 +667,7 @@ void PulseLayer::readFromMic (void)
         _debug ("pa_stream_peek() failed: %s\n" , pa_strerror (pa_context_errno (context)));
     }
 
+
     if (data != 0) {
 
         int _mainBufferSampleRate = getMainBuffer()->getInternalSamplingRate();
-- 
GitLab