Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-gpu
Commits
6bff1cc9
Commit
6bff1cc9
authored
Jun 21, 2010
by
Srikanth Raju
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ML: Media Library Core
Core functions and singleton media library object
parent
49fd520a
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
590 additions
and
1 deletion
+590
-1
src/Makefile.am
src/Makefile.am
+2
-0
src/libvlc-module.c
src/libvlc-module.c
+8
-0
src/libvlc.c
src/libvlc.c
+36
-0
src/libvlc.h
src/libvlc.h
+4
-1
src/libvlccore.sym
src/libvlccore.sym
+14
-0
src/misc/media_library.c
src/misc/media_library.c
+469
-0
src/missing.c
src/missing.c
+57
-0
No files found.
src/Makefile.am
View file @
6bff1cc9
...
...
@@ -77,6 +77,7 @@ pluginsinclude_HEADERS = \
../include/vlc_md5.h
\
../include/vlc_messages.h
\
../include/vlc_meta.h
\
../include/vlc_media_library.h
\
../include/vlc_modules.h
\
../include/vlc_mouse.h
\
../include/vlc_mtime.h
\
...
...
@@ -452,6 +453,7 @@ SOURCES_libvlc_common = \
misc/update.c
\
misc/update_crypto.c
\
misc/xml.c
\
misc/media_library.c
\
extras/libc.c
\
extras/tdestroy.c
\
misc/filter.c
\
...
...
src/libvlc-module.c
View file @
6bff1cc9
...
...
@@ -1259,6 +1259,10 @@ static const char *const ppsz_albumart_descriptions[] =
"The media library is automatically saved and reloaded each time you " \
"start VLC." )
#define LOAD_ML_TEXT N_( "Load Media Library" )
#define LOAD_ML_LONGTEXT N_( \
"Enable this option to load the SQL-based Media Library at VLC startup" )
#define PLTREE_TEXT N_("Display playlist tree")
#define PLTREE_LONGTEXT N_( \
"The playlist can use a tree to categorize some items, like the " \
...
...
@@ -2123,6 +2127,10 @@ vlc_module_begin ()
add_bool
(
"play-and-pause"
,
0
,
NULL
,
PAP_TEXT
,
PAP_LONGTEXT
,
true
)
change_safe
()
add_bool
(
"media-library"
,
1
,
NULL
,
ML_TEXT
,
ML_LONGTEXT
,
false
)
#if defined( MEDIA_LIBRARY )
add_bool
(
"load-media-library-on-startup"
,
1
,
NULL
,
LOAD_ML_TEXT
,
LOAD_ML_LONGTEXT
,
false
)
#endif
add_bool
(
"playlist-tree"
,
0
,
NULL
,
PLTREE_TEXT
,
PLTREE_LONGTEXT
,
false
)
add_string
(
"open"
,
""
,
NULL
,
OPEN_TEXT
,
OPEN_LONGTEXT
,
false
)
...
...
src/libvlc.c
View file @
6bff1cc9
...
...
@@ -68,6 +68,8 @@
# include <dbus/dbus.h>
#endif
#include <vlc_media_library.h>
#include <vlc_playlist.h>
#include <vlc_interface.h>
...
...
@@ -251,6 +253,7 @@ libvlc_int_t * libvlc_InternalCreate( void )
priv
=
libvlc_priv
(
p_libvlc
);
priv
->
p_playlist
=
NULL
;
priv
->
p_ml
=
NULL
;
priv
->
p_dialog_provider
=
NULL
;
priv
->
p_vlm
=
NULL
;
...
...
@@ -819,6 +822,23 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
/* System specific configuration */
system_Configure
(
p_libvlc
,
i_argc
-
vlc_optind
,
ppsz_argv
+
vlc_optind
);
#if defined(MEDIA_LIBRARY)
/* Get the ML */
if
(
var_GetBool
(
p_libvlc
,
"load-media-library-on-startup"
)
==
true
)
{
priv
->
p_ml
=
__ml_Create
(
VLC_OBJECT
(
p_libvlc
),
NULL
);
if
(
!
priv
->
p_ml
)
{
msg_Err
(
p_libvlc
,
"ML initialization failed"
);
return
VLC_EGENERIC
;
}
}
else
{
priv
->
p_ml
=
NULL
;
}
#endif
/* Add service discovery modules */
psz_modules
=
var_InheritString
(
p_libvlc
,
"services-discovery"
);
if
(
psz_modules
)
...
...
@@ -1014,6 +1034,22 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc )
/* Free playlist now, all threads are gone */
playlist_Destroy
(
p_playlist
);
/* Free playlist now */
#if defined(MEDIA_LIBRARY)
media_library_t
*
p_ml
=
priv
->
p_ml
;
if
(
p_ml
)
{
__ml_Destroy
(
VLC_OBJECT
(
p_ml
)
);
vlc_object_release
(
p_ml
);
libvlc_priv
(
p_playlist
->
p_libvlc
)
->
p_ml
=
NULL
;
}
#endif
/* Free playlist */
/* Any thread still running must not assume pl_Hold() succeeds. */
msg_Dbg
(
p_libvlc
,
"removing playlist"
);
vlc_object_release
(
p_playlist
);
stats_TimersDumpAll
(
p_libvlc
);
stats_TimersCleanAll
(
p_libvlc
);
...
...
src/libvlc.h
View file @
6bff1cc9
...
...
@@ -25,6 +25,8 @@
#ifndef LIBVLC_LIBVLC_H
# define LIBVLC_LIBVLC_H 1
#include<vlc_media_library.h>
typedef
struct
variable_t
variable_t
;
/* Actions (hot keys) */
...
...
@@ -211,7 +213,8 @@ typedef struct libvlc_priv_t
/* Singleton objects */
module_t
*
p_memcpy_module
;
///< Fast memcpy plugin used
playlist_t
*
p_playlist
;
//< the playlist singleton
playlist_t
*
p_playlist
;
///< the playlist singleton
media_library_t
*
p_ml
;
///< the ML singleton
vlm_t
*
p_vlm
;
///< the VLM singleton (or NULL)
vlc_object_t
*
p_dialog_provider
;
///< dialog provider
httpd_t
*
p_httpd
;
///< HTTP daemon (src/network/httpd.c)
...
...
src/libvlccore.sym
View file @
6bff1cc9
...
...
@@ -241,6 +241,20 @@ LocaleFree
make_URI
make_path
mdate
__ml_Create
__ml_Destroy
__ml_Hold
__ml_Release
media_Destroy
media_New
ml_OpConnectChilds
__ml_FtreeSpec
__ml_UpdateSimple
ml_GetPersonsFromMedia
ml_DeletePersonTypeFromMedia
ml_PlaySmartPlaylistBasedOn
ml_gc_decref
ml_gc_incref
module_config_free
module_config_get
module_exists
...
...
src/misc/media_library.c
0 → 100644
View file @
6bff1cc9
/*****************************************************************************
* media_library.c: SQL-based media library: ML creators and destructors
*****************************************************************************
* Copyright (C) 2009-2010 the VideoLAN team and AUTHORS
* $Id$
*
* Authors: Srikanth Raju <srikiraju at gmail dot com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#if !defined( __LIBVLC__ )
#error You are not libvlc or one of its plugins. You cannot include this file
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#if defined(MEDIA_LIBRARY)
#include <assert.h>
#include <vlc_media_library.h>
#include "../libvlc.h"
/**
* @brief Destroy the medialibrary object
* @param Parent object that holds the media library object
*/
void
__ml_Destroy
(
vlc_object_t
*
p_this
)
{
media_library_t
*
p_ml
=
(
media_library_t
*
)
p_this
;
module_unneed
(
p_ml
,
p_ml
->
p_module
);
}
/**
* Atomically set the reference count to 1.
* @param p_gc reference counted object
* @param pf_destruct destruction calback
* @return p_gc.
*/
static
void
*
ml_gc_init
(
ml_gc_object_t
*
p_gc
,
void
(
*
pf_destruct
)
(
ml_gc_object_t
*
))
{
/* There is no point in using the GC if there is no destructor... */
assert
(
pf_destruct
);
p_gc
->
pf_destructor
=
pf_destruct
;
p_gc
->
pool
=
false
;
p_gc
->
refs
=
1
;
/* Nobody else can possibly lock the spin - it's there as a barrier */
vlc_spin_init
(
&
p_gc
->
spin
);
vlc_spin_lock
(
&
p_gc
->
spin
);
vlc_spin_unlock
(
&
p_gc
->
spin
);
return
p_gc
;
}
/**
* @brief Create an instance of the media library
* @param p_this Parent object
* @param psz_name Name which is passed to module_need (not needed)
* @return p_ml created and attached, module loaded. NULL if
* not able to load
*/
media_library_t
*
__ml_Create
(
vlc_object_t
*
p_this
,
char
*
psz_name
)
{
media_library_t
*
p_ml
=
NULL
;
p_ml
=
(
media_library_t
*
)
vlc_custom_create
(
p_this
,
sizeof
(
media_library_t
),
VLC_OBJECT_GENERIC
,
"media-library"
);
if
(
!
p_ml
)
{
msg_Err
(
p_this
,
"unable to create media library object"
);
return
NULL
;
}
vlc_object_attach
(
p_ml
,
p_this
);
p_ml
->
p_module
=
module_need
(
p_ml
,
"media-library"
,
psz_name
,
false
);
if
(
!
p_ml
->
p_module
)
{
vlc_object_release
(
p_ml
);
msg_Err
(
p_this
,
"Media Library provider not found"
);
return
NULL
;
}
return
p_ml
;
}
/**
* @brief Acquire a reference to the media library singleton
* @param p_this Object that holds the reference
* @return media_library_t The ml object. NULL if not compiled with
* media library or if unable to load
*/
media_library_t
*
__ml_Hold
(
vlc_object_t
*
p_this
)
{
media_library_t
*
p_ml
=
NULL
;
p_ml
=
libvlc_priv
(
p_this
->
p_libvlc
)
->
p_ml
;
assert
(
VLC_OBJECT
(
p_ml
)
!=
p_this
);
if
(
p_ml
==
NULL
&&
var_GetBool
(
p_this
->
p_libvlc
,
"load-media-library-on-startup"
)
==
false
)
{
libvlc_priv
(
p_this
->
p_libvlc
)
->
p_ml
=
__ml_Create
(
VLC_OBJECT
(
p_this
->
p_libvlc
),
NULL
);
p_ml
=
libvlc_priv
(
p_this
->
p_libvlc
)
->
p_ml
;
}
if
(
p_ml
)
vlc_object_hold
(
p_ml
);
return
p_ml
;
}
/**
* @brief Release a reference to the media library singleton
* @param p_this Object that holds the reference
*/
void
__ml_Release
(
vlc_object_t
*
p_this
)
{
media_library_t
*
p_ml
;
p_ml
=
libvlc_priv
(
p_this
->
p_libvlc
)
->
p_ml
;
if
(
p_ml
==
NULL
)
{
msg_Warn
(
p_this
->
p_libvlc
,
"Spurious release ML called"
);
return
;
}
assert
(
VLC_OBJECT
(
p_ml
)
!=
p_this
);
vlc_object_release
(
p_ml
);
}
/**
* @brief Destructor for ml_media_t
*/
static
void
media_Destroy
(
ml_gc_object_t
*
p_gc
)
{
ml_media_t
*
p_media
=
ml_priv
(
p_gc
,
ml_media_t
);
vlc_mutex_destroy
(
&
p_media
->
lock
);
ml_FreeMediaContent
(
p_media
);
free
(
p_media
);
}
/**
* @brief Object constructor for ml_media_t
* @param p_ml The media library object
* @param id If 0, this item isn't in database. If non zero, it is and
* it will be a singleton
* @param select Type of object
* @param reload Whether to reload from database
*/
ml_media_t
*
media_New
(
media_library_t
*
p_ml
,
int
id
,
ml_select_e
select
,
bool
reload
)
{
if
(
id
==
0
)
{
ml_media_t
*
p_media
=
NULL
;
p_media
=
(
ml_media_t
*
)
calloc
(
1
,
sizeof
(
ml_media_t
)
);
ml_gc_init
(
&
p_media
->
ml_gc_data
,
media_Destroy
);
vlc_mutex_init
(
&
p_media
->
lock
);
return
p_media
;
}
else
return
p_ml
->
functions
.
pf_GetMedia
(
p_ml
,
id
,
select
,
reload
);
}
/**
* @brief Update a given table
* @param p_media_library The media library object
* @param selected_type The table to update
* @param psz_lvalue The role of the person if selected_type = ML_PEOPLE
* @param id The id of the row to update
* @param ... The update data. [SelectType [RoleType] Value] ... ML_END
*/
int
__ml_UpdateSimple
(
media_library_t
*
p_media_library
,
ml_select_e
selected_type
,
const
char
*
psz_lvalue
,
int
id
,
...
)
{
ml_element_t
*
update
=
NULL
;
vlc_array_t
*
array
=
vlc_array_new
();
int
i_ret
=
VLC_SUCCESS
;
va_list
args
;
va_start
(
args
,
id
);
ml_select_e
sel
;
do
{
update
=
(
ml_element_t
*
)
calloc
(
1
,
sizeof
(
ml_element_t
)
);
sel
=
(
ml_select_e
)
va_arg
(
args
,
int
);
update
->
criteria
=
sel
;
if
(
sel
==
ML_PEOPLE
)
{
update
->
lvalue
.
str
=
va_arg
(
args
,
char
*
);
update
->
value
.
str
=
va_arg
(
args
,
char
*
);
vlc_array_append
(
array
,
update
);
}
else
if
(
sel
==
ML_PEOPLE_ID
)
{
update
->
lvalue
.
str
=
va_arg
(
args
,
char
*
);
update
->
value
.
i
=
va_arg
(
args
,
int
);
vlc_array_append
(
array
,
update
);
}
else
if
(
sel
==
ML_PEOPLE_ROLE
)
{
#ifndef NDEBUG
msg_Dbg
(
p_media_library
,
"this argument is invalid for Update: %d"
,
(
int
)
sel
);
#endif
}
else
{
switch
(
ml_AttributeIsString
(
sel
)
)
{
case
-
1
:
if
(
sel
!=
ML_END
)
{
#ifndef NDEBUG
msg_Dbg
(
p_media_library
,
"this argument is invalid for Update: %d"
,
(
int
)
sel
);
#endif
i_ret
=
VLC_EGENERIC
;
}
else
if
(
sel
==
ML_END
)
vlc_array_append
(
array
,
update
);
break
;
case
0
:
update
->
value
.
str
=
va_arg
(
args
,
char
*
);
vlc_array_append
(
array
,
update
);
break
;
case
1
:
update
->
value
.
i
=
va_arg
(
args
,
int
);
vlc_array_append
(
array
,
update
);
break
;
}
}
}
while
(
sel
!=
ML_END
);
va_end
(
args
);
ml_ftree_t
*
p_where
=
NULL
;
ml_ftree_t
*
find
=
(
ml_ftree_t
*
)
calloc
(
1
,
sizeof
(
ml_ftree_t
)
);
find
->
criteria
=
ML_ID
;
find
->
value
.
i
=
id
;
find
->
comp
=
ML_COMP_EQUAL
;
p_where
=
ml_FtreeFastAnd
(
p_where
,
find
);
/* Let's update the database ! */
if
(
i_ret
==
VLC_SUCCESS
)
i_ret
=
ml_Update
(
p_media_library
,
selected_type
,
psz_lvalue
,
p_where
,
array
);
/* Destroying array */
for
(
int
i
=
0
;
i
<
vlc_array_count
(
array
);
i
++
)
{
free
(
vlc_array_item_at_index
(
array
,
i
)
);
}
vlc_array_destroy
(
array
);
ml_FreeFindTree
(
p_where
);
return
i_ret
;
}
/**
* @brief Connect up a find tree
* @param op operator to connect with
* If op = ML_OP_NONE, then you are connecting to a tree consisting of
* only SPECIAL nodes.
* If op = ML_OP_NOT, then right MUST be NULL
* op must not be ML_OP_SPECIAL, @see __ml_FtreeSpec
* @param left part of the tree
* @param right part of the tree
* @return Pointer to new tree
* @note Use the helpers!
*/
ml_ftree_t
*
ml_OpConnectChilds
(
ml_op_e
op
,
ml_ftree_t
*
left
,
ml_ftree_t
*
right
)
{
/* Use this Op for fresh trees (with only special nodes/none at all!) */
if
(
op
==
ML_OP_NONE
)
{
assert
(
ml_FtreeHasOp
(
left
)
==
0
);
if
(
left
==
NULL
)
return
right
;
/* Percolate down tree only for special nodes */
assert
(
left
->
op
==
ML_OP_SPECIAL
);
if
(
left
->
left
==
NULL
)
{
left
->
left
=
right
;
return
left
;
}
else
{
return
ml_OpConnectChilds
(
ML_OP_NONE
,
left
->
left
,
right
);
}
}
else
if
(
op
==
ML_OP_NOT
)
{
assert
(
right
==
NULL
&&
left
!=
NULL
);
assert
(
ml_FtreeHasOp
(
left
)
>
0
);
}
else
if
(
op
==
ML_OP_SPECIAL
)
{
assert
(
0
);
}
else
{
assert
(
right
!=
NULL
&&
left
!=
NULL
);
assert
(
ml_FtreeHasOp
(
left
)
>
0
);
assert
(
ml_FtreeHasOp
(
right
)
>
0
);
}
ml_ftree_t
*
p_parent
=
(
ml_ftree_t
*
)
calloc
(
1
,
sizeof
(
ml_ftree_t
)
);
p_parent
->
op
=
op
;
p_parent
->
left
=
left
;
p_parent
->
right
=
right
;
return
p_parent
;
}
/**
* @brief Attaches a special node to a tree
* @param tree Tree to attach special node to
* @param crit Criteria may be SORT_ASC, SORT_DESC, LIMIT or DISTINCT
* @param limit Limit used if LIMIT criteria used
* @param Sort string used if SORT criteria is used
* @return Pointer to new tree
* @note Use the helpers
*/
ml_ftree_t
*
__ml_FtreeSpec
(
ml_ftree_t
*
tree
,
ml_select_e
crit
,
int
limit
,
char
*
sort
)
{
assert
(
crit
==
ML_SORT_ASC
||
crit
==
ML_LIMIT
||
crit
==
ML_SORT_DESC
||
crit
==
ML_DISTINCT
);
ml_ftree_t
*
right
=
(
ml_ftree_t
*
)
calloc
(
1
,
sizeof
(
ml_ftree_t
)
);
right
->
criteria
=
crit
;
if
(
crit
==
ML_LIMIT
)
right
->
value
.
i
=
limit
;
else
if
(
crit
==
ML_SORT_ASC
||
crit
==
ML_SORT_DESC
)
right
->
value
.
str
=
strdup
(
sort
);
right
->
op
=
ML_OP_NONE
;
ml_ftree_t
*
p_parent
=
(
ml_ftree_t
*
)
calloc
(
1
,
sizeof
(
ml_ftree_t
)
);
p_parent
->
right
=
right
;
p_parent
->
op
=
ML_OP_SPECIAL
;
p_parent
->
left
=
tree
;
return
p_parent
;
}
/**
* @brief Creates and adds the playlist based on a given find tree
* @param p_ml Media library object
* @param p_tree Find tree to create SELECT
*/
void
ml_PlaySmartPlaylistBasedOn
(
media_library_t
*
p_ml
,
ml_ftree_t
*
p_tree
)
{
assert
(
p_tree
);
vlc_array_t
*
p_results
=
vlc_array_new
();
ml_FindAdv
(
p_ml
,
p_results
,
ML_ID
,
NULL
,
p_tree
);
playlist_t
*
p_pl
=
pl_Hold
(
p_ml
);
playlist_Lock
(
p_pl
);
playlist_Clear
(
p_pl
,
true
);
for
(
int
i
=
0
;
i
<
vlc_array_count
(
p_results
);
i
++
)
{
ml_result_t
*
p_res
=
(
ml_result_t
*
)
vlc_array_item_at_index
(
p_results
,
i
);
input_item_t
*
p_item
;
if
(
p_res
)
{
p_item
=
ml_CreateInputItem
(
p_ml
,
p_res
->
value
.
i
);
playlist_AddInput
(
p_pl
,
p_item
,
PLAYLIST_APPEND
,
PLAYLIST_END
,
true
,
true
);
}
}
playlist_Unlock
(
p_pl
);
ml_DestroyResultArray
(
p_results
);
vlc_array_destroy
(
p_results
);
}
/**
* @brief Returns a person list of given type
* @param p_ml The ML object
* @param p_media The Media object
* @param i_type The person type
* @note This function is thread safe
*/
ml_person_t
*
ml_GetPersonsFromMedia
(
media_library_t
*
p_ml
,
ml_media_t
*
p_media
,
const
char
*
psz_role
)
{
VLC_UNUSED
(
p_ml
);
assert
(
p_media
!=
NULL
);
ml_person_t
*
p_return
=
NULL
;
ml_LockMedia
(
p_media
);
ml_person_t
*
p_person
=
p_media
->
p_people
;
while
(
p_person
)
{
if
(
strcmp
(
p_person
->
psz_role
,
psz_role
)
==
0
)
{
int
i_ret
=
ml_CreateAppendPerson
(
&
p_return
,
p_person
);
if
(
i_ret
!=
VLC_SUCCESS
)
{
ml_UnlockMedia
(
p_media
);
ml_FreePeople
(
p_return
);
return
NULL
;
}
}
p_person
=
p_person
->
p_next
;
}
ml_UnlockMedia
(
p_media
);
//TODO: Fill up empty names + clean up list
return
p_return
;
}
/**
* @brief Delete a certain type of people from a media
* @param p_media Media to delete from
* @param i_type Type of person to delete
* @note This function is threadsafe
*/
void
ml_DeletePersonTypeFromMedia
(
ml_media_t
*
p_media
,
const
char
*
psz_role
)
{
assert
(
p_media
);
ml_LockMedia
(
p_media
);
ml_person_t
*
p_prev
=
NULL
;
ml_person_t
*
p_person
=
p_media
->
p_people
;
while
(
p_person
)
{
if
(
strcmp
(
p_person
->
psz_role
,
psz_role
)
==
0
)
{
if
(
p_prev
==
NULL
)
{
p_media
->
p_people
=
p_person
->
p_next
;
p_person
->
p_next
=
NULL
;
ml_FreePeople
(
p_person
);
p_person
=
p_media
->
p_people
;
}
else
{
p_prev
->
p_next
=
p_person
->
p_next
;
p_person
->
p_next
=
NULL
;
ml_FreePeople
(
p_person
);
p_person
=
p_prev
->
p_next
;
}
}
else
{
p_prev
=
p_person
;
p_person
=
p_person
->
p_next
;
}
}
ml_UnlockMedia
(
p_media
);
}
#endif
/* MEDIA_LIBRARY */
src/missing.c
View file @
6bff1cc9
...
...
@@ -395,3 +395,60 @@ vlm_t *vlm_New (vlc_object_t *obj)
return
NULL
;
}
#endif
/* !ENABLE_VLM */
#ifndef MEDIA_LIBRARY
#include<vlc_media_library.h>
media_library_t
*
__ml_Hold
(
vlc_object_t
*
p_this
)
{
return
NULL
;
}
void
__ml_Release
(
vlc_object_t
*
p_this
)
{
assert
(
0
);
}
media_library_t
*
__ml_Create
(
vlc_object_t
*
p_this
,
char
*
psz_name
)
{
return
NULL
;
}
void
__ml_Destroy
(
vlc_object_t
*
p_this
)
{
assert
(
0
);
}
ml_media_t
*
media_New
(
media_library_t
*
p_ml
,
int
id
,
ml_select_e
select
,
bool
reload
)
{
assert
(
0
);
}
int
__ml_UpdateSimple
(
media_library_t
*
p_media_library
,
ml_select_e
selected_type
,
const
char
*
psz_lvalue
,
int
id
,
...
)
{
assert
(
0
);
}
ml_ftree_t
*
ml_OpConnectChilds
(
ml_op_e
op
,
ml_ftree_t
*
left
,
ml_ftree_t
*
right
)
{
assert
(
0
);
}
ml_ftree_t
*
__ml_FtreeSpec
(
ml_ftree_t
*
tree
,
ml_select_e
crit
,
int
limit
,
char
*
sort
)
{
assert
(
0
);
}
void
ml_PlaySmartPlaylistBasedOn
(
media_library_t
*
p_ml
,
ml_ftree_t
*
p_tree
)
{
assert
(
0
);
}
void
ml_DeletePersonTypeFromMedia
(
ml_media_t
*
p_media
,
const
char
*
psz_role
)
{
assert
(
0
);
}
#endif
/* !MEDIA_LIBRARY */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment