Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
VideoLAN
libvlcpp
Commits
e0e46032
Commit
e0e46032
authored
Mar 03, 2015
by
Hugo Beauzée-Luyssen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
EventManager: Allow events to be unregistered by copying the event manager and destroying the copy.
parent
a0162191
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
73 additions
and
43 deletions
+73
-43
src/EventManager.hpp
src/EventManager.hpp
+17
-0
src/Internal.hpp
src/Internal.hpp
+1
-0
src/Media.hpp
src/Media.hpp
+4
-4
src/MediaDiscoverer.hpp
src/MediaDiscoverer.hpp
+4
-4
src/MediaList.hpp
src/MediaList.hpp
+4
-4
src/MediaListPlayer.hpp
src/MediaListPlayer.hpp
+4
-4
src/MediaPlayer.hpp
src/MediaPlayer.hpp
+3
-4
src/common.hpp
src/common.hpp
+0
-18
test/main.cpp
test/main.cpp
+36
-5
No files found.
src/EventManager.hpp
View file @
e0e46032
...
...
@@ -145,6 +145,23 @@ protected:
{
}
public:
EventManager
(
const
EventManager
&
em
)
:
Internal
(
em
)
{
// Use an empty list of events
}
EventManager
&
operator
=
(
const
EventManager
&
em
)
{
Internal
::
operator
=
(
em
);
return
*
this
;
}
EventManager
(
EventManager
&&
)
=
default
;
EventManager
&
operator
=
(
EventManager
&&
)
=
default
;
protected:
/**
* @brief handle Provides the common behavior for all event handlers
* @param eventType The libvlc type of event
...
...
src/Internal.hpp
View file @
e0e46032
...
...
@@ -49,6 +49,7 @@ class Internal
protected:
Internal
()
=
default
;
Internal
(
InternalPtr
obj
,
Releaser
releaser
)
:
m_obj
{
obj
,
releaser
}
{
...
...
src/Media.hpp
View file @
e0e46032
...
...
@@ -33,7 +33,7 @@ namespace VLC
{
class
MediaPlayer
;
class
EventManager
;
class
Media
EventManager
;
class
Instance
;
class
MediaList
;
...
...
@@ -302,14 +302,14 @@ public:
*
* \return event manager object
*/
MediaEventManager
Ptr
eventManager
()
MediaEventManager
&
eventManager
()
{
if
(
m_eventManager
==
NULL
)
{
libvlc_event_manager_t
*
obj
=
libvlc_media_event_manager
(
*
this
);
m_eventManager
=
std
::
make_shared
<
MediaEventManager
>
(
obj
);
}
return
m_eventManager
;
return
*
m_eventManager
;
}
/**
...
...
@@ -438,7 +438,7 @@ private:
private:
MediaEventManager
Ptr
m_eventManager
;
std
::
shared_ptr
<
MediaEventManager
>
m_eventManager
;
};
}
// namespace VLC
...
...
src/MediaDiscoverer.hpp
View file @
e0e46032
...
...
@@ -31,7 +31,7 @@
namespace
VLC
{
class
EventManager
;
class
MediaDiscoverer
EventManager
;
class
Instance
;
class
MediaDiscoverer
:
public
Internal
<
libvlc_media_discoverer_t
>
...
...
@@ -71,14 +71,14 @@ public:
*
* \return event manager object.
*/
MediaDiscovererEventManager
Ptr
eventManager
()
MediaDiscovererEventManager
&
eventManager
()
{
if
(
m_eventManager
)
{
libvlc_event_manager_t
*
obj
=
libvlc_media_discoverer_event_manager
(
*
this
);
m_eventManager
=
std
::
make_shared
<
MediaDiscovererEventManager
>
(
obj
);
}
return
m_eventManager
;
return
*
m_eventManager
;
}
/**
...
...
@@ -92,7 +92,7 @@ public:
}
private:
MediaDiscovererEventManager
Ptr
m_eventManager
;
std
::
shared_ptr
<
MediaDiscovererEventManager
>
m_eventManager
;
};
}
// namespace VLC
...
...
src/MediaList.hpp
View file @
e0e46032
...
...
@@ -30,7 +30,7 @@ namespace VLC
{
class
Media
;
class
EventManager
;
class
MediaList
EventManager
;
class
MediaDiscoverer
;
class
MediaLibrary
;
...
...
@@ -225,18 +225,18 @@ public:
*
* \return libvlc_event_manager
*/
MediaListEventManager
Ptr
eventManager
()
MediaListEventManager
&
eventManager
()
{
if
(
m_eventManager
)
{
libvlc_event_manager_t
*
obj
=
libvlc_media_list_event_manager
(
*
this
);
m_eventManager
=
std
::
make_shared
<
MediaListEventManager
>
(
obj
);
}
return
m_eventManager
;
return
*
m_eventManager
;
}
private:
MediaListEventManager
Ptr
m_eventManager
;
std
::
shared_ptr
<
MediaListEventManager
>
m_eventManager
;
};
}
// namespace VLC
...
...
src/MediaListPlayer.hpp
View file @
e0e46032
...
...
@@ -31,7 +31,7 @@
namespace
VLC
{
class
MediaListEventManager
;
class
MediaList
Player
EventManager
;
class
MediaPlayer
;
class
MediaList
;
...
...
@@ -65,14 +65,14 @@ public:
*
* \return the event manager
*/
MediaListPlayerEventManager
Ptr
eventManager
()
MediaListPlayerEventManager
&
eventManager
()
{
if
(
m_eventManager
)
{
libvlc_event_manager_t
*
obj
=
libvlc_media_list_player_event_manager
(
*
this
);
m_eventManager
=
std
::
make_shared
<
MediaListPlayerEventManager
>
(
obj
);
}
return
m_eventManager
;
return
*
m_eventManager
;
}
...
...
@@ -198,7 +198,7 @@ public:
}
private:
MediaListPlayerEventManager
Ptr
m_eventManager
;
std
::
shared_ptr
<
MediaListPlayerEventManager
>
m_eventManager
;
};
...
...
src/MediaPlayer.hpp
View file @
e0e46032
...
...
@@ -105,14 +105,14 @@ public:
*
* \return the event manager associated with p_mi
*/
MediaPlayerEventManager
Ptr
eventManager
()
MediaPlayerEventManager
&
eventManager
()
{
if
(
m_eventManager
==
NULL
)
{
libvlc_event_manager_t
*
obj
=
libvlc_media_player_event_manager
(
*
this
);
m_eventManager
=
std
::
make_shared
<
MediaPlayerEventManager
>
(
obj
);
}
return
m_eventManager
;
return
*
m_eventManager
;
}
/**
...
...
@@ -1573,8 +1573,7 @@ private:
}
private:
MediaPlayerEventManagerPtr
m_eventManager
;
std
::
shared_ptr
<
MediaPlayerEventManager
>
m_eventManager
;
};
}
// namespace VLC
...
...
src/common.hpp
View file @
e0e46032
...
...
@@ -29,24 +29,6 @@
namespace
VLC
{
class
EventManager
;
using
EventManagerPtr
=
std
::
shared_ptr
<
EventManager
>
;
class
MediaEventManager
;
using
MediaEventManagerPtr
=
std
::
shared_ptr
<
MediaEventManager
>
;
class
MediaPlayerEventManager
;
using
MediaPlayerEventManagerPtr
=
std
::
shared_ptr
<
MediaPlayerEventManager
>
;
class
MediaListPlayerEventManager
;
using
MediaListPlayerEventManagerPtr
=
std
::
shared_ptr
<
MediaListPlayerEventManager
>
;
class
MediaDiscovererEventManager
;
using
MediaDiscovererEventManagerPtr
=
std
::
shared_ptr
<
MediaDiscovererEventManager
>
;
class
MediaListEventManager
;
using
MediaListEventManagerPtr
=
std
::
shared_ptr
<
MediaListEventManager
>
;
class
Media
;
using
MediaPtr
=
std
::
shared_ptr
<
Media
>
;
...
...
test/main.cpp
View file @
e0e46032
...
...
@@ -21,7 +21,7 @@ int main(int ac, char** av)
auto
media
=
VLC
::
Media
(
instance
,
av
[
1
],
VLC
::
Media
::
FromPath
);
auto
mp
=
VLC
::
MediaPlayer
(
media
);
auto
eventManager
=
mp
.
eventManager
();
eventManager
->
onPlaying
([
&
media
]()
{
eventManager
.
onPlaying
([
&
media
]()
{
std
::
cout
<<
media
.
mrl
()
<<
" is playing"
<<
std
::
endl
;
});
/*
...
...
@@ -34,7 +34,7 @@ int main(int ac, char** av)
bool
expected
=
true
;
auto
&
handler
=
mp
.
eventManager
()
->
onPositionChanged
([
&
expected
](
float
pos
)
{
auto
&
handler
=
mp
.
eventManager
()
.
onPositionChanged
([
&
expected
](
float
pos
)
{
std
::
cout
<<
"position changed "
<<
pos
<<
std
::
endl
;
assert
(
expected
);
});
...
...
@@ -51,15 +51,46 @@ int main(int ac, char** av)
std
::
cout
<<
"Lambda called"
<<
std
::
endl
;
assert
(
expected
);
};
auto
&
h1
=
mp
.
eventManager
()
->
onTimeChanged
(
l
);
auto
&
h2
=
mp
.
eventManager
()
->
onPositionChanged
(
l
);
auto
&
h1
=
mp
.
eventManager
()
.
onTimeChanged
(
l
);
auto
&
h2
=
mp
.
eventManager
()
.
onPositionChanged
(
l
);
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
seconds
(
2
)
);
// Unregistering multiple events at once.
// h1 and h2 are now invalid.
mp
.
eventManager
()
->
unregister
(
h1
,
h2
);
mp
.
eventManager
()
.
unregister
(
h1
,
h2
);
expected
=
false
;
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
500
)
);
// Using scopped event manager to automatically unregister events
{
expected
=
true
;
// This is a copy. Assigning to a reference wouldn't clear the registered events
auto
em
=
mp
.
eventManager
();
em
.
onPositionChanged
([
&
expected
](
float
)
{
assert
(
expected
);
});
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
seconds
(
1
)
);
}
// From here, the lambda declared in the scope isn't registered anymore
expected
=
false
;
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
500
)
);
// Showing that copying an object shares the associated eventmanager
auto
mp2
=
mp
;
expected
=
true
;
auto
&
h3
=
mp2
.
eventManager
().
onStopped
([
&
expected
]()
{
std
::
cout
<<
"MediaPlayer stopped"
<<
std
::
endl
;
assert
(
expected
);
// expect a single call since both media player share the same event manager
expected
=
false
;
});
mp
.
stop
();
// Unregister the RegisteredEvent from the other MP's event manager.
// It will be unregistered from both, and when the object gets destroyed
// by leaving the scope, it won't be unregistered from mp2's eventManager.
// If it did, libvlc would assert as the event has been unregistered already.
mp
.
eventManager
().
unregister
(
h3
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment