From: Filippo Carone Date: Sat, 19 May 2007 23:11:39 +0000 (+0000) Subject: Initial callback support in libvlc + example on how to use in the java bindings X-Git-Tag: 0.9.0-test0~7321 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=12c291f038deb29afafc050b67b81df6786fc2b9;p=vlc Initial callback support in libvlc + example on how to use in the java bindings --- diff --git a/bindings/java/VLCExample.java b/bindings/java/VLCExample.java index 92264d117c..da85cec240 100644 --- a/bindings/java/VLCExample.java +++ b/bindings/java/VLCExample.java @@ -1,6 +1,7 @@ import org.videolan.jvlc.AudioIntf; import org.videolan.jvlc.JVLC; import org.videolan.jvlc.VLCException; +import org.videolan.jvlc.VolumeListener; public class VLCExample @@ -83,6 +84,13 @@ public class VLCExample jvlc.video.setSize(300, 300); } + jvlc.audio.addVolumeListener(new VolumeListener() + { + public void volumeChanged() { + System.out.println("====> From the listener: volume changed"); + } + }); + System.out.print("Muting..."); jvlc.audio.setMute(true); Thread.sleep(3000); diff --git a/bindings/java/includes/Audio.h b/bindings/java/includes/Audio.h index a89bdf0cd2..ac949105eb 100644 --- a/bindings/java/includes/Audio.h +++ b/bindings/java/includes/Audio.h @@ -79,6 +79,14 @@ JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Audio__1getVolume JNIEXPORT void JNICALL Java_org_videolan_jvlc_Audio__1setVolume (JNIEnv *, jobject, jint); +/* + * Class: org_videolan_jvlc_Audio + * Method: _install_callback + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_org_videolan_jvlc_Audio__1install_1callback + (JNIEnv *, jobject); + #ifdef __cplusplus } #endif diff --git a/bindings/java/org/videolan/jvlc/Audio.java b/bindings/java/org/videolan/jvlc/Audio.java index 45b1f40dea..3e83f7d70c 100644 --- a/bindings/java/org/videolan/jvlc/Audio.java +++ b/bindings/java/org/videolan/jvlc/Audio.java @@ -1,28 +1,52 @@ package org.videolan.jvlc; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + public class Audio implements AudioIntf { - + private long libvlcInstance; - private native int _getTrack(); - private native void _setTrack(int track); - private native int _getChannel(); - private native void _setChannel(int channel); - private native boolean _getMute(); - private native void _setMute( boolean value ); - private native void _toggleMute(); - private native int _getVolume(); - private native void _setVolume( int volume ); - - public Audio( long instance ) { - this.libvlcInstance = instance; - } - + private native int _getTrack(); + + private native void _setTrack(int track); + + private native int _getChannel(); + + private native void _setChannel(int channel); + + private native boolean _getMute(); + + private native void _setMute(boolean value); + + private native void _toggleMute(); + + private native int _getVolume(); + + private native void _setVolume(int volume); + + private native void _install_callback(); + + private static Map objListeners = new HashMap(); + + public Audio(long instance) { + this.libvlcInstance = instance; + install_callaback(); + } + + private void install_callaback() { + objListeners.put(this, new HashSet()); + _install_callback(); + } + public int getTrack() throws VLCException { return _getTrack(); } - public void setTrack( int track ) throws VLCException { + public void setTrack(int track) throws VLCException { _setTrack(track); } @@ -30,32 +54,58 @@ public class Audio implements AudioIntf { return _getChannel(); } - public void setChannel( int channel ) throws VLCException { + public void setChannel(int channel) throws VLCException { _setChannel(channel); - } - - public boolean getMute() throws VLCException { - return _getMute(); - } - - public void setMute( boolean value ) throws VLCException { - _setMute( value ); - - } - - public void toggleMute() throws VLCException { - _toggleMute(); - } - - public int getVolume() throws VLCException { - return _getVolume(); - } - - public void setVolume(int volume) throws VLCException { - _setVolume( volume ); - - } - + } + + public boolean getMute() throws VLCException { + return _getMute(); + } + + public void setMute(boolean value) throws VLCException { + _setMute(value); + + } + + public void toggleMute() throws VLCException { + _toggleMute(); + } + + public int getVolume() throws VLCException { + return _getVolume(); + } + + public void setVolume(int volume) throws VLCException { + _setVolume(volume); + } + + public boolean addVolumeListener(VolumeListener listener) { + HashSet listeners = (HashSet) objListeners.get(this); + return listeners.add(listener); + } + + public boolean removeVolumeListener(VolumeListener listener) { + HashSet listeners = (HashSet) objListeners.get(this); + return listeners.remove(listener); + } + + // this method is invoked natively + private static void wakeupListeners() { + Set audioObjects = objListeners.keySet(); + Iterator audioObjectsIterator = audioObjects.iterator(); + + while (audioObjectsIterator.hasNext()) { + Audio audioObject = (Audio) audioObjectsIterator.next(); + HashSet listeners = (HashSet) objListeners.get(audioObject); + + Iterator listenerIterator = listeners.iterator(); + while (listenerIterator.hasNext()) { + VolumeListener listener = (VolumeListener) listenerIterator.next(); + listener.volumeChanged(); + } + } + } + public long getInstance() { return libvlcInstance; } diff --git a/bindings/java/src/Makefile.am b/bindings/java/src/Makefile.am index 64d5b336f9..df4574cc4b 100644 --- a/bindings/java/src/Makefile.am +++ b/bindings/java/src/Makefile.am @@ -7,7 +7,9 @@ libjvlc_la_SOURCES = \ utils.cc \ utils.h \ video-jni.cc \ - vlm-jni.cc + vlm-jni.cc \ + callback-jni.cc + libjvlc_la_CPPFLAGS = `$(VLC_CONFIG) --cflags pic` $(JINCLUDES) libjvlc_la_LIBADD = ../../../src/libvlc-control.la $(LIBJINCLUDES) diff --git a/bindings/java/src/core-jni.cc b/bindings/java/src/core-jni.cc index ac60bd08d9..6f103aaf94 100644 --- a/bindings/java/src/core-jni.cc +++ b/bindings/java/src/core-jni.cc @@ -70,7 +70,7 @@ JNIEXPORT jlong JNICALL Java_org_videolan_jvlc_JVLC_createInstance (JNIEnv *env, res = (long) libvlc_new(argc, (char**) argv, exception ); free( exception ); - + return res; } diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h index d2d5408e0f..8d1daa8081 100644 --- a/include/vlc/libvlc.h +++ b/include/vlc/libvlc.h @@ -803,26 +803,27 @@ VLC_PUBLIC_API libvlc_log_message_t *libvlc_log_iterator_next( libvlc_log_iterat * Register for a callback notification * \param p_instance the libvlc instance * \param i_event_type the desired event mask to which we want to listen - * \param pf_callback function the function to call when an_Event occurs + * \param f_callback the function to call when i_event_type occurs + * \param user_data user provided data to carry with the event * \param p_e an initialized exception pointer */ -/* void libvlc_callback_register_for_eventtype( libvlc_instance_t *p_instance, */ -/* libvlc_event_type_t i_event_type, */ -/* libvlc_callback_t pf_callback, */ -/* libvlc_exception_t *p_e ); */ +VLC_PUBLIC_API void libvlc_callback_register_for_event( libvlc_instance_t *p_instance, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + void *user_data, + libvlc_exception_t *p_e ); /** * Unregister a callback notification * \param p_instance the libvlc instance * \param i_event_type the desired event mask to which we want to unregister - * \param pf_function the function to call when an_Event occurs + * \param f_callback the function to call when i_event_type occurs * \param p_e an initialized exception pointer */ -/* void libvlc_callback_unregister_for_eventtype( libvlc_instance_t *p_instance, */ -/* libvlc_event_type_t i_event_type, */ -/* libvlc_callback_t pf_function, */ -/* libvlc_exception_t *p_e ); */ - +VLC_PUBLIC_API void libvlc_callback_unregister_for_event( libvlc_instance_t *p_instance, + libvlc_event_type_t i_event_type, + libvlc_callback_t f_callback, + libvlc_exception_t *p_e ); /** @} */ diff --git a/include/vlc/libvlc_structures.h b/include/vlc/libvlc_structures.h index e9708112a2..e7cb50d506 100644 --- a/include/vlc/libvlc_structures.h +++ b/include/vlc/libvlc_structures.h @@ -154,8 +154,15 @@ typedef struct libvlc_event_type_t type; char reserved[8]; /* For future use */ } libvlc_event_t; - -typedef void ( *libvlc_callback_t )( struct libvlc_instance_t *, libvlc_event_t * ); + +/** + * Callback function notification + * \param p_instance the libvlc instance + * \param p_event the event triggering the callback + * \param p_user_data user provided data + */ + +typedef void ( *libvlc_callback_t )( struct libvlc_instance_t *, libvlc_event_t *, void * ); /**@} */ diff --git a/src/Makefile.am b/src/Makefile.am index d35e6e4bf4..9e4123cc44 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -24,6 +24,7 @@ pkgincludedir = $(includedir)/vlc dist_pkginclude_HEADERS = \ ../include/vlc/vlc.h \ ../include/vlc/libvlc.h \ + ../include/vlc/libvlc_structures.h \ ../include/vlc/mediacontrol.h \ ../include/vlc/mediacontrol_structures.h \ $(NULL) @@ -326,6 +327,7 @@ SOURCES_libvlc_control = \ control/input.c \ control/video.c \ control/audio.c \ + control/callback.c \ control/mediacontrol_internal.h \ control/mediacontrol_core.c \ control/mediacontrol_util.c \ diff --git a/src/control/core.c b/src/control/core.c index 401119a430..f4f5aeb76c 100644 --- a/src/control/core.c +++ b/src/control/core.c @@ -111,7 +111,7 @@ void libvlc_destroy( libvlc_instance_t *p_instance, libvlc_exception_t *p_e ) while( p_listitem ) { - struct libvlc_callback_entry_list *p_nextlistitem = p_listitem->next; + struct libvlc_callback_entry_list_t *p_nextlistitem = p_listitem->next; free( p_listitem ); p_listitem = p_nextlistitem; } diff --git a/src/control/libvlc_internal.h b/src/control/libvlc_internal.h index 41e7352ef9..83940c50b5 100644 --- a/src/control/libvlc_internal.h +++ b/src/control/libvlc_internal.h @@ -49,8 +49,9 @@ VLC_EXPORT (int, libvlc_InternalAddIntf, ( libvlc_int_t *, const char *, vlc_boo struct libvlc_callback_entry_t { - libvlc_callback_t callback; - libvlc_event_type_t eventType; + libvlc_instance_t *p_instance; + libvlc_callback_t f_callback; + libvlc_event_type_t i_event_type; void *p_user_data; }; @@ -77,6 +78,22 @@ struct libvlc_input_t struct libvlc_instance_t *p_instance; ///< Parent instance }; + +static inline void add_callback_entry( struct libvlc_callback_entry_t *entry, + struct libvlc_callback_entry_list_t **list ) +{ + struct libvlc_callback_entry_list_t *new_listitem; + new_listitem = malloc( sizeof( struct libvlc_callback_entry_list_t ) ); + new_listitem->elmt = entry; + new_listitem->next = *list; + new_listitem->prev = NULL; + + if(*list) + (*list)->prev = new_listitem; + + *list = new_listitem; +} + #define RAISENULL( psz,a... ) { libvlc_exception_raise( p_e, psz,##a ); \ return NULL; } #define RAISEVOID( psz,a... ) { libvlc_exception_raise( p_e, psz,##a ); \