[vlc-devel] [PATCH 02/20] medialibrary: fs: use input_item_Parse
Thomas Guillem
thomas at gllm.fr
Fri May 31 15:59:28 CEST 2019
---
modules/misc/medialibrary/fs/directory.cpp | 79 +++++++++-------------
1 file changed, 32 insertions(+), 47 deletions(-)
diff --git a/modules/misc/medialibrary/fs/directory.cpp b/modules/misc/medialibrary/fs/directory.cpp
index 2eb7f7b77f..27fccbe772 100644
--- a/modules/misc/medialibrary/fs/directory.cpp
+++ b/modules/misc/medialibrary/fs/directory.cpp
@@ -83,7 +83,7 @@ struct metadata_request {
vlc::threads::mutex lock;
vlc::threads::condition_variable cond;
/* results */
- input_state_e state;
+ bool success;
bool probe;
std::vector<InputItemPtr> *children;
};
@@ -93,43 +93,31 @@ struct metadata_request {
extern "C" {
-static void onInputEvent( input_thread_t*, const struct vlc_input_event *event,
- void *data )
+static void onParserEnded( input_item_t *, int ret, void *data )
{
auto req = static_cast<vlc::medialibrary::metadata_request*>( data );
- switch ( event->type )
+
+ vlc::threads::mutex_locker lock( req->lock );
+ req->success = ret == VLC_SUCCESS;
+ req->probe = true;
+ req->cond.signal();
+}
+
+static void OnParserSubtreeAdded( input_item_t *, input_item_node_t *subtree,
+ void *data )
+{
+ auto req = static_cast<vlc::medialibrary::metadata_request*>( data );
+
+ for (int i = 0; i < subtree->i_children; ++i)
{
- case INPUT_EVENT_SUBITEMS:
- {
- for (int i = 0; i < event->subitems->i_children; ++i)
- {
- input_item_node_t *child = event->subitems->pp_children[i];
- /* this class assumes we always receive a flat list */
- assert(child->i_children == 0);
- input_item_t *media = child->p_item;
- req->children->emplace_back( media );
- }
- break;
- }
- case INPUT_EVENT_STATE:
- {
- vlc::threads::mutex_locker lock( req->lock );
- req->state = event->state;
- }
- break;
- case INPUT_EVENT_DEAD:
- {
- vlc::threads::mutex_locker lock( req->lock );
- // We need to probe the item now, but not from the input thread
- req->probe = true;
- }
- req->cond.signal();
- break;
- default:
- break;
+ input_item_node_t *child = subtree->pp_children[i];
+ /* this class assumes we always receive a flat list */
+ assert(child->i_children == 0);
+ input_item_t *media = child->p_item;
+ req->children->emplace_back( media );
}
-
}
+
} /* extern C */
namespace vlc {
@@ -144,34 +132,31 @@ static bool request_metadata_sync( libvlc_int_t *libvlc, input_item_t *media,
auto deadline = vlc_tick_now() + VLC_TICK_FROM_SEC( 5 );
media->i_preparse_depth = 1;
- auto inputThread = vlc::wrap_cptr(
- input_CreatePreparser( VLC_OBJECT( libvlc ), onInputEvent, &req, media ),
- &input_Close );
- if ( inputThread == nullptr )
+ static const input_item_parser_cbs_t cbs = {
+ onParserEnded,
+ OnParserSubtreeAdded,
+ };
+
+ auto inputParser = vlc::wrap_cptr(
+ input_item_Parse( media, VLC_OBJECT( libvlc ), &cbs, &req ),
+ &input_item_parser_Release );
+
+ if ( inputParser== nullptr )
return false;
vlc::threads::mutex_locker lock( req.lock );
- if ( input_Start( inputThread.get() ) != VLC_SUCCESS )
- return false;
while ( req.probe == false )
{
auto res = req.cond.timedwait( req.lock, deadline );
if (res != 0 )
{
- input_Stop( inputThread.get() );
throw std::system_error( ETIMEDOUT, std::generic_category(),
"Failed to browse network directory: "
"Network is too slow");
}
- if ( req.probe == true )
- {
- if ( req.state == END_S || req.state == ERROR_S )
- break;
- req.probe = false;
- }
}
- return req.state == END_S;
+ return req.success;
}
void
--
2.20.1
More information about the vlc-devel
mailing list