[vlc-devel] core playlist

Pierre d'Herbemont pdherbemont at gmail.com
Tue Sep 1 02:16:34 CEST 2009


On Aug 31, 2009, at 4:15 PM, Jakob Leben wrote:

> On Sun, Aug 30, 2009 at 8:04 PM, Pierre d'Herbemont <pdherbemont at gmail.com 
> > wrote:
>    /* pf_children must be asynchronous, it must result in
>       a vlc_Services_DiscoveryItemChildren event. If called with  
> p_parent = NULL,
>       it must return the top level items. */
>
> If it is asynchronous, I would probably use a function pointer to  
> the callback to make this clear, instead of relying onto an event.  
> If the event is always emitted, then this function is useless.
>
> Yes, I didn't mean the event to be emitted always, but only  
> (asynchronously) in respond to a call to this function. You're  
> right, using a callback function pointer is better, also because  
> otherwise every client would receive events even in response to  
> queries not made by that client.

Why can't the client just listen to the event?

>
> On Sun, Aug 30, 2009 at 8:04 PM, Pierre d'Herbemont <pdherbemont at gmail.com 
> > wrote:
> void (*pf_has_children)
>        ( services_discovery_t *p_sd, services_discovery_item_t  
> *p_item );
>
> To what parent refers has_children? The SD?
>
> It refers to the p_item argument  to the function. The reason for  
> this function is that obtaining a children list may be time  
> consuming (and is therefore asynchronous) while with this funtion a  
> client can check if the item is supposed to have children at all and  
> only if that is so make a query for children list. Also, a GUI might  
> show relevant info based on the sole fact that an item has children  
> at all or not.

Right, I misread the prototype.

>
> On Sun, Aug 30, 2009 at 8:04 PM, Pierre d'Herbemont <pdherbemont at gmail.com 
> > wrote:
> This can make the API a pain to use. Can we expect that "p_item1 ==  
> p_item2 <=> p_item1 equals p_item2"?
>
>    void (*pf_free)
>        ( services_discovery_t *p_sd, services_discovery_item_t  
> *p_item );
> There is no create/new, so why is there a _free()?
>
> We should expect that to be true, yes. The module's "compare"  
> function and the data stored in items should be in such a way that  
> comparing an item with itself (equal pointers) returns true (equal  
> items). I would like to point out again that  
> service_discovery_item_t is only a token or a descriptor or a symbol  
> if you want - that refers to some actual item that the SD module  
> operates on (a database entry, a media file...), so it's expected to  
> have more than one such tokens for the same actual items, so it  
> should be possible to somehow compare them. An example of the use of  
> the compare function is: when a children list is transmitted  
> asynchronously from a SD module, a SD parent item of the children  
> will be passed along, so the client can know which item's children  
> list it received, as the client might have issued multiple requests  
> for different parents before receiving their results. This parent  
> item will be a new instance of services_discovery_item_t, different  
> from the one the client had passed to the pf_children function to  
> issue the request, so comparing pointers will not work, but the SD  
> module shall be able to tell their equivalence based on data it  
> stored in the items.

I'd like it better if this was addressed at the SD level, ie - the SD  
ensure that it does always produce the same services_discovery_item_t  
for a children, not the client. If that's impossible fine.

> Another idea that travels in my brain is to have a "request" object,  
> so the response to a request is associated with the request object,  
> and this might be the way a client knows which parent's children  
> list it received.
>
> There is no "create" function because a valid item can only be  
> obtained from a module and it's the module which will allocate the  
> item and return a pointer to it, as it is also the module who  
> defines the struct services_discovery_item_t. Does that make sense?

It does.

> On the other hand, once the module has returned an item pointer to  
> the client, it should not release that item and data stored in it,  
> but that should be done only on client's request. The free function  
> is there also because a shallow "free" executed by client on the  
> item pointer might not free all the data associated with an item.


Then, there is nothing making the reference ownership clear here. When  
shall an item be _free? The usual convention is that you don't own the  
reference from a parameter unless it is retained/held. I wouldn't go  
too far away from here.

> On Sun, Aug 30, 2009 at 8:04 PM, Pierre d'Herbemont <pdherbemont at gmail.com 
> > wrote:
> /* Moreover, a sd module may still (like in the current API)
>       inform clients dynamically about single items being added or  
> removed
>       with vlc_ServicesDiscoveryItemAdded and vlc_
> ServicesDiscoveryItemRemoved
>       events. However, these events shall not be sent for starting  
> info retrieval
>       but only for changes that happen to services after a sd module  
> has
>       already connected to the services source. Does this make  
> sense? */
>
> I don't understand what is the rationale behind that... And I don't  
> understand what is "already connected to the services source". I  
> would expect those event to be sent whenever someone is listening to  
> it.
> [...]
> I think I would expect either to reuse the ItemAdded and ItemRemoved  
> for children addition, or create new one that applies locally to  
> children of the specific item you are interested in.
>
> I must say this is a part I am not totally confident about. I would  
> like the API to be so that time consuming item (children) list  
> retrieval is done on request from client (through the function named  
> pf_children (yes, only a work-in-progress name)), but what if an  
> item has been removed from a SD device for example? I supposed a  
> device that a SD module accesses itself sends events (does  
> callbacks) to the module about items being added or removed, and the  
> module should pass those on to the SD client with ItemAdded2 and  
> ItemRemoved2, which would be new ones, besides the current ones, and  
> not sent immediately upon SD module's connection to the source, like  
> the current ones are.
> But you are right, it's more practical if a SD client can register  
> precisely for specific parents whose children it wants to receive  
> those events about, or even about every single item itself.
>
> All in all, the API is supposed to be considered essentially as a  
> way for a client to travel trees of items defined by a module and to  
> do that by (partly) asynchrounous requests from client to module.  
> This is the general idea behind it so this is my humble suggestion  
> as to how it shall be viewed and evaluated.


There should be probably one manual way to browse the tree of a given  
SD plus one way to register event for tree change. If we want to go  
that way.

I was also wondering if the services_discovery_item_t couldn't be  
merged with input_item_t. Currently input items are also used as node,  
but they only send event that indicates a new subitems. They don't  
store their children. If this was changed then you gain tree support.  
This would still be add-only. Unless we add delete, which shouldn't be  
a big deal.

This is probably the best way to actually remove the data model from  
the playlist_t. (And get rid of playlist_item_t).

Pierre.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20090901/34282e68/attachment.html>


More information about the vlc-devel mailing list