diff --git a/pom.xml b/pom.xml
index a47d870..83b0abe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
io.github.eduramiba
webcam-capture-driver-native
- 1.0.0
+ 1.0.1
4.0.0
jar
diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceExtended.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceExtended.java
index b07bf23..2b02ca1 100644
--- a/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceExtended.java
+++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceExtended.java
@@ -2,5 +2,5 @@ package com.github.eduramiba.webcamcapture.drivers;
import com.github.sarxos.webcam.WebcamDevice;
-public interface WebcamDeviceExtended extends WebcamDevice, WebcamDevice.FPSSource, WebcamDevice.BufferAccess, WebcamDeviceWithId, WebcamDeviceWithBufferOperations {
+public interface WebcamDeviceExtended extends WebcamDevice, WebcamDevice.FPSSource, WebcamDevice.BufferAccess, WebcamDeviceWithId, WebcamDeviceWithBufferOperations, WebcamDeviceWithCustomEvents {
}
\ No newline at end of file
diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceWithCustomEvents.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceWithCustomEvents.java
new file mode 100644
index 0000000..f94d4ba
--- /dev/null
+++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/WebcamDeviceWithCustomEvents.java
@@ -0,0 +1,14 @@
+package com.github.eduramiba.webcamcapture.drivers;
+
+import com.github.sarxos.webcam.WebcamDevice;
+
+public interface WebcamDeviceWithCustomEvents extends WebcamDevice {
+
+ interface Listener {
+ void customEventReceived(String type, Object event);
+ }
+
+ void addCustomEventsListener(Listener listener);
+
+ boolean removeCustomEventsListener(Listener listener);
+}
diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/avfoundation/driver/AVFVideoDevice.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/avfoundation/driver/AVFVideoDevice.java
index c7b0320..b0209a7 100644
--- a/src/main/java/com/github/eduramiba/webcamcapture/drivers/avfoundation/driver/AVFVideoDevice.java
+++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/avfoundation/driver/AVFVideoDevice.java
@@ -296,4 +296,15 @@ public class AVFVideoDevice implements WebcamDeviceExtended {
final Raster raster = Raster.createRaster(sampleModel, dataBuffer, null);
bufferedImage.setData(raster);
}
+
+ @Override
+ public void addCustomEventsListener(Listener listener) {
+ // NOOP. To be improved with custom events from AVFoundation
+ }
+
+ @Override
+ public boolean removeCustomEventsListener(Listener listener) {
+ // NOOP
+ return true;
+ }
}
diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerFrameGrabberSession.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerFrameGrabberSession.java
index 1a5ad76..18da135 100644
--- a/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerFrameGrabberSession.java
+++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerFrameGrabberSession.java
@@ -12,6 +12,8 @@ import java.awt.image.*;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.Consumer;
+
import javafx.scene.image.PixelFormat;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
@@ -40,6 +42,8 @@ public class CaptureManagerFrameGrabberSession {
private int bufferSizeBytes = -1;
private long lastFrameTimestamp = -1;
+ private Consumer customEventListener = (eventType) -> {};
+
public boolean init(
final CaptureManagerSource source,
final CaptureManagerStreamDescriptor stream,
@@ -190,7 +194,11 @@ public class CaptureManagerFrameGrabberSession {
session.addUpdateStateListener(new IUpdateStateListener() {
@Override
public void invoke(int aCallEventCode, int aSessionDescriptor) {
- LOG.info("invoke with (aCallEventCode, aSessionDescriptor) = ({}, {})", aCallEventCode, aSessionDescriptor);
+ final String eventType = eventCodeToEventName(aCallEventCode);
+
+ LOG.info("IUpdateStateListener invoked with (eventType, aSessionDescriptor) = ({}, {})", eventType, aSessionDescriptor);
+
+ customEventListener.accept("CaptureManagerSDK::" + eventType);
}
});
@@ -199,6 +207,23 @@ public class CaptureManagerFrameGrabberSession {
return true;
}
+ private String eventCodeToEventName(int code) {
+ switch(code) {
+ case 1: return "Error";
+ case 2: return "Status_Error";
+ case 3: return "Execution_Error";
+ case 4: return "ItIsReadyToStart";
+ case 5: return "ItIsStarted";
+ case 6: return "ItIsPaused";
+ case 7: return "ItIsStopped";
+ case 8: return "ItIsEnded";
+ case 9: return "ItIsClosed";
+ case 10: return "VideoCaptureDeviceRemoved";
+ case 11: return "SnapTrigger";
+ default: return "UnknownEvent(" + code + ")";
+ }
+ }
+
private SinkValuePart findSinkValuePart(final CaptureManagerSinkFactory sinkFactory, final String name) {
return sinkFactory.getValueParts().stream()
.filter(s -> name == null || s.getValue().equalsIgnoreCase(name))
@@ -321,6 +346,10 @@ public class CaptureManagerFrameGrabberSession {
copyBuffer(target, directBuffer);
}
+ public void setCustomEventListener(final Consumer customEventListener) {
+ this.customEventListener = customEventListener != null ? customEventListener : (eventType -> {});
+ }
+
private static int copyBuffer(ByteBuffer dest, ByteBuffer src) {
final int nTransfer = Math.min(dest.remaining(), src.remaining());
if (nTransfer > 0) {
diff --git a/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerVideoDevice.java b/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerVideoDevice.java
index 8a9b76a..b7b96a8 100644
--- a/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerVideoDevice.java
+++ b/src/main/java/com/github/eduramiba/webcamcapture/drivers/capturemanager/CaptureManagerVideoDevice.java
@@ -1,6 +1,7 @@
package com.github.eduramiba.webcamcapture.drivers.capturemanager;
import com.github.eduramiba.webcamcapture.drivers.WebcamDeviceExtended;
+import com.github.eduramiba.webcamcapture.drivers.WebcamDeviceWithCustomEvents;
import com.github.eduramiba.webcamcapture.drivers.capturemanager.model.CaptureManagerMediaType;
import com.github.eduramiba.webcamcapture.drivers.capturemanager.model.CaptureManagerSource;
import com.github.eduramiba.webcamcapture.drivers.capturemanager.model.CaptureManagerStreamDescriptor;
@@ -26,6 +27,8 @@ public class CaptureManagerVideoDevice implements WebcamDeviceExtended {
private final Dimension[] resolutions;
private Dimension resolution;
+ private final LinkedHashSet listeners = new LinkedHashSet<>();
+
private CaptureManagerFrameGrabberSession session = null;
public CaptureManagerVideoDevice(CaptureManagerSource source, List sinksFactories) {
@@ -103,6 +106,8 @@ public class CaptureManagerVideoDevice implements WebcamDeviceExtended {
session = new CaptureManagerFrameGrabberSession();
+ session.setCustomEventListener(this::customEventReceived);
+
final Pair best = findBestMediaTypeInStreams(
source.getStreamDescriptors(),
resolution
@@ -281,4 +286,20 @@ public class CaptureManagerVideoDevice implements WebcamDeviceExtended {
return session.toBufferedImage(byteBuffer);
}
+
+ @Override
+ public void addCustomEventsListener(Listener listener) {
+ listeners.add(listener);
+ }
+
+ @Override
+ public boolean removeCustomEventsListener(Listener listener) {
+ return listeners.remove(listener);
+ }
+
+ public void customEventReceived(String eventType) {
+ for (Listener l: listeners) {
+ l.customEventReceived(eventType, eventType);
+ }
+ }
}