-void msg_Create (libvlc_int_t *p_libvlc)
-{
- libvlc_priv_t *priv = libvlc_priv (p_libvlc);
- msg_bank_t *bank = libvlc_bank (p_libvlc);
-
- vlc_mutex_init (&bank->lock);
- vlc_cond_init (&bank->wait);
- vlc_dictionary_init( &priv->msg_enabled_objects, 0 );
- priv->msg_all_objects_enabled = true;
-
- QUEUE.i_sub = 0;
- QUEUE.pp_sub = NULL;
-
-#ifdef UNDER_CE
- QUEUE.logfile =
- CreateFile( L"vlc-log.txt", GENERIC_WRITE,
- FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
- CREATE_ALWAYS, 0, NULL );
- SetFilePointer( QUEUE.logfile, 0, NULL, FILE_END );
-#endif
-
- vlc_mutex_lock( &msg_stack_lock );
- if( banks++ == 0 )
- vlc_threadvar_create( &msg_context, NULL );
- vlc_mutex_unlock( &msg_stack_lock );
-}
-
-/**
- * Object Printing selection
- */
-static void const * kObjectPrintingEnabled = &kObjectPrintingEnabled;
-static void const * kObjectPrintingDisabled = &kObjectPrintingDisabled;
-
-void __msg_EnableObjectPrinting (vlc_object_t *p_this, char * psz_object)
-{
- libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
- vlc_mutex_lock( &QUEUE.lock );
- if( !strcmp(psz_object, "all") )
- priv->msg_all_objects_enabled = true;
- else
- vlc_dictionary_insert( &priv->msg_enabled_objects, psz_object, (void *)kObjectPrintingEnabled );
- vlc_mutex_unlock( &QUEUE.lock );
-}
-
-void __msg_DisableObjectPrinting (vlc_object_t *p_this, char * psz_object)
-{
- libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);
- vlc_mutex_lock( &QUEUE.lock );
- if( !strcmp(psz_object, "all") )
- priv->msg_all_objects_enabled = false;
- else
- vlc_dictionary_insert( &priv->msg_enabled_objects, psz_object, (void *)kObjectPrintingDisabled );
- vlc_mutex_unlock( &QUEUE.lock );
-}
-
-/**
- * Destroy the message queues
- *
- * This functions prints all messages remaining in the queues,
- * then frees all the allocated ressources
- * No other messages interface functions should be called after this one.
- */
-void msg_Destroy (libvlc_int_t *p_libvlc)
-{
- libvlc_priv_t *priv = libvlc_priv (p_libvlc);
- msg_bank_t *bank = libvlc_bank (p_libvlc);
-
- if( QUEUE.i_sub )
- msg_Err( p_libvlc, "stale interface subscribers (VLC might crash)" );
-
- vlc_mutex_lock( &msg_stack_lock );
- if( --banks == 0 )
- vlc_threadvar_delete( &msg_context );
- vlc_mutex_unlock( &msg_stack_lock );
-
-#ifdef UNDER_CE
- CloseHandle( QUEUE.logfile );
-#endif
-
- vlc_dictionary_clear( &priv->msg_enabled_objects, NULL, NULL );
-
- vlc_cond_destroy (&bank->wait);
- vlc_mutex_destroy (&bank->lock);
-}
-
-struct msg_subscription_t
-{
- vlc_thread_t thread;
- libvlc_int_t *instance;
- msg_callback_t func;
- msg_cb_data_t *opaque;
- msg_item_t *items[VLC_MSG_QSIZE];
- unsigned begin, end;
- unsigned overruns;
-};
-
-static void *msg_thread (void *data)
-{
- msg_subscription_t *sub = data;
- msg_bank_t *bank = libvlc_bank (sub->instance);
-
- vlc_mutex_lock (&bank->lock);
- for (;;)
- {
- /* Wait for messages */
- assert (sub->begin < VLC_MSG_QSIZE);
- assert (sub->end < VLC_MSG_QSIZE);
- while (sub->begin != sub->end)
- {
- msg_item_t *msg = sub->items[sub->begin];
- unsigned overruns = sub->overruns;
-
- if (++sub->begin == VLC_MSG_QSIZE)
- sub->begin = 0;
- sub->overruns = 0;
- vlc_mutex_unlock (&bank->lock);
-
- sub->func (sub->opaque, msg, overruns);
- msg_Release (msg);
-
- vlc_mutex_lock (&bank->lock);
- }
-
- mutex_cleanup_push (&bank->lock);
- vlc_cond_wait (&bank->wait, &bank->lock);
- vlc_cleanup_pop ();
- }
- assert (0);
-}