+}
+
+#define VLM_CHANGE(psz_error, code ) do { \
+ vlm_media_t *p_media; \
+ vlm_t *p_vlm; \
+ int64_t id; \
+ VLM(p_vlm); \
+ if( vlm_Control( p_vlm, VLM_GET_MEDIA_ID, psz_name, &id ) || \
+ vlm_Control( p_vlm, VLM_GET_MEDIA, id, &p_media ) ) { \
+ libvlc_exception_raise( p_exception, psz_error, psz_name ); \
+ return; \
+ } \
+ if( !p_media ) goto error; \
+ \
+ code; \
+ \
+ if( vlm_Control( p_vlm, VLM_CHANGE_MEDIA, p_media ) ) { \
+ vlm_media_Delete( p_media ); \
+ goto error; \
+ } \
+ vlm_media_Delete( p_media ); \
+ return; \
+ error: \
+ libvlc_exception_raise( p_exception, psz_error, psz_name );\
+ } while(0)
+
+void libvlc_vlm_set_enabled( libvlc_instance_t *p_instance,
+ const char *psz_name, int b_enabled,
+ libvlc_exception_t *p_exception )
+{
+#define VLM_CHANGE_CODE { p_media->b_enabled = b_enabled; }
+ VLM_CHANGE( "Unable to delete %s", VLM_CHANGE_CODE );
+#undef VLM_CHANGE_CODE
+}
+
+void libvlc_vlm_set_loop( libvlc_instance_t *p_instance, const char *psz_name,
+ int b_loop, libvlc_exception_t *p_exception )
+{
+#define VLM_CHANGE_CODE { p_media->broadcast.b_loop = b_loop; }
+ VLM_CHANGE( "Unable to change %s loop property", VLM_CHANGE_CODE );
+#undef VLM_CHANGE_CODE
+}
+
+void libvlc_vlm_set_mux( libvlc_instance_t *p_instance, const char *psz_name,
+ const char *psz_mux, libvlc_exception_t *p_exception )
+{
+#define VLM_CHANGE_CODE { if( p_media->b_vod ) { \
+ free( p_media->vod.psz_mux ); \
+ p_media->vod.psz_mux = psz_mux ? strdup( psz_mux ) : NULL; \
+ } }
+ VLM_CHANGE( "Unable to change %s mux property", VLM_CHANGE_CODE );
+#undef VLM_CHANGE_CODE
+}
+
+void libvlc_vlm_set_output( libvlc_instance_t *p_instance,
+ const char *psz_name, const char *psz_output,
+ libvlc_exception_t *p_exception )
+{
+#define VLM_CHANGE_CODE { free( p_media->psz_output ); \
+ p_media->psz_output = strdup( psz_output ); }
+ VLM_CHANGE( "Unable to change %s output property", VLM_CHANGE_CODE );
+#undef VLM_CHANGE_CODE
+}
+
+void libvlc_vlm_set_input( libvlc_instance_t *p_instance,
+ const char *psz_name, const char *psz_input,
+ libvlc_exception_t *p_exception )
+{
+#define VLM_CHANGE_CODE { while( p_media->i_input > 0 ) \
+ free( p_media->ppsz_input[--p_media->i_input] );\
+ TAB_APPEND( p_media->i_input, p_media->ppsz_input, strdup(psz_input) ); }
+ VLM_CHANGE( "Unable to change %s input property", VLM_CHANGE_CODE );
+#undef VLM_CHANGE_CODE
+}
+
+void libvlc_vlm_add_input( libvlc_instance_t *p_instance,
+ const char *psz_name, const char *psz_input,
+ libvlc_exception_t *p_exception )
+{
+#define VLM_CHANGE_CODE { TAB_APPEND( p_media->i_input, p_media->ppsz_input, strdup(psz_input) ); }
+ VLM_CHANGE( "Unable to change %s input property", VLM_CHANGE_CODE );
+#undef VLM_CHANGE_CODE
+}
+
+void libvlc_vlm_change_media( libvlc_instance_t *p_instance,
+ const char *psz_name, const char *psz_input,
+ const char *psz_output, int i_options,
+ const char * const *ppsz_options, int b_enabled,
+ int b_loop, libvlc_exception_t *p_exception )
+{
+#define VLM_CHANGE_CODE { int n; \
+ p_media->b_enabled = b_enabled; \
+ p_media->broadcast.b_loop = b_loop; \
+ while( p_media->i_input > 0 ) \
+ free( p_media->ppsz_input[--p_media->i_input] ); \
+ if( psz_input ) \
+ TAB_APPEND( p_media->i_input, p_media->ppsz_input, strdup(psz_input) ); \
+ free( p_media->psz_output ); \
+ p_media->psz_output = psz_output ? strdup( psz_output ) : NULL; \
+ while( p_media->i_option > 0 ) \
+ free( p_media->ppsz_option[--p_media->i_option] ); \
+ for( n = 0; n < i_options; n++ ) \
+ TAB_APPEND( p_media->i_option, p_media->ppsz_option, strdup(ppsz_options[n]) ); \
+ }
+ VLM_CHANGE( "Unable to change %s properties", VLM_CHANGE_CODE );
+#undef VLM_CHANGE_CODE
+}
+
+void libvlc_vlm_play_media( libvlc_instance_t *p_instance,
+ const char *psz_name,
+ libvlc_exception_t *p_exception )
+{
+ vlm_t *p_vlm;
+ int64_t id;
+
+ VLM(p_vlm);
+
+ if( vlm_Control( p_vlm, VLM_GET_MEDIA_ID, psz_name, &id ) ||
+ vlm_Control( p_vlm, VLM_START_MEDIA_BROADCAST_INSTANCE, id, NULL, 0 ) )