summaryrefslogtreecommitdiff
blob: 2aa84369c80c1049492ffeadb2958e3533ac1fcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
From 1eb324f60f8df6bc7a866679919d79f1a2a3ff81 Mon Sep 17 00:00:00 2001
From: Colin Guthrie <cguthrie@mandriva.org>
Date: Sat, 24 Apr 2010 14:54:36 +0100
Subject: [PATCH] pulse: Fix the reading of stream information on startup.

Due to the new probe+reconnect logic, it is possible to initialise
a 'PulseStream' object and start the backend outputting it
prior to our control connection being established. This means that
we miss the subscription event and never actually associate the
PA stream index with our stream object. Whenever something changes
on the stream at the PA end things would kick in and would work fine,
so this was sometimes hard to see and identify.

This change simply invalidates all streams when we're finished connecting
to PA and then loads up all info from PA to set the indexes correctly.

CCBUG: 235193
---
 phonon/pulsesupport.cpp |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/phonon/pulsesupport.cpp b/phonon/pulsesupport.cpp
index f4f2a13..92a732d 100644
--- a/phonon/pulsesupport.cpp
+++ b/phonon/pulsesupport.cpp
@@ -569,6 +569,31 @@ static void context_state_callback(pa_context *c, void *)
                 return;
             }
             pa_operation_unref(o);
+
+            // In the case of reconnection or simply lagging behind the stream object creation
+            // on startup (due to the probe+reconnect system), we invalidate all loaded streams
+            // and then load up info about all streams.
+            for (QMap<QString, PulseStream*>::iterator it = s_outputStreams.begin(); it != s_outputStreams.end(); ++it) {
+              PulseStream *stream = *it;
+              logMessage(QString("Phonon Output Stream %1 is gone at the PA end. Marking it as invalid in our cache as we may reuse it.").arg(stream->uuid()));
+              stream->setIndex(PA_INVALID_INDEX);
+            }
+            if (!(o = pa_context_get_sink_input_info_list(c, sink_input_cb, NULL))) {
+              logMessage(QString("pa_context_get_sink_input_info_list() failed"));
+              return;
+            }
+            pa_operation_unref(o);
+
+            for (QMap<QString, PulseStream*>::iterator it = s_captureStreams.begin(); it != s_captureStreams.end(); ++it) {
+              PulseStream *stream = *it;
+              logMessage(QString("Phonon Capture Stream %1 is gone at the PA end. Marking it as invalid in our cache as we may reuse it.").arg(stream->uuid()));
+              stream->setIndex(PA_INVALID_INDEX);
+            }
+            if (!(o = pa_context_get_source_output_info_list(c, source_output_cb, NULL))) {
+              logMessage(QString("pa_context_get_source_output_info_list() failed"));
+              return;
+            }
+            pa_operation_unref(o);
         }
 
 #ifdef HAVE_PULSEAUDIO_DEVICE_MANAGER
-- 
1.6.1