/*****************************************************************************
* sort.c : Playlist sorting functions
*****************************************************************************
- * Copyright (C) 1999-2004 the VideoLAN team
+ * Copyright (C) 1999-2007 the VideoLAN team
* $Id$
*
* Authors: Clément Stenac <zorglub@videolan.org>
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include <vlc/vlc.h>
-#include <vlc/input.h>
#include "vlc_playlist.h"
#include "playlist_internal.h"
-int playlist_ItemArraySort( playlist_t *p_playlist, int i_items,
- playlist_item_t **pp_items, int i_mode,
- int i_type );
+static int playlist_ItemArraySort( playlist_t *p_playlist, int i_items,
+ playlist_item_t **pp_items, int i_mode,
+ int i_type );
/**
* Sort a node.
- *
* This function must be entered with the playlist lock !
*
* \param p_playlist the playlist
* \param i_type: ORDER_NORMAL or ORDER_REVERSE (reversed order)
* \return VLC_SUCCESS on success
*/
-int playlist_NodeSort( playlist_t * p_playlist , playlist_item_t *p_node,
- int i_mode, int i_type )
+static int playlist_NodeSort( playlist_t * p_playlist , playlist_item_t *p_node,
+ int i_mode, int i_type )
{
playlist_ItemArraySort( p_playlist,p_node->i_children,
p_node->pp_children, i_mode, i_type );
}
-int playlist_ItemArraySort( playlist_t *p_playlist, int i_items,
- playlist_item_t **pp_items, int i_mode,
- int i_type )
+static int playlist_ItemArraySort( playlist_t *p_playlist, int i_items,
+ playlist_item_t **pp_items, int i_mode,
+ int i_type )
{
int i , i_small , i_position;
playlist_item_t *p_temp;
vlc_value_t val;
val.b_bool = VLC_TRUE;
+ (void)p_playlist; // a bit surprising we don't need p_playlist!
+
if( i_mode == SORT_RANDOM )
{
for( i_position = 0; i_position < i_items ; i_position ++ )
return VLC_SUCCESS;
}
+#define META_STRCASECMP_NAME( i, i_small ) { \
+ char *psz_i = input_item_GetName( pp_items[i]->p_input ); \
+ char *psz_ismall = input_item_GetName( pp_items[i_small]->p_input ); \
+ i_test = strcasecmp( psz_i, psz_ismall ); \
+ free( psz_i ); \
+ free( psz_ismall ); \
+}
+
+
#define DO_META_SORT( node ) { \
- char *psz_a = pp_items[i]->p_input->p_meta ? \
- pp_items[i]->p_input->p_meta->psz_##node : NULL ; \
- char *psz_b = pp_items[i_small]->p_input->p_meta ? \
- pp_items[i_small]->p_input->p_meta->psz_##node : NULL; \
+ char *psz_a = input_item_GetMeta( pp_items[i]->p_input, vlc_meta_##node ); \
+ char *psz_b = input_item_GetMeta( pp_items[i_small]->p_input, vlc_meta_##node ); \
/* Nodes go first */ \
if( pp_items[i]->i_children == -1 && pp_items[i_small]->i_children >= 0 ) \
i_test = 1;\
else if( pp_items[i]->i_children >= 0 && \
pp_items[i_small]->i_children >= 0 ) \
{ \
- i_test = strcasecmp( pp_items[i]->p_input->psz_name, \
- pp_items[i_small]->p_input->psz_name ); \
+ META_STRCASECMP_NAME( i, i_small ) \
} \
/* Both are items */ \
else if( psz_a == NULL && psz_b != NULL ) \
/* No meta, sort by name */ \
else if( psz_a == NULL && psz_b == NULL ) \
{ \
- i_test = strcasecmp( pp_items[i]->p_input->psz_name, \
- pp_items[i_small]->p_input->psz_name ); \
+ META_STRCASECMP_NAME( i, i_small ); \
} \
else \
{ \
i_test = strcmp( psz_b, psz_a ); \
} \
+ free( psz_a ); \
+ free( psz_b ); \
}
for( i_position = 0; i_position < i_items -1 ; i_position ++ )
if( i_mode == SORT_TITLE )
{
- i_test = strcasecmp( pp_items[i]->p_input->psz_name,
- pp_items[i_small]->p_input->psz_name );
+ META_STRCASECMP_NAME( i, i_small );
}
else if( i_mode == SORT_TITLE_NUMERIC )
{
- i_test = atoi( pp_items[i]->p_input->psz_name ) -
- atoi( pp_items[i_small]->p_input->psz_name );
+ char *psz_i = input_item_GetName( pp_items[i]->p_input );
+ char *psz_ismall =
+ input_item_GetName( pp_items[i_small]->p_input );
+ i_test = atoi( psz_i ) - atoi( psz_ismall );
+ free( psz_i );
+ free( psz_ismall );
}
else if( i_mode == SORT_DURATION )
{
- i_test = pp_items[i]->p_input->i_duration -
- pp_items[i_small]->p_input->i_duration;
+ i_test = input_item_GetDuration( pp_items[i]->p_input ) -
+ input_item_GetDuration( pp_items[i_small]->p_input );
}
else if( i_mode == SORT_ARTIST )
{
- DO_META_SORT( artist );
+ DO_META_SORT( Artist );
}
else if( i_mode == SORT_ALBUM )
{
- DO_META_SORT( album );
+ DO_META_SORT( Album );
}
else if( i_mode == SORT_TITLE_NODES_FIRST )
{