diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/playlist/SPlaylist.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/playlist/SPlaylist.cpp')
-rw-r--r-- | Src/playlist/SPlaylist.cpp | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/Src/playlist/SPlaylist.cpp b/Src/playlist/SPlaylist.cpp new file mode 100644 index 00000000..0777840d --- /dev/null +++ b/Src/playlist/SPlaylist.cpp @@ -0,0 +1,270 @@ +#include "SPlaylist.h" +#include "api__playlist.h" +#include "PlaylistManager.h" + +extern ScriptObjectController *script_root; +extern PlaylistScriptController playlistController; + + +// -- Functions table ------------------------------------- +function_descriptor_struct PlaylistScriptController::exportedFunction[] = { + {L"Clear", 0, (void*)SPlaylist::script_vcpu_Clear }, + {L"GetNumItems", 0, (void*)SPlaylist::script_vcpu_GetNumItems }, + {L"GetItem", 1, (void*)SPlaylist::script_vcpu_GetItem }, + {L"GetItemTitle", 1, (void*)SPlaylist::script_vcpu_GetItemTitle }, + {L"GetItemLength", 1, (void*)SPlaylist::script_vcpu_GetItemLength }, + {L"GetItemExtendedInfo", 2, (void*)SPlaylist::script_vcpu_GetItemExtendedInfo }, + {L"Reverse", 0, (void*)SPlaylist::script_vcpu_Reverse }, + {L"Swap", 2, (void*)SPlaylist::script_vcpu_Swap }, + {L"Randomize", 0, (void*)SPlaylist::script_vcpu_Randomize }, + {L"Remove", 1, (void*)SPlaylist::script_vcpu_Remove }, + {L"SortByTitle", 0, (void*)SPlaylist::script_vcpu_SortByTitle }, + {L"SortByFilename", 0, (void*)SPlaylist::script_vcpu_SortByFilename }, + /* TODO: + {L"Append", 3, (void*)SPlaylist::script_vcpu_Append }, + {L"Insert", 4, (void*)SPlaylist::script_vcpu_Insert }, + {L"SetItemFilename", 2, (void*)SPlaylist::script_vcpu_SetItemFilename }, + {L"SetItemTitle", 2, (void*)SPlaylist::script_vcpu_SetItemTitle }, + {L"SetItemLengthMilliseconds", 2, (void*)SPlaylist::script_vcpu_SetItemLengthMilliseconds }, + {L"SortByDirectory", 0, (void*)SPlaylist::script_vcpu_SortByDirectory }, + */ + +}; +// -------------------------------------------------------- + +const wchar_t *PlaylistScriptController::getClassName() +{ + return L"Playlist"; +} + +const wchar_t *PlaylistScriptController::getAncestorClassName() +{ + return L"Object"; +} + +ScriptObjectController *PlaylistScriptController::getAncestorController() +{ + return script_root; +} + +ScriptObject *PlaylistScriptController::instantiate() +{ + SPlaylist *xd = new SPlaylist; + + ASSERT( xd != NULL ); + + return xd->getScriptObject(); +} + +void PlaylistScriptController::destroy( ScriptObject *o ) +{ + SPlaylist *xd = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + + ASSERT( xd != NULL ); + + delete xd; +} + +void *PlaylistScriptController::encapsulate( ScriptObject *o ) +{ + return NULL; +} + +void PlaylistScriptController::deencapsulate( void *o ) +{} + +int PlaylistScriptController::getNumFunctions() +{ + return sizeof( exportedFunction ) / sizeof( function_descriptor_struct ); +} + +const function_descriptor_struct *PlaylistScriptController::getExportedFunctions() +{ + return exportedFunction; +} + +GUID PlaylistScriptController::getClassGuid() +{ + return makiPlaylistGUID; +} + + +/* ---- */ +SPlaylist::SPlaylist() +{ + getScriptObject()->vcpu_setInterface( makiPlaylistGUID, static_cast<SPlaylist *>( this ) ); + getScriptObject()->vcpu_setClassName( L"Playlist" ); + getScriptObject()->vcpu_setController( &playlistController ); +} + +scriptVar SPlaylist::script_vcpu_Clear( SCRIPT_FUNCTION_PARAMS, ScriptObject *o ) +{ + SCRIPT_FUNCTION_INIT; + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + playlist->playlist.Clear(); + } + RETURN_SCRIPT_VOID +} + +scriptVar SPlaylist::script_vcpu_GetNumItems( SCRIPT_FUNCTION_PARAMS, ScriptObject *o ) +{ + SCRIPT_FUNCTION_INIT; + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + size_t count = playlist->playlist.GetNumItems(); + + return MAKE_SCRIPT_INT( (int)count ); + } + RETURN_SCRIPT_ZERO +} + +static wchar_t splaylist_string_return[ 1024 ]; +static wchar_t *splaylist_string_empty = L""; + +scriptVar SPlaylist::script_vcpu_GetItem( SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar itemNumber ) +{ + SCRIPT_FUNCTION_INIT; + + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + int item = GET_SCRIPT_INT( itemNumber ); + size_t cch = playlist->playlist.GetItem( item, splaylist_string_return, sizeof( splaylist_string_return ) / sizeof( *splaylist_string_return ) ); + + if ( cch == 0 ) + return MAKE_SCRIPT_STRING( splaylist_string_empty ); + else + return MAKE_SCRIPT_STRING( splaylist_string_return ); + } + + return MAKE_SCRIPT_STRING( splaylist_string_empty ); +} + +scriptVar SPlaylist::script_vcpu_GetItemTitle( SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar itemNumber ) +{ + SCRIPT_FUNCTION_INIT; + + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + int item = GET_SCRIPT_INT( itemNumber ); + size_t cch = playlist->playlist.GetItemTitle( item, splaylist_string_return, sizeof( splaylist_string_return ) / sizeof( *splaylist_string_return ) ); + + if ( cch == 0 ) + return MAKE_SCRIPT_STRING( splaylist_string_empty ); + else + return MAKE_SCRIPT_STRING( splaylist_string_return ); + } + + return MAKE_SCRIPT_STRING( splaylist_string_empty ); +} + +scriptVar SPlaylist::script_vcpu_GetItemLength( SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar itemNumber ) +{ + SCRIPT_FUNCTION_INIT; + + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + int item = GET_SCRIPT_INT( itemNumber ); + int length = playlist->playlist.GetItemLengthMilliseconds( item ); + + return MAKE_SCRIPT_INT( length ); + } + + return MAKE_SCRIPT_INT( -1 ); +} + +scriptVar SPlaylist::script_vcpu_GetItemExtendedInfo( SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar itemNumber, scriptVar metadata ) +{ + SCRIPT_FUNCTION_INIT; + + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + int item = GET_SCRIPT_INT( itemNumber ); + const wchar_t *tag = GET_SCRIPT_STRING( metadata ); + size_t cch = playlist->playlist.GetItemExtendedInfo( item, tag, splaylist_string_return, sizeof( splaylist_string_return ) / sizeof( *splaylist_string_return ) ); + + if ( cch == 0 ) + return MAKE_SCRIPT_STRING( splaylist_string_empty ); + else + return MAKE_SCRIPT_STRING( splaylist_string_return ); + } + + return MAKE_SCRIPT_STRING( splaylist_string_empty ); +} + +scriptVar SPlaylist::script_vcpu_Reverse( SCRIPT_FUNCTION_PARAMS, ScriptObject *o ) +{ + SCRIPT_FUNCTION_INIT; + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + playlist->playlist.Reverse(); + } + RETURN_SCRIPT_VOID +} + +scriptVar SPlaylist::script_vcpu_Swap( SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar position1, scriptVar position2 ) +{ + SCRIPT_FUNCTION_INIT; + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + int item1 = GET_SCRIPT_INT( position1 ); + int item2 = GET_SCRIPT_INT( position2 ); + + playlist->playlist.Swap( item1, item2 ); + } + RETURN_SCRIPT_VOID +} + +scriptVar SPlaylist::script_vcpu_Randomize( SCRIPT_FUNCTION_PARAMS, ScriptObject *o ) +{ + SCRIPT_FUNCTION_INIT; + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + playlistManager.Randomize( &playlist->playlist ); + } + RETURN_SCRIPT_VOID +} + + +scriptVar SPlaylist::script_vcpu_Remove( SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar itemIndex ) +{ + SCRIPT_FUNCTION_INIT; + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + int item = GET_SCRIPT_INT( itemIndex ); + playlist->playlist.Remove( item ); + } + RETURN_SCRIPT_VOID +} + +scriptVar SPlaylist::script_vcpu_SortByTitle( SCRIPT_FUNCTION_PARAMS, ScriptObject *o ) +{ + SCRIPT_FUNCTION_INIT; + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + playlist->playlist.SortByTitle(); + } + RETURN_SCRIPT_VOID +} + +scriptVar SPlaylist::script_vcpu_SortByFilename( SCRIPT_FUNCTION_PARAMS, ScriptObject *o ) +{ + SCRIPT_FUNCTION_INIT; + SPlaylist *playlist = static_cast<SPlaylist *>( o->vcpu_getInterface( makiPlaylistGUID ) ); + if ( playlist ) + { + playlist->playlist.SortByFilename(); + } + RETURN_SCRIPT_VOID +} |