int playlist_MLDump( playlist_t *p_playlist ) { char *psz_datadir; psz_datadir = config_GetUserDir( VLC_DATA_DIR ); if( !psz_datadir ) /* XXX: This should never happen */ { msg_Err( p_playlist, "no data directory, cannot save media library") ; return VLC_EGENERIC; } char psz_dirname[ strlen( psz_datadir ) + sizeof( DIR_SEP "ml.xspf")]; strcpy( psz_dirname, psz_datadir ); free( psz_datadir ); if( config_CreateDir( (vlc_object_t *)p_playlist, psz_dirname ) ) { return VLC_EGENERIC; } strcat( psz_dirname, DIR_SEP "ml.xspf" ); stats_TimerStart( p_playlist, "ML Dump", STATS_TIMER_ML_DUMP ); playlist_Export( p_playlist, psz_dirname, p_playlist->p_media_library, "export-xspf" ); stats_TimerStop( p_playlist, STATS_TIMER_ML_DUMP ); return VLC_SUCCESS; }
/** * This function preparses an item when needed. */ static void Preparse( playlist_t *p_playlist, input_item_t *p_item ) { vlc_mutex_lock( &p_item->lock ); int i_type = p_item->i_type; vlc_mutex_unlock( &p_item->lock ); if( i_type != ITEM_TYPE_FILE ) { input_item_SetPreparsed( p_item, true ); return; } stats_TimerStart( p_playlist, "Preparse run", STATS_TIMER_PREPARSE ); /* Do not preparse if it is already done (like by playing it) */ if( !input_item_IsPreparsed( p_item ) ) { input_Preparse( VLC_OBJECT(p_playlist), p_item ); input_item_SetPreparsed( p_item, true ); var_SetAddress( p_playlist, "item-change", p_item ); } stats_TimerStop( p_playlist, STATS_TIMER_PREPARSE ); }
static void ResetCurrentlyPlaying( playlist_t *p_playlist, playlist_item_t *p_cur ) { playlist_private_t *p_sys = pl_priv(p_playlist); stats_TimerStart( p_playlist, "Items array build", STATS_TIMER_PLAYLIST_BUILD ); PL_DEBUG( "rebuilding array of current - root %s", PLI_NAME( p_sys->status.p_node ) ); ARRAY_RESET( p_playlist->current ); p_playlist->i_current_index = -1; for( playlist_item_t *p_next = NULL; ; ) { /** FIXME: this is *slow* */ p_next = playlist_GetNextLeaf( p_playlist, p_sys->status.p_node, p_next, true, false ); if( !p_next ) break; if( p_next == p_cur ) p_playlist->i_current_index = p_playlist->current.i_size; ARRAY_APPEND( p_playlist->current, p_next); } PL_DEBUG("rebuild done - %i items, index %i", p_playlist->current.i_size, p_playlist->i_current_index); if( var_GetBool( p_playlist, "random" ) && ( p_playlist->current.i_size > 0 ) ) { /* Shuffle the array */ for( unsigned j = p_playlist->current.i_size - 1; j > 0; j-- ) { unsigned i = vlc_lrand48() % (j+1); /* between 0 and j */ playlist_item_t *p_tmp; /* swap the two items */ p_tmp = ARRAY_VAL(p_playlist->current, i); ARRAY_VAL(p_playlist->current,i) = ARRAY_VAL(p_playlist->current,j); ARRAY_VAL(p_playlist->current,j) = p_tmp; } } p_sys->b_reset_currently_playing = false; stats_TimerStop( p_playlist, STATS_TIMER_PLAYLIST_BUILD ); }
void CtrlTree::makeImage() { stats_TimerStart( getIntf(), "[Skins] Playlist image", STATS_TIMER_SKINS_PLAYTREE_IMAGE ); delete m_pImage; // Get the size of the control const Position *pPos = getPosition(); if( !pPos ) { stats_TimerStop( getIntf(), STATS_TIMER_SKINS_PLAYTREE_IMAGE ); return; } int width = pPos->getWidth(); int height = pPos->getHeight(); int i_itemHeight = itemHeight(); // Create an image OSFactory *pOsFactory = OSFactory::instance( getIntf() ); m_pImage = pOsFactory->createOSGraphics( width, height ); VarTree::Iterator it = m_firstPos; if( m_pBgBitmap ) { // Draw the background bitmap if( !m_pScaledBitmap || m_pScaledBitmap->getWidth() != width || m_pScaledBitmap->getHeight() != height ) { delete m_pScaledBitmap; m_pScaledBitmap = new ScaledBitmap( getIntf(), *m_pBgBitmap, width, height ); } m_pImage->drawBitmap( *m_pScaledBitmap, 0, 0 ); for( int yPos = 0; yPos < height; yPos += i_itemHeight ) { if( it != m_rTree.end() ) { if( it->isSelected() ) { int rectHeight = __MIN( i_itemHeight, height - yPos ); m_pImage->fillRect( 0, yPos, width, rectHeight, m_selColor ); } do { it = m_flat ? m_rTree.getNextLeaf( it ) : m_rTree.getNextVisibleItem( it ); } while( it != m_rTree.end() && it->isDeleted() ); } } } else { // FIXME (TRYME) // Fill background with background color uint32_t bgColor = m_bgColor1; m_pImage->fillRect( 0, 0, width, height, bgColor ); for( int yPos = 0; yPos < height; yPos += i_itemHeight ) { int rectHeight = __MIN( i_itemHeight, height - yPos ); if( it == m_rTree.end() ) m_pImage->fillRect( 0, yPos, width, rectHeight, bgColor ); else { uint32_t color = ( it->isSelected() ? m_selColor : bgColor ); m_pImage->fillRect( 0, yPos, width, rectHeight, color ); do { it = m_flat ? m_rTree.getNextLeaf( it ) : m_rTree.getNextVisibleItem( it ); } while( it != m_rTree.end() && it->isDeleted() ); } bgColor = ( bgColor == m_bgColor1 ? m_bgColor2 : m_bgColor1 ); } } int bitmapWidth = itemImageWidth(); int yPos = 0; it = m_firstPos; while( it != m_rTree.end() && yPos < height ) { const GenericBitmap *m_pCurBitmap; UString *pStr = it->getString(); uint32_t color = ( it->isPlaying() ? m_playColor : m_fgColor ); // Draw the text if( pStr != NULL ) { int depth = m_flat ? 1 : it->depth(); GenericBitmap *pText = m_rFont.drawString( *pStr, color, width - bitmapWidth * depth ); if( !pText ) { stats_TimerStop( getIntf(), STATS_TIMER_SKINS_PLAYTREE_IMAGE ); return; } if( it->size() ) m_pCurBitmap = it->isExpanded() ? m_pOpenBitmap : m_pClosedBitmap; else m_pCurBitmap = m_pItemBitmap; if( m_pCurBitmap ) { // Make sure we are centered on the line int yPos2 = yPos+(i_itemHeight-m_pCurBitmap->getHeight()+1)/2; if( yPos2 >= height ) { delete pText; break; } m_pImage->drawBitmap( *m_pCurBitmap, 0, 0, bitmapWidth * (depth - 1 ), yPos2, m_pCurBitmap->getWidth(), __MIN( m_pCurBitmap->getHeight(), height - yPos2), true ); } yPos += i_itemHeight - pText->getHeight(); int ySrc = 0; if( yPos < 0 ) { ySrc = - yPos; yPos = 0; } int lineHeight = __MIN( pText->getHeight() - ySrc, height - yPos ); m_pImage->drawBitmap( *pText, 0, ySrc, bitmapWidth * depth, yPos, pText->getWidth(), lineHeight, true ); yPos += (pText->getHeight() - ySrc ); delete pText; } do { it = m_flat ? m_rTree.getNextLeaf( it ) : m_rTree.getNextVisibleItem( it ); } while( it != m_rTree.end() && it->isDeleted() ); } stats_TimerStop( getIntf(), STATS_TIMER_SKINS_PLAYTREE_IMAGE ); }
static inline void audio_timer_stop( encoder_t * p_encoder ) { stats_TimerStop( p_encoder, STATS_TIMER_AUDIO_FRAME_ENCODING ); }
static inline void video_timer_stop( encoder_t * p_encoder ) { stats_TimerStop( p_encoder, STATS_TIMER_VIDEO_FRAME_ENCODING ); }
int playlist_MLLoad( playlist_t *p_playlist ) { input_item_t *p_input; char *psz_datadir = config_GetUserDir( VLC_DATA_DIR ); if( !psz_datadir ) /* XXX: This should never happen */ { msg_Err( p_playlist, "no data directory, cannot load media library") ; return VLC_EGENERIC; } char *psz_file; if( asprintf( &psz_file, "%s" DIR_SEP "ml.xspf", psz_datadir ) == -1 ) psz_file = NULL; free( psz_datadir ); if( psz_file == NULL ) return VLC_ENOMEM; /* loosy check for media library file */ struct stat st; if( vlc_stat( psz_file, &st ) ) { free( psz_file ); return VLC_EGENERIC; } char *psz_uri = make_URI( psz_file, "file/xspf-open" ); free( psz_file ); if( psz_uri == NULL ) return VLC_ENOMEM; const char *const options[1] = { "meta-file", }; /* that option has to be cleaned in input_item_subitem_tree_added() */ /* vlc_gc_decref() in the same function */ p_input = input_item_NewExt( psz_uri, _("Media Library"), 1, options, VLC_INPUT_OPTION_TRUSTED, -1 ); free( psz_uri ); if( p_input == NULL ) return VLC_EGENERIC; PL_LOCK; if( p_playlist->p_media_library->p_input ) vlc_gc_decref( p_playlist->p_media_library->p_input ); p_playlist->p_media_library->p_input = p_input; vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded, input_item_subitem_tree_added, p_playlist ); pl_priv(p_playlist)->b_doing_ml = true; PL_UNLOCK; stats_TimerStart( p_playlist, "ML Load", STATS_TIMER_ML_LOAD ); input_Read( p_playlist, p_input ); stats_TimerStop( p_playlist,STATS_TIMER_ML_LOAD ); PL_LOCK; pl_priv(p_playlist)->b_doing_ml = false; PL_UNLOCK; vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemTreeAdded, input_item_subitem_tree_added, p_playlist ); return VLC_SUCCESS; }
int playlist_MLLoad( playlist_t *p_playlist ) { char *psz_datadir; char *psz_uri = NULL; input_item_t *p_input; if( !config_GetInt( p_playlist, "media-library") ) return VLC_SUCCESS; psz_datadir = config_GetUserDir( VLC_DATA_DIR ); if( !psz_datadir ) /* XXX: This should never happen */ { msg_Err( p_playlist, "no data directory, cannot load media library") ; return VLC_EGENERIC; } if( asprintf( &psz_uri, "%s" DIR_SEP "ml.xspf", psz_datadir ) != -1 ) { /* loosy check for media library file */ struct stat st; int ret = utf8_stat( psz_uri , &st ); free( psz_uri ); if( ret ) { free( psz_datadir ); return VLC_EGENERIC; } } psz_uri = make_URI( psz_datadir ); free( psz_datadir ); psz_datadir = psz_uri; if( psz_datadir == NULL ) return VLC_EGENERIC; /* Force XSPF demux (psz_datadir was a path, now it is a file URI) */ if( asprintf( &psz_uri, "file/xspf-open%s/ml.xspf", psz_datadir+4 ) == -1 ) psz_uri = NULL; free( psz_datadir ); psz_datadir = NULL; if( psz_uri == NULL ) return VLC_ENOMEM; const char *const options[1] = { "meta-file", }; /* that option has to be cleaned in input_item_subitem_added() */ /* vlc_gc_decref() in the same function */ p_input = input_item_NewExt( p_playlist, psz_uri, _("Media Library"), 1, options, VLC_INPUT_OPTION_TRUSTED, -1 ); free( psz_uri ); if( p_input == NULL ) return VLC_EGENERIC; PL_LOCK; if( p_playlist->p_ml_onelevel->p_input ) vlc_gc_decref( p_playlist->p_ml_onelevel->p_input ); if( p_playlist->p_ml_category->p_input ) vlc_gc_decref( p_playlist->p_ml_category->p_input ); p_playlist->p_ml_onelevel->p_input = p_playlist->p_ml_category->p_input = p_input; /* We save the input at two different place, incref */ vlc_gc_incref( p_input ); vlc_gc_incref( p_input ); vlc_event_attach( &p_input->event_manager, vlc_InputItemSubItemAdded, input_item_subitem_added, p_playlist ); pl_priv(p_playlist)->b_doing_ml = true; PL_UNLOCK; stats_TimerStart( p_playlist, "ML Load", STATS_TIMER_ML_LOAD ); input_Read( p_playlist, p_input ); stats_TimerStop( p_playlist,STATS_TIMER_ML_LOAD ); PL_LOCK; pl_priv(p_playlist)->b_doing_ml = false; PL_UNLOCK; vlc_event_detach( &p_input->event_manager, vlc_InputItemSubItemAdded, input_item_subitem_added, p_playlist ); vlc_gc_decref( p_input ); return VLC_SUCCESS; }