[Android] MediaList: fix dubious usage of ItemAdded event
Thomas Guillem
git at videolan.org
Tue Nov 14 12:02:58 CET 2017
vlc-android | branch: 2.5.x | Thomas Guillem <thomas at gllm.fr> | Tue Nov 14 10:01:35 2017 +0100| [910856116320514bf510c5fc3898e9d6e5b37e1c] | committer: Geoffrey Métais
MediaList: fix dubious usage of ItemAdded event
The media will now be always valid from this event.
(cherry picked from commit e27b1274612a150e4279358122e14dce3e9a2bfb)
> https://code.videolan.org/videolan/vlc-android/commit/910856116320514bf510c5fc3898e9d6e5b37e1c
---
libvlc/src/org/videolan/libvlc/MediaList.java | 24 ++++++++++++++++--------
libvlc/src/org/videolan/libvlc/VLCEvent.java | 12 ++++++++----
libvlc/src/org/videolan/libvlc/VLCObject.java | 1 +
3 files changed, 25 insertions(+), 12 deletions(-)
diff --git a/libvlc/src/org/videolan/libvlc/MediaList.java b/libvlc/src/org/videolan/libvlc/MediaList.java
index 003ca2652..c6a87573a 100644
--- a/libvlc/src/org/videolan/libvlc/MediaList.java
+++ b/libvlc/src/org/videolan/libvlc/MediaList.java
@@ -36,19 +36,27 @@ public class MediaList extends VLCObject<MediaList.Event> {
public static final int EndReached = 0x204;
/**
- * The media can be already released. If it's released, cached attributes are still
- * available (like media.getMrl()).
- * You should call {@link Media#retain()} and check the return value
- * before calling media native methods.
+ * In case of ItemDeleted, the media will be already released. If it's released, cached
+ * attributes are still available (like {@link Media#getUri()}}).
*/
public final Media media;
+ private final boolean retain;
public final int index;
- protected Event(int type, Media media, int index) {
+ protected Event(int type, Media media, boolean retain, int index) {
super(type);
+ if (retain && (media == null || !media.retain()))
+ throw new IllegalStateException("invalid media reference");
this.media = media;
+ this.retain = retain;
this.index = index;
}
+
+ @Override
+ void release() {
+ if (retain)
+ media.release();
+ }
}
public interface EventListener extends VLCEvent.Listener<MediaList.Event> {}
@@ -133,18 +141,18 @@ public class MediaList extends VLCObject<MediaList.Event> {
index = (int) arg1;
if (index != -1) {
final Media media = insertMediaFromEvent(index);
- event = new Event(eventType, media, index);
+ event = new Event(eventType, media, true, index);
}
break;
case Event.ItemDeleted:
index = (int) arg1;
if (index != -1) {
final Media media = removeMediaFromEvent(index);
- event = new Event(eventType, media, index);
+ event = new Event(eventType, media, false, index);
}
break;
case Event.EndReached:
- event = new Event(eventType, null, -1);
+ event = new Event(eventType, null, false, -1);
break;
}
mLocked = false;
diff --git a/libvlc/src/org/videolan/libvlc/VLCEvent.java b/libvlc/src/org/videolan/libvlc/VLCEvent.java
index acbad6abd..7fc0c78e9 100644
--- a/libvlc/src/org/videolan/libvlc/VLCEvent.java
+++ b/libvlc/src/org/videolan/libvlc/VLCEvent.java
@@ -26,29 +26,33 @@ abstract class VLCEvent {
protected final long arg2;
protected final float argf1;
- protected VLCEvent(int type) {
+ VLCEvent(int type) {
this.type = type;
this.arg1 = this.arg2 = 0;
this.argf1 = 0.0f;
}
- protected VLCEvent(int type, long arg1) {
+ VLCEvent(int type, long arg1) {
this.type = type;
this.arg1 = arg1;
this.arg2 = 0;
this.argf1 = 0.0f;
}
- protected VLCEvent(int type, long arg1, long arg2) {
+ VLCEvent(int type, long arg1, long arg2) {
this.type = type;
this.arg1 = arg1;
this.arg2 = arg2;
this.argf1 = 0.0f;
}
- protected VLCEvent(int type, float argf) {
+ VLCEvent(int type, float argf) {
this.type = type;
this.arg1 = this.arg2 = 0;
this.argf1 = argf;
}
+ void release() {
+ /* do nothing */
+ }
+
/**
* Listener for libvlc events
*
diff --git a/libvlc/src/org/videolan/libvlc/VLCObject.java b/libvlc/src/org/videolan/libvlc/VLCObject.java
index 6afa99bd3..a22195127 100644
--- a/libvlc/src/org/videolan/libvlc/VLCObject.java
+++ b/libvlc/src/org/videolan/libvlc/VLCObject.java
@@ -153,6 +153,7 @@ abstract class VLCObject<T extends VLCEvent> {
@Override
public void run() {
listener.onEvent(event);
+ event.release();
}
}
More information about the Android
mailing list