@@ -84,82 +84,124 @@ ComposedObjectImpl::disconnectForwardSignals ()
84
84
void
85
85
ComposedObjectImpl::connectForwardSignals ()
86
86
{
87
- connElementConnectedSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalElementConnected .connect ([ & ] (
87
+ std::weak_ptr<MediaObject> wt = shared_from_this ();
88
+
89
+ connElementConnectedSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalElementConnected .connect ([ &, wt ] (
88
90
ElementConnected event) {
91
+ std::shared_ptr<MediaObject> sth = wt.lock ();
92
+ if (!sth)
93
+ return ;
94
+
89
95
// We don't raise internal connection events'
90
96
if (event.getSource ()==srcPt)
91
97
return ;
92
98
if (event.getSink () == sinkPt)
93
99
return ;
94
- raiseEvent<ElementConnected> (event, shared_from_this () , signalElementConnected);
100
+ raiseEvent<ElementConnected> (event, sth , signalElementConnected);
95
101
});
96
102
97
- connElementConnectedSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalElementConnected .connect ([ & ] (
103
+ connElementConnectedSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalElementConnected .connect ([ &, wt ] (
98
104
ElementConnected event) {
105
+ std::shared_ptr<MediaObject> sth = wt.lock ();
106
+ if (!sth)
107
+ return ;
108
+
99
109
// We don't raise internal connection events'
100
110
if (event.getSource ()==srcPt)
101
111
return ;
102
112
if (event.getSink () == sinkPt)
103
113
return ;
104
- raiseEvent<ElementConnected> (event, shared_from_this () , signalElementConnected);
114
+ raiseEvent<ElementConnected> (event, sth , signalElementConnected);
105
115
});
106
116
107
- connElementDisconnectedSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalElementDisconnected .connect ([ & ] (
117
+ connElementDisconnectedSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalElementDisconnected .connect ([ &, wt ] (
108
118
ElementDisconnected event) {
109
119
try {
120
+ std::shared_ptr<MediaObject> sth = wt.lock ();
121
+ if (!sth)
122
+ return ;
123
+
110
124
// We don't raise internal connection events'
111
125
if (event.getSource ()==srcPt)
112
126
return ;
113
127
if (event.getSink () == sinkPt)
114
128
return ;
115
- raiseEvent<ElementDisconnected> (event, shared_from_this () , signalElementDisconnected);
129
+ raiseEvent<ElementDisconnected> (event, sth , signalElementDisconnected);
116
130
} catch (const std::bad_weak_ptr &e) {
117
131
// shared_from_this()
118
132
}
119
133
});
120
134
121
- connElementDisconnectedSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalElementDisconnected .connect ([ & ] (
135
+ connElementDisconnectedSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalElementDisconnected .connect ([ &, wt ] (
122
136
ElementDisconnected event) {
123
137
try {
138
+ std::shared_ptr<MediaObject> sth = wt.lock ();
139
+ if (!sth)
140
+ return ;
141
+
124
142
// We don't raise internal connection events'
125
143
if (event.getSource ()==srcPt)
126
144
return ;
127
145
if (event.getSink () == sinkPt)
128
146
return ;
129
- raiseEvent<ElementDisconnected> (event, shared_from_this () , signalElementDisconnected);
147
+ raiseEvent<ElementDisconnected> (event, sth , signalElementDisconnected);
130
148
} catch (const std::bad_weak_ptr &e) {
131
149
// shared_from_this()
132
150
}
133
151
});
134
152
135
- connMediaTranscodingStateChangeSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaTranscodingStateChange .connect ([ & ] (
153
+ connMediaTranscodingStateChangeSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaTranscodingStateChange .connect ([ &, wt ] (
136
154
MediaTranscodingStateChange event) {
137
- raiseEvent<MediaTranscodingStateChange> (event, shared_from_this (), signalMediaTranscodingStateChange);
155
+ std::shared_ptr<MediaObject> sth = wt.lock ();
156
+ if (!sth)
157
+ return ;
158
+
159
+ raiseEvent<MediaTranscodingStateChange> (event, sth, signalMediaTranscodingStateChange);
138
160
});
139
161
140
- connMediaTranscodingStateChangeSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaTranscodingStateChange .connect ([ & ] (
162
+ connMediaTranscodingStateChangeSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaTranscodingStateChange .connect ([ &, wt ] (
141
163
MediaTranscodingStateChange event) {
142
- raiseEvent<MediaTranscodingStateChange> (event, shared_from_this (), signalMediaTranscodingStateChange);
164
+ std::shared_ptr<MediaObject> sth = wt.lock ();
165
+ if (!sth)
166
+ return ;
167
+
168
+ raiseEvent<MediaTranscodingStateChange> (event, sth, signalMediaTranscodingStateChange);
143
169
});
144
170
145
- connMediaFlowOutStateChange = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaFlowOutStateChange .connect ([ & ] (
171
+ connMediaFlowOutStateChange = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaFlowOutStateChange .connect ([ &, wt ] (
146
172
MediaFlowOutStateChange event) {
147
- raiseEvent<MediaFlowOutStateChange> (event, shared_from_this (), signalMediaFlowOutStateChange);
173
+ std::shared_ptr<MediaObject> sth = wt.lock ();
174
+ if (!sth)
175
+ return ;
176
+
177
+ raiseEvent<MediaFlowOutStateChange> (event, sth, signalMediaFlowOutStateChange);
148
178
});
149
179
150
- connMediaFlowInStateChange = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaFlowInStateChange .connect ([ & ] (
180
+ connMediaFlowInStateChange = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaFlowInStateChange .connect ([ &, wt ] (
151
181
MediaFlowInStateChange event) {
152
- raiseEvent<MediaFlowInStateChange> (event, shared_from_this (), signalMediaFlowInStateChange);
182
+ std::shared_ptr<MediaObject> sth = wt.lock ();
183
+ if (!sth)
184
+ return ;
185
+
186
+ raiseEvent<MediaFlowInStateChange> (event, sth, signalMediaFlowInStateChange);
153
187
});
154
188
155
- connErrorSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalError .connect ([ & ] (
189
+ connErrorSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalError .connect ([ &, wt ] (
156
190
Error event) {
157
- raiseEvent<Error> (event, shared_from_this (), signalError);
191
+ std::shared_ptr<MediaObject> sth = wt.lock ();
192
+ if (!sth)
193
+ return ;
194
+
195
+ raiseEvent<Error> (event, sth, signalError);
158
196
});
159
197
160
- connErrorSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalError .connect ([ & ] (
198
+ connErrorSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalError .connect ([ &, wt ] (
161
199
Error event) {
162
- raiseEvent<Error> (event, shared_from_this (), signalError);
200
+ std::shared_ptr<MediaObject> sth = wt.lock ();
201
+ if (!sth)
202
+ return ;
203
+
204
+ raiseEvent<Error> (event, sth, signalError);
163
205
});
164
206
}
165
207
@@ -253,23 +295,35 @@ void ComposedObjectImpl::linkMediaElement(std::shared_ptr<MediaElement> linkSrc,
253
295
254
296
// Link source and sink from new composed object
255
297
if (linkedSource != NULL ) {
298
+ std::weak_ptr<MediaObject> wt = shared_from_this ();
299
+
256
300
// Link Source
257
301
linkedSource->connect (sinkPt);
258
302
259
- connErrorlinkedSrc = std::dynamic_pointer_cast<MediaElementImpl>(linkedSource)->signalError .connect ([ & ] (
303
+ connErrorlinkedSrc = std::dynamic_pointer_cast<MediaElementImpl>(linkedSource)->signalError .connect ([ &, wt ] (
260
304
Error event) {
261
- raiseEvent<Error> (event, shared_from_this (), signalError);
305
+ std::shared_ptr<MediaObject> sth = wt.lock ();
306
+ if (!sth)
307
+ return ;
308
+
309
+ raiseEvent<Error> (event, sth, signalError);
262
310
});
263
311
264
312
}
265
313
if (linkedSink != NULL ) {
314
+ std::weak_ptr<MediaObject> wt = shared_from_this ();
315
+
266
316
// Link sink
267
317
srcPt->connect (linkedSink);
268
318
269
319
if (linkedSink != linkedSource) {
270
- connErrorlinkedSink = std::dynamic_pointer_cast<MediaElementImpl>(linkedSink)->signalError .connect ([ & ] (
320
+ connErrorlinkedSink = std::dynamic_pointer_cast<MediaElementImpl>(linkedSink)->signalError .connect ([ &, wt ] (
271
321
Error event) {
272
- raiseEvent<Error> (event, shared_from_this (), signalError);
322
+ std::shared_ptr<MediaObject> sth = wt.lock ();
323
+ if (!sth)
324
+ return ;
325
+
326
+ raiseEvent<Error> (event, sth, signalError);
273
327
});
274
328
}
275
329
}
0 commit comments