Skip to content

Commit 23524f0

Browse files
committed
Fixed event forwarding
(cherry picked from commit 948bb55ded28ebc1dbddd44234453be9e277c172) (cherry picked from commit 57f6a3d)
1 parent fb2babf commit 23524f0

File tree

4 files changed

+190
-89
lines changed

4 files changed

+190
-89
lines changed

prepare_project.sh

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#!/bin/sh
22

3-
BUILD_TYPE=Release
3+
#BUILD_TYPE=Release
44
#BUILD_TYPE=RelWithDebInfo
5-
#BUILD_TYPE=Debug
5+
BUILD_TYPE=Debug
66
BUILD_DIR="build-$BUILD_TYPE"
77
mkdir "$BUILD_DIR" && cd "$BUILD_DIR"
88
cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DGENERATE_JAVA_CLIENT_PROJECT=TRUE -DGENERATE_JS_CLIENT_PROJECT=TRUE ..
@@ -12,6 +12,7 @@ make test_constructors
1212
make test_sip_rtp_endpoint
1313
make test_sip_rtp_endpoint_play
1414
make test_sip_rtp_endpoint_agnostic_srtp
15+
make test_event_forwarding
1516
make test
1617

1718

src/server/implementation/objects/ComposedObjectImpl.cpp

+102-69
Original file line numberDiff line numberDiff line change
@@ -60,29 +60,120 @@ ComposedObjectImpl::~ComposedObjectImpl()
6060
{
6161
element = origElem;
6262

63-
disconnectForwardSignals ();
63+
disconnectBridgeSignals ();
6464
}
6565

6666

6767

6868

6969
void
70-
ComposedObjectImpl::disconnectForwardSignals ()
70+
ComposedObjectImpl::disconnectBridgeSignals ()
7171
{
7272
connElementConnectedSrc.disconnect ();
7373
connElementConnectedSink.disconnect ();
7474
connElementDisconnectedSrc.disconnect ();
7575
connElementDisconnectedSink.disconnect ();
76+
connErrorSrc.disconnect ();
77+
connErrorSink.disconnect ();
78+
}
79+
80+
void
81+
ComposedObjectImpl::disconnectElementSrcSignals ()
82+
{
7683
connMediaTranscodingStateChangeSrc.disconnect ();
77-
connMediaTranscodingStateChangeSink.disconnect ();
7884
connMediaFlowOutStateChange.disconnect ();
85+
connErrorlinkedSrc.disconnect ();
86+
}
87+
88+
// This method should only be called from linkElement with the mutex held
89+
void
90+
ComposedObjectImpl::connectElementSrcSignals ()
91+
{
92+
std::weak_ptr<MediaObject> wt = shared_from_this ();
93+
94+
if (linkedSource == NULL)
95+
return;
96+
97+
connMediaTranscodingStateChangeSrc = std::dynamic_pointer_cast<MediaElementImpl>(linkedSource)->signalMediaTranscodingStateChange.connect([ &, wt ] (
98+
MediaTranscodingStateChange event) {
99+
std::shared_ptr<MediaObject> sth = wt.lock ();
100+
if (!sth)
101+
return;
102+
103+
raiseEvent<MediaTranscodingStateChange> (event, sth, signalMediaTranscodingStateChange);
104+
});
105+
106+
connMediaFlowOutStateChange = std::dynamic_pointer_cast<MediaElementImpl>(linkedSource)->signalMediaFlowOutStateChange.connect([ &, wt ] (
107+
MediaFlowOutStateChange event) {
108+
std::shared_ptr<MediaObject> sth = wt.lock ();
109+
if (!sth)
110+
return;
111+
112+
raiseEvent<MediaFlowOutStateChange> (event, sth, signalMediaFlowOutStateChange);
113+
});
114+
115+
connErrorlinkedSrc = std::dynamic_pointer_cast<MediaElementImpl>(linkedSource)->signalError.connect([ &, wt ] (
116+
Error event) {
117+
std::shared_ptr<MediaObject> sth = wt.lock ();
118+
if (!sth)
119+
return;
120+
121+
raiseEvent<Error> (event, sth, signalError);
122+
});
123+
124+
}
125+
126+
void
127+
ComposedObjectImpl::disconnectElementSinkSignals ()
128+
{
129+
connMediaTranscodingStateChangeSink.disconnect ();
79130
connMediaFlowInStateChange.disconnect ();
80-
connErrorSrc.disconnect ();
81-
connErrorSink.disconnect ();
131+
if (linkedSink != linkedSource)
132+
connErrorlinkedSink.disconnect ();
133+
}
134+
135+
void
136+
ComposedObjectImpl::connectElementSinkSignals ()
137+
{
138+
std::weak_ptr<MediaObject> wt = shared_from_this ();
139+
140+
if (linkedSink == NULL)
141+
return;
142+
143+
connMediaTranscodingStateChangeSink = std::dynamic_pointer_cast<MediaElementImpl>(linkedSink)->signalMediaTranscodingStateChange.connect([ &, wt ] (
144+
MediaTranscodingStateChange event) {
145+
std::shared_ptr<MediaObject> sth = wt.lock ();
146+
if (!sth)
147+
return;
148+
149+
raiseEvent<MediaTranscodingStateChange> (event, sth, signalMediaTranscodingStateChange);
150+
});
151+
152+
connMediaFlowInStateChange = std::dynamic_pointer_cast<MediaElementImpl>(linkedSink)->signalMediaFlowInStateChange.connect([ &, wt ] (
153+
MediaFlowInStateChange event) {
154+
std::shared_ptr<MediaObject> sth = wt.lock ();
155+
if (!sth)
156+
return;
157+
158+
raiseEvent<MediaFlowInStateChange> (event, sth, signalMediaFlowInStateChange);
159+
});
160+
161+
if (linkedSink != linkedSource) {
162+
connErrorlinkedSink = std::dynamic_pointer_cast<MediaElementImpl>(linkedSink)->signalError.connect([ &, wt ] (
163+
Error event) {
164+
std::shared_ptr<MediaObject> sth = wt.lock ();
165+
if (!sth)
166+
return;
167+
168+
raiseEvent<Error> (event, sth, signalError);
169+
});
170+
}
171+
82172
}
83173

174+
84175
void
85-
ComposedObjectImpl::connectForwardSignals ()
176+
ComposedObjectImpl::connectBridgeSignals ()
86177
{
87178
std::weak_ptr<MediaObject> wt = shared_from_this ();
88179

@@ -150,42 +241,6 @@ ComposedObjectImpl::connectForwardSignals ()
150241
}
151242
});
152243

153-
connMediaTranscodingStateChangeSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaTranscodingStateChange.connect([ &, wt ] (
154-
MediaTranscodingStateChange event) {
155-
std::shared_ptr<MediaObject> sth = wt.lock ();
156-
if (!sth)
157-
return;
158-
159-
raiseEvent<MediaTranscodingStateChange> (event, sth, signalMediaTranscodingStateChange);
160-
});
161-
162-
connMediaTranscodingStateChangeSink = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaTranscodingStateChange.connect([ &, wt ] (
163-
MediaTranscodingStateChange event) {
164-
std::shared_ptr<MediaObject> sth = wt.lock ();
165-
if (!sth)
166-
return;
167-
168-
raiseEvent<MediaTranscodingStateChange> (event, sth, signalMediaTranscodingStateChange);
169-
});
170-
171-
connMediaFlowOutStateChange = std::dynamic_pointer_cast<MediaElementImpl>(sinkPt)->signalMediaFlowOutStateChange.connect([ &, wt ] (
172-
MediaFlowOutStateChange event) {
173-
std::shared_ptr<MediaObject> sth = wt.lock ();
174-
if (!sth)
175-
return;
176-
177-
raiseEvent<MediaFlowOutStateChange> (event, sth, signalMediaFlowOutStateChange);
178-
});
179-
180-
connMediaFlowInStateChange = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalMediaFlowInStateChange.connect([ &, wt ] (
181-
MediaFlowInStateChange event) {
182-
std::shared_ptr<MediaObject> sth = wt.lock ();
183-
if (!sth)
184-
return;
185-
186-
raiseEvent<MediaFlowInStateChange> (event, sth, signalMediaFlowInStateChange);
187-
});
188-
189244
connErrorSrc = std::dynamic_pointer_cast<MediaElementImpl>(srcPt)->signalError.connect([ &, wt ] (
190245
Error event) {
191246
std::shared_ptr<MediaObject> sth = wt.lock ();
@@ -258,7 +313,7 @@ ComposedObjectImpl::postConstructor ()
258313
origElem = getGstreamerElement ();
259314
element = srcPt->getGstreamerElement();
260315

261-
connectForwardSignals ();
316+
connectBridgeSignals ();
262317
}
263318

264319
ComposedObjectImpl::StaticConstructor ComposedObjectImpl::staticConstructor;
@@ -280,52 +335,30 @@ void ComposedObjectImpl::linkMediaElement(std::shared_ptr<MediaElement> linkSrc,
280335
// Unlink source
281336
linkedSource->disconnect(sinkPt);
282337

283-
connErrorlinkedSrc.disconnect ();
338+
disconnectElementSrcSignals ();
284339
}
285340
if (linkedSink != NULL) {
286341
// Unlink sink
287342
srcPt->disconnect(linkedSink);
288343

289-
if (linkedSink != linkedSource)
290-
connErrorlinkedSink.disconnect ();
344+
disconnectElementSinkSignals ();
291345
}
292346

293347
linkedSource = linkSrc;
294348
linkedSink = linkSink;
295349

296350
// Link source and sink from new composed object
297351
if (linkedSource != NULL) {
298-
std::weak_ptr<MediaObject> wt = shared_from_this();
299-
300352
// Link Source
301353
linkedSource->connect(sinkPt);
302354

303-
connErrorlinkedSrc = std::dynamic_pointer_cast<MediaElementImpl>(linkedSource)->signalError.connect([ &, wt ] (
304-
Error event) {
305-
std::shared_ptr<MediaObject> sth = wt.lock ();
306-
if (!sth)
307-
return;
308-
309-
raiseEvent<Error> (event, sth, signalError);
310-
});
311-
355+
connectElementSrcSignals ();
312356
}
313357
if (linkedSink != NULL) {
314-
std::weak_ptr<MediaObject> wt = shared_from_this();
315-
316358
// Link sink
317359
srcPt->connect(linkedSink);
318360

319-
if (linkedSink != linkedSource) {
320-
connErrorlinkedSink = std::dynamic_pointer_cast<MediaElementImpl>(linkedSink)->signalError.connect([ &, wt ] (
321-
Error event) {
322-
std::shared_ptr<MediaObject> sth = wt.lock ();
323-
if (!sth)
324-
return;
325-
326-
raiseEvent<Error> (event, sth, signalError);
327-
});
328-
}
361+
connectElementSinkSignals ();
329362
}
330363

331364
linkMutex.unlock();

src/server/implementation/objects/ComposedObjectImpl.hpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,14 @@ class ComposedObjectImpl : public MediaElementImpl
152152

153153
static StaticConstructor staticConstructor;
154154

155-
void connectForwardSignals ();
156-
void disconnectForwardSignals ();
155+
void connectBridgeSignals ();
156+
void disconnectBridgeSignals ();
157+
158+
void connectElementSrcSignals ();
159+
void disconnectElementSrcSignals ();
160+
161+
void connectElementSinkSignals ();
162+
void disconnectElementSinkSignals ();
157163

158164
};
159165

0 commit comments

Comments
 (0)