[vlc-devel] [PATCH] libvlc: add libvlc_media_discoverer_services_get

Thomas Guillem thomas at gllm.fr
Tue Feb 9 16:48:54 CET 2016



On Tue, Feb 9, 2016, at 16:07, Rémi Denis-Courmont wrote:
> Le 2016-02-09 14:41, Thomas Guillem a écrit :
> > This function return the list of services discovery handled by 
> > libVLC.
> > ---
> >  include/vlc/libvlc_media_discoverer.h |  57 +++++++++++++++++++
> >  lib/media_discoverer.c                | 101
> > ++++++++++++++++++++++++++++++++++
> >  2 files changed, 158 insertions(+)
> >
> > diff --git a/include/vlc/libvlc_media_discoverer.h
> > b/include/vlc/libvlc_media_discoverer.h
> > index 8866607..f11b2c6 100644
> > --- a/include/vlc/libvlc_media_discoverer.h
> > +++ b/include/vlc/libvlc_media_discoverer.h
> > @@ -30,6 +30,31 @@
> >  extern "C" {
> >  # endif
> >
> > +/**
> > + * Category of a media discoverer service
> > + * \see libvlc_media_discoverer_services_get()
> > + */
> > +typedef enum {
> > +    /** devices, like portable music player */
> > +    libvlc_media_discoverer_devices,
> > +    /** LAN/WAN services, like Upnp, SMB, or SAP */
> > +    libvlc_media_discoverer_lan,
> > +    /** Internet of Website channels services */
> 
> Don't understand the description.
> 
> > +    libvlc_media_discoverer_internet,
> > +    /** Computer services, like Discs or Apps */
> 
> Does not match reality.
> 
> > +    libvlc_media_discoverer_mycomputer,
> 
> Not so good name.
> 
> > +} libvlc_media_discoverer_category;
> > +
> > +/**
> > + * Media discoverer service
> > + * \see libvlc_media_discoverer_services_get()
> > + */
> > +typedef struct {
> > +    char *psz_name;
> > +    char *psz_longname;
> > +    libvlc_media_discoverer_category i_cat;
> > +} libvlc_media_discoverer_service;
> > +
> >  /** \defgroup libvlc_media_discoverer LibVLC media discovery
> >   * \ingroup libvlc
> >   * LibVLC media discovery finds available media via various means.
> > @@ -145,6 +170,38 @@ LIBVLC_API libvlc_event_manager_t *
> >  LIBVLC_API int
> >          libvlc_media_discoverer_is_running(
> > libvlc_media_discoverer_t * p_mdis );
> >
> > +/**
> > + * Get media discoverer services by category
> > + *
> > + * \version LibVLC 3.0.0 and later.
> > + *
> > + * \param p_inst libvlc instance
> > + * \param i_cat category of the service to fetch
> > + * \param ppp_services address to store an allocated array of media
> > discoverer
> > + * services (must be freed with
> > libvlc_media_discoverer_services_release() by
> > + * the caller) [OUT]
> > + *
> > + * \return the number of media discoverer services (zero on error)
> > + */
> > +LIBVLC_API unsigned int
> > +libvlc_media_discoverer_services_get( libvlc_instance_t *p_inst,
> > +
> > libvlc_media_discoverer_category i_cat,
> 
> Come on.

Why?
Others issues will be fixed a in a new patch

> 
> > +
> > libvlc_media_discoverer_service ***ppp_services );
> > +
> > +/**
> > + * Release an array of media discoverer services
> > + *
> > + * \version LibVLC 3.0.0 and later.
> > + *
> > + * \see libvlc_media_discoverer_services_get()
> > + *
> > + * \param pp_services array to release
> > + * \param i_count number of elements in the array
> > + */
> > +LIBVLC_API void
> > +libvlc_media_discoverer_services_release(
> > libvlc_media_discoverer_service **pp_services,
> > +                                          unsigned int i_count );
> > +
> >  /**@} */
> >
> >  # ifdef __cplusplus
> > diff --git a/lib/media_discoverer.c b/lib/media_discoverer.c
> > index ed9390b..3e76780 100644
> > --- a/lib/media_discoverer.c
> > +++ b/lib/media_discoverer.c
> > @@ -385,3 +385,104 @@ libvlc_media_discoverer_is_running(
> > libvlc_media_discoverer_t * p_mdis )
> >  {
> >      return p_mdis->running;
> >  }
> > +
> > +void
> > +libvlc_media_discoverer_services_release(
> > libvlc_media_discoverer_service **pp_services,
> > +                                          unsigned int i_count )
> > +{
> > +    for( unsigned int i = 0; i < i_count; ++i )
> > +    {
> > +        free( pp_services[i]->psz_name );
> > +        free( pp_services[i]->psz_longname );
> > +        free( pp_services[i] );
> > +    }
> > +    free( pp_services );
> 
> Invalid free if i_count == 0 ??
> 
> > +}
> > +
> > +unsigned int
> > +libvlc_media_discoverer_services_get( libvlc_instance_t *p_inst,
> > +
> > libvlc_media_discoverer_category i_cat,
> > +
> > libvlc_media_discoverer_service ***ppp_services )
> > +{
> > +    int i_core_cat;
> > +    switch( i_cat )
> > +    {
> > +    case libvlc_media_discoverer_devices:
> > +        i_core_cat = SD_CAT_DEVICES;
> > +        break;
> > +    case libvlc_media_discoverer_lan:
> > +        i_core_cat = SD_CAT_LAN;
> > +        break;
> > +    case libvlc_media_discoverer_internet:
> > +        i_core_cat = SD_CAT_INTERNET;
> > +        break;
> > +    case libvlc_media_discoverer_mycomputer:
> > +        i_core_cat = SD_CAT_MYCOMPUTER;
> > +        break;
> > +    default:
> > +        vlc_assert_unreachable();
> > +        return 0;
> > +    }
> > +
> > +    /* Fetch all sd names, longnames and categories */
> > +    char **ppsz_names, **ppsz_longnames;
> > +    int *p_categories;
> > +    ppsz_names = vlc_sd_GetNames( p_inst->p_libvlc_int, 
> > &ppsz_longnames,
> > +                                  &p_categories );
> > +
> > +    if( ppsz_names == NULL )
> > +        return 0;
> > +
> > +    /* Count the number of sd matching our category 
> > (i_cat/i_core_cat) */
> > +    unsigned int i_nb_services = 0;
> > +    char **ppsz_name = ppsz_names;
> > +    int *p_category = p_categories;
> > +    for( ; *ppsz_name != NULL; ppsz_name++, p_category++ )
> > +    {
> > +        if( *p_category == i_core_cat )
> > +            i_nb_services++;
> > +    }
> > +
> > +    libvlc_media_discoverer_service **pp_services = i_nb_services > 
> > 0 ?
> > +        malloc( i_nb_services *
> > sizeof(libvlc_media_discoverer_service *) ) : NULL;
> > +
> > +    /* Fill output pp_services or free unused name, longnames */
> > +    char **ppsz_longname = ppsz_longnames;
> > +    ppsz_name = ppsz_names;
> > +    p_category = p_categories;
> > +    unsigned int i_service_idx = 0;
> > +    for( ; *ppsz_name != NULL; ppsz_name++, ppsz_longname++, 
> > p_category++ )
> > +    {
> > +        if( pp_services != NULL && *p_category == i_core_cat )
> > +        {
> > +            libvlc_media_discoverer_service *p_service =
> > +                malloc( sizeof(libvlc_media_discoverer_service) );
> > +            if( p_service == NULL )
> > +            {
> > +                libvlc_media_discoverer_services_release( 
> > pp_services,
> > +                                                          
> > i_service_idx );
> > +                pp_services = NULL;
> > +                i_nb_services = 0;
> > +            }
> > +            else
> > +            {
> > +                p_service->psz_name = *ppsz_name;
> > +                p_service->psz_longname = *ppsz_longname;
> > +                p_service->i_cat = i_cat;
> > +                pp_services[i_service_idx++] = p_service;
> > +            }
> > +        }
> > +        else
> > +        {
> > +            free( *ppsz_name );
> > +            free( *ppsz_longname );
> > +        }
> > +    }
> > +    free( ppsz_names );
> > +    free( ppsz_longnames );
> > +    free( p_categories );
> > +
> > +    if( i_nb_services > 0 )
> > +        *ppp_services = pp_services;
> > +    return i_nb_services;
> > +}
> 
> -- 
> Rémi Denis-Courmont
> http://www.remlab.net/
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list