X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=projects%2Fmozilla%2Fvlcplugin.cpp;h=41ecab27039f6d82a73602c51797c485a941cac1;hb=46cdf014fe622a27d986acd859a70e91ec606cb1;hp=0ea739c0d86505651c04e1217fb955649546e1c4;hpb=6ead52bb55872971c9ce12a5b0bbcf5b71134861;p=vlc diff --git a/projects/mozilla/vlcplugin.cpp b/projects/mozilla/vlcplugin.cpp index 0ea739c0d8..41ecab2703 100644 --- a/projects/mozilla/vlcplugin.cpp +++ b/projects/mozilla/vlcplugin.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * vlcplugin.cpp: a VLC plugin for Mozilla ***************************************************************************** - * Copyright (C) 2002-2009 the VideoLAN team + * Copyright (C) 2002-2010 the VideoLAN team * $Id$ * * Authors: Samuel Hocevar @@ -36,9 +36,72 @@ #include "control/npolibvlc.h" #include -#include +#if defined(XP_UNIX) +# include +#elif defined(XP_WIN) + /* windows headers */ +# include +#else +#warning "locking not implemented for this platform" +#endif + #include +/***************************************************************************** + * utilitiy functions + *****************************************************************************/ +static void plugin_lock_init(plugin_lock_t *lock) +{ + assert(lock); + +#if defined(XP_UNIX) + pthread_mutex_init(&lock->mutex, NULL); +#elif defined(XP_WIN) + InitializeCriticalSection(&lock->cs); +#else +#warning "locking not implemented in this platform" +#endif +} + +static void plugin_lock_destroy(plugin_lock_t *lock) +{ + assert(lock); + +#if defined(XP_UNIX) + pthread_mutex_destroy(&lock->mutex); +#elif defined(XP_WIN) + DeleteCriticalSection(&lock->cs); +#else +#warning "locking not implemented in this platform" +#endif +} + +static void plugin_lock(plugin_lock_t *lock) +{ + assert(lock); + +#if defined(XP_UNIX) + pthread_mutex_lock(&lock->mutex); +#elif defined(XP_WIN) + EnterCriticalSection(&lock->cs); +#else +#warning "locking not implemented in this platform" +#endif +} + +static void plugin_unlock(plugin_lock_t *lock) +{ + assert(lock); + +#if defined(XP_UNIX) + pthread_mutex_unlock(&lock->mutex); +#elif defined(XP_WIN) + LeaveCriticalSection(&lock->cs); +#else +#warning "locking not implemented in this platform" +#endif +} + /***************************************************************************** * VlcPlugin constructor and destructor *****************************************************************************/ @@ -88,13 +151,23 @@ static bool boolValue(const char *value) { !strcasecmp(value, "yes") ); } +bool EventObj::init() +{ + plugin_lock_init(&lock); + return true; +} + +EventObj::~EventObj() +{ + plugin_lock_destroy(&lock); +} void EventObj::deliver(NPP browser) { NPVariant result; NPVariant params[1]; - pthread_mutex_lock(&mutex); + plugin_lock(&lock); for( ev_l::iterator i=_elist.begin();i!=_elist.end();++i ) { @@ -115,7 +188,7 @@ void EventObj::deliver(NPP browser) } _elist.clear(); - pthread_mutex_unlock(&mutex); + plugin_unlock(&lock); } void VlcPlugin::eventAsync(void *param) @@ -126,23 +199,23 @@ void VlcPlugin::eventAsync(void *param) void EventObj::callback(const libvlc_event_t* event) { - pthread_mutex_lock(&mutex); + plugin_lock(&lock); if( have_event(event->type) ) _elist.push_back(event->type); - pthread_mutex_unlock(&mutex); + plugin_unlock(&lock); } void VlcPlugin::event_callback(const libvlc_event_t* event, void *param) { VlcPlugin *plugin = (VlcPlugin*)param; -#ifdef XP_UNIX +#if defined(XP_UNIX) plugin->events.callback(event); NPN_PluginThreadAsyncCall(plugin->getBrowser(), eventAsync, plugin); #else #warning NPN_PluginThreadAsyncCall not implemented yet. - printf("%s","No NPN_PluginThreadAsyncCall(), doing nothing."); + printf("No NPN_PluginThreadAsyncCall(), doing nothing."); #endif } @@ -176,6 +249,7 @@ bool EventObj::insert(const NPString &s, NPObject *l, bool b) return false; i->get(e); } + return true; } @@ -203,6 +277,8 @@ bool EventObj::remove(const NPString &s, NPObject *l, bool b) } if(!any) unask_for_event(e); + + return true; } @@ -353,6 +429,8 @@ NPError VlcPlugin::init(int argc, char* const argn[], char* const argv[]) } libvlc_instance = libvlc_new(ppsz_argc, ppsz_argv); + if( !libvlc_instance ) + return NPERR_GENERIC_ERROR; libvlc_media_list = libvlc_media_list_new(libvlc_instance); /* @@ -417,6 +495,8 @@ VlcPlugin::~VlcPlugin() if( libvlc_media_player ) { + if( playlist_isplaying() ) + playlist_stop(); events.unhook_manager(); libvlc_media_player_release( libvlc_media_player ); } @@ -433,7 +513,7 @@ void VlcPlugin::set_player_window() { #ifdef XP_UNIX libvlc_media_player_set_xwindow(libvlc_media_player, - (libvlc_drawable_t)getVideoWindow()); + (uint32_t)getVideoWindow()); #endif #ifdef XP_MACOSX // XXX FIXME insert appropriate call here @@ -444,16 +524,15 @@ void VlcPlugin::set_player_window() #endif } -int VlcPlugin::playlist_add( const char *mrl, libvlc_exception_t *ex ) +int VlcPlugin::playlist_add( const char *mrl ) { int item = -1; - libvlc_media_t *p_m = libvlc_media_new(libvlc_instance,mrl,ex); - if( libvlc_exception_raised(ex) ) + libvlc_media_t *p_m = libvlc_media_new_location(libvlc_instance,mrl); + if( !p_m ) return -1; - + assert( libvlc_media_list ); libvlc_media_list_lock(libvlc_media_list); - libvlc_media_list_add_media(libvlc_media_list,p_m,ex); - if( !libvlc_exception_raised(ex) ) + if( !libvlc_media_list_add_media(libvlc_media_list,p_m) ) item = libvlc_media_list_count(libvlc_media_list)-1; libvlc_media_list_unlock(libvlc_media_list); @@ -463,19 +542,22 @@ int VlcPlugin::playlist_add( const char *mrl, libvlc_exception_t *ex ) } int VlcPlugin::playlist_add_extended_untrusted( const char *mrl, const char *name, - int optc, const char **optv, libvlc_exception_t *ex ) + int optc, const char **optv ) { - libvlc_media_t *p_m = libvlc_media_new(libvlc_instance, mrl,ex); + libvlc_media_t *p_m; int item = -1; - if( libvlc_exception_raised(ex) ) + + assert( libvlc_media_list ); + + p_m = libvlc_media_new_location(libvlc_instance, mrl); + if( !p_m ) return -1; for( int i = 0; i < optc; ++i ) libvlc_media_add_option_flag(p_m, optv[i], libvlc_media_option_unique); libvlc_media_list_lock(libvlc_media_list); - libvlc_media_list_add_media(libvlc_media_list,p_m,ex); - if( !libvlc_exception_raised(ex) ) + if( !libvlc_media_list_add_media(libvlc_media_list,p_m) ) item = libvlc_media_list_count(libvlc_media_list)-1; libvlc_media_list_unlock(libvlc_media_list); libvlc_media_release(p_m); @@ -483,27 +565,30 @@ int VlcPlugin::playlist_add_extended_untrusted( const char *mrl, const char *nam return item; } -bool VlcPlugin::playlist_select( int idx, libvlc_exception_t *ex ) +bool VlcPlugin::playlist_select( int idx ) { libvlc_media_t *p_m = NULL; + assert( libvlc_media_list ); + libvlc_media_list_lock(libvlc_media_list); int count = libvlc_media_list_count(libvlc_media_list); - if( idx<0||idx>=count ) goto bad_unlock; playlist_index = idx; - p_m = libvlc_media_list_item_at_index(libvlc_media_list,playlist_index,ex); + p_m = libvlc_media_list_item_at_index(libvlc_media_list,playlist_index); libvlc_media_list_unlock(libvlc_media_list); - if( libvlc_exception_raised(ex) ) + if( !p_m ) return false; if( libvlc_media_player ) { + if( playlist_isplaying() ) + playlist_stop(); events.unhook_manager(); libvlc_media_player_release( libvlc_media_player ); libvlc_media_player = NULL; @@ -526,14 +611,17 @@ bad_unlock: return false; } -void VlcPlugin::playlist_delete_item( int idx, libvlc_exception_t *ex ) +int VlcPlugin::playlist_delete_item( int idx ) { + if( !libvlc_media_list ) + return -1; libvlc_media_list_lock(libvlc_media_list); - libvlc_media_list_remove_index(libvlc_media_list,idx,ex); + int ret = libvlc_media_list_remove_index(libvlc_media_list,idx); libvlc_media_list_unlock(libvlc_media_list); + return ret; } -void VlcPlugin::playlist_clear( libvlc_exception_t *ex ) +void VlcPlugin::playlist_clear() { if( libvlc_media_list ) libvlc_media_list_release(libvlc_media_list); @@ -543,31 +631,35 @@ void VlcPlugin::playlist_clear( libvlc_exception_t *ex ) int VlcPlugin::playlist_count() { int items_count = 0; + if( !libvlc_media_list ) + return items_count; libvlc_media_list_lock(libvlc_media_list); items_count = libvlc_media_list_count(libvlc_media_list); libvlc_media_list_unlock(libvlc_media_list); return items_count; } -void VlcPlugin::toggle_fullscreen( libvlc_exception_t *ex ) +void VlcPlugin::toggle_fullscreen() { if( playlist_isplaying() ) - libvlc_toggle_fullscreen(libvlc_media_player,ex); + libvlc_toggle_fullscreen(libvlc_media_player); } -void VlcPlugin::set_fullscreen( int yes, libvlc_exception_t *ex ) + +void VlcPlugin::set_fullscreen( int yes ) { if( playlist_isplaying() ) - libvlc_set_fullscreen(libvlc_media_player,yes,ex); + libvlc_set_fullscreen(libvlc_media_player,yes); } -int VlcPlugin::get_fullscreen( libvlc_exception_t *ex ) + +int VlcPlugin::get_fullscreen() { int r = 0; if( playlist_isplaying() ) - r = libvlc_get_fullscreen(libvlc_media_player,ex); + r = libvlc_get_fullscreen(libvlc_media_player); return r; } -bool VlcPlugin::player_has_vout( libvlc_exception_t *ex ) +bool VlcPlugin::player_has_vout() { bool r = false; if( playlist_isplaying() ) @@ -882,7 +974,7 @@ void VlcPlugin::redrawToolbar() unsigned int i_tb_width, i_tb_height; /* This method does nothing if toolbar is hidden. */ - if( !b_toolbar ) + if( !b_toolbar || !libvlc_media_player ) return; const NPWindow& window = getWindow(); @@ -891,7 +983,6 @@ void VlcPlugin::redrawToolbar() getToolbarSize( &i_tb_width, &i_tb_height ); - /* get mute info */ b_mute = libvlc_audio_get_mute( libvlc_media_player ); @@ -997,7 +1088,8 @@ vlc_toolbar_clicked_t VlcPlugin::getToolbarButtonClicked( int i_xpos, int i_ypos is_playing = playlist_isplaying(); /* get mute info */ - b_mute = libvlc_audio_get_mute( libvlc_media_player ); + if( libvlc_media_player ) + b_mute = libvlc_audio_get_mute( libvlc_media_player ); /* is Pause of Play button clicked */ if( (is_playing != 1) && @@ -1068,4 +1160,3 @@ bool VlcPlugin::canUseEventListener() return true; return false; } -