#include "MediaLibraryInterface.h" #include #include "../nu/ns_wc.h" #include "../winamp/wa_ipc.h" #include "../Agave/Language/api_language.h" #define _ML_HEADER_IMPMLEMENT #include "..\Plugins\General\gen_ml/ml_ipc_0313.h" #undef _ML_HEADER_IMPMLEMENT #include "..\Plugins\General\gen_ml/ml_imageloader.h" #include #include MediaLibraryInterface mediaLibrary; void MediaLibraryInterface::AddTreeItem(MLTREEITEM &newItem) { SendMessage(library, WM_ML_IPC, (WPARAM) &newItem, ML_IPC_TREEITEM_ADD); } void MediaLibraryInterface::AddTreeItem(MLTREEITEMW &newItem) { SendMessage(library, WM_ML_IPC, (WPARAM) &newItem, ML_IPC_TREEITEM_ADDW); } int MediaLibraryInterface::AddTreeImage(int resourceId) { return AddTreeImage(resourceId, -1, (BMPFILTERPROC)FILTER_DEFAULT1); } int MediaLibraryInterface::AddTreeImage(int resourceId, int imageIndex, BMPFILTERPROC filter) { MLTREEIMAGE img = {instance, resourceId, imageIndex, filter, 0, 0}; return (int)(INT_PTR)SendMessage(library, WM_ML_IPC, (WPARAM) &img, ML_IPC_TREEIMAGE_ADD); } int MediaLibraryInterface::AddTreeImageBmp(int resourceId) { HMLIMGLST hmlilNavigation = MLNavCtrl_GetImageList(library); MLIMAGESOURCE mlis = {sizeof(MLIMAGESOURCE),0}; MLIMAGELISTITEM item = {0}; item.cbSize = sizeof( MLIMAGELISTITEM ); item.hmlil = hmlilNavigation; item.filterUID = MLIF_FILTER1_UID; item.pmlImgSource = &mlis; mlis.hInst = instance; mlis.bpp = 24; mlis.lpszName = MAKEINTRESOURCEW(resourceId); mlis.type = SRC_TYPE_BMP; mlis.flags = ISF_FORCE_BPP; return MLImageList_Add(library, &item); } void MediaLibraryInterface::SetTreeItem(MLTREEITEM &item) { MLTREEITEMINFO ii = {0}; ii.item = item; ii.mask = MLTI_IMAGE | MLTI_CHILDREN | MLTI_TEXT | MLTI_ID; SendMessage(library, WM_ML_IPC, (WPARAM) &ii, ML_IPC_TREEITEM_SETINFO); } void MediaLibraryInterface::SetTreeItem(MLTREEITEMW &item) { MLTREEITEMINFOW ii = {0}; ii.item = item; ii.mask = MLTI_IMAGE | MLTI_CHILDREN | MLTI_TEXT | MLTI_ID; SendMessage(library, WM_ML_IPC, (WPARAM) &ii, ML_IPC_TREEITEM_SETINFOW); } void MediaLibraryInterface::InsertTreeItem(MLTREEITEM &newItem) { SendMessage(library, WM_ML_IPC, (WPARAM) &newItem, ML_IPC_TREEITEM_INSERT); } void MediaLibraryInterface::InsertTreeItem(MLTREEITEMW &newItem) { SendMessage(library, WM_ML_IPC, (WPARAM) &newItem, ML_IPC_TREEITEM_INSERTW); } void MediaLibraryInterface::RemoveTreeItem(INT_PTR treeId) { SendMessage(library, WM_ML_IPC, (WPARAM)treeId, ML_IPC_DELTREEITEM); } void MediaLibraryInterface::SelectTreeItem(INT_PTR treeId) { SendMessage(library, WM_ML_IPC, (WPARAM)treeId, ML_IPC_SETCURTREEITEM); } INT_PTR MediaLibraryInterface::GetSelectedTreeItem(void) { return (INT_PTR)SendMessage(library, WM_ML_IPC, 0, ML_IPC_GETCURTREEITEM); } void MediaLibraryInterface::UpdateTreeItem(MLTREEITEMINFO &newItem) { SendMessage(library, WM_ML_IPC, (WPARAM) &newItem, ML_IPC_TREEITEM_SETINFO); } void MediaLibraryInterface::UpdateTreeItem(MLTREEITEMINFOW &newItem) { SendMessage(library, WM_ML_IPC, (WPARAM) &newItem, ML_IPC_TREEITEM_SETINFOW); } int MediaLibraryInterface::SkinList(HWND list) { return (int)(INT_PTR)SendMessage(library, WM_ML_IPC, (WPARAM)list, ML_IPC_SKIN_LISTVIEW); } void MediaLibraryInterface::UnskinList(int token) { SendMessage(library, WM_ML_IPC, (WPARAM)token, ML_IPC_UNSKIN_LISTVIEW); } void MediaLibraryInterface::ListViewShowSort(int token, BOOL show) { LV_SKIN_SHOWSORT lvs = {0}; lvs.listView = token; lvs.showSort = show; SendMessage(library, WM_ML_IPC, (WPARAM)&lvs, ML_IPC_LISTVIEW_SHOWSORT); } void MediaLibraryInterface::ListViewSort(int token, int columnIndex, BOOL ascending) { LV_SKIN_SORT lvs = {0}; lvs.listView = token; lvs.ascending = ascending; lvs.columnIndex = columnIndex; SendMessage(library, WM_ML_IPC, (WPARAM)&lvs, ML_IPC_LISTVIEW_SORT); } void MediaLibraryInterface::ListSkinUpdateView(int listSkin) { SendMessage(library, WM_ML_IPC, listSkin, ML_IPC_LISTVIEW_UPDATE); } void *MediaLibraryInterface::GetWADLGFunc(int num) { return (void *)SendMessage(library, WM_ML_IPC, (WPARAM)num, ML_IPC_SKIN_WADLG_GETFUNC); } void MediaLibraryInterface::PlayStream(wchar_t *url, bool force) { wchar_t temp[ 2048 ] = { 0 }; wchar_t *end = 0; StringCchCopyExW( temp, 2047, url, &end, 0, 0 ); if ( end ) { end[ 1 ] = 0; // double null terminate mlSendToWinampStruct send; send.type = ML_TYPE_STREAMNAMESW; send.enqueue = force ? ( 0 | 2 ) : 0; send.data = (void *)temp; SendMessage( library, WM_ML_IPC, (WPARAM)&send, ML_IPC_SENDTOWINAMP ); } } void MediaLibraryInterface::PlayStreams(std::vector &urls, bool force) { size_t totalSize = 0; std::vector::iterator itr; for (itr = urls.begin();itr != urls.end();itr++) { totalSize += lstrlenW(*itr) + 1; } totalSize++; wchar_t *sendTo = new wchar_t[totalSize]; wchar_t *ptr = sendTo; for (itr = urls.begin();itr != urls.end();itr++) { //AutoChar narrow(*itr); StringCchCopyExW(ptr, totalSize, *itr, &ptr, &totalSize, 0); ptr++; if (totalSize) totalSize--; else break; } ptr[0] = 0; mlSendToWinampStruct send; send.type = ML_TYPE_STREAMNAMESW; send.enqueue = force?(0 | 2):0; send.data = sendTo; SendMessage(library, WM_ML_IPC, (WPARAM)&send, ML_IPC_SENDTOWINAMP); delete [] sendTo; } void MediaLibraryInterface::EnqueueStream(wchar_t *url, bool force) { wchar_t temp[2048] = {0}; wchar_t *end=0; StringCchCopyExW(temp, 2047, url, &end, 0, 0); if (end) { end[1]=0; // double null terminate mlSendToWinampStruct send; send.type = ML_TYPE_STREAMNAMESW; send.enqueue = force?(1 | 2):1; send.data = (void *)temp; SendMessage(library, WM_ML_IPC, (WPARAM)&send, ML_IPC_SENDTOWINAMP); } } int MediaLibraryInterface::SkinComboBox(HWND comboBox) { return (int)(INT_PTR)SendMessage(library, WM_ML_IPC, (WPARAM)comboBox, ML_IPC_SKIN_COMBOBOX); } void MediaLibraryInterface::UnskinComboBox(int token) { SendMessage(library, WM_ML_IPC, (WPARAM)token, ML_IPC_UNSKIN_COMBOBOX); } const char *MediaLibraryInterface::GetIniDirectory() { if (!iniDirectory) { iniDirectory = (const char*)SendMessage(winamp, WM_WA_IPC, 0, IPC_GETINIDIRECTORY); if (((unsigned int)(ULONG_PTR)iniDirectory) < 65536) iniDirectory=0; } return iniDirectory; } const wchar_t *MediaLibraryInterface::GetIniDirectoryW() { if (!iniDirectoryW) { iniDirectoryW = (const wchar_t*)SendMessage(winamp, WM_WA_IPC, 0, IPC_GETINIDIRECTORYW); if (((unsigned int)(ULONG_PTR)iniDirectoryW) < 65536) iniDirectoryW=0; } return iniDirectoryW; } void MediaLibraryInterface::BuildPath(const wchar_t *pathEnd, wchar_t *path, size_t numChars) { PathCombineW(path, GetIniDirectoryW(), pathEnd); } void MediaLibraryInterface::AddToSendTo(char description[], INT_PTR context, INT_PTR unique) { mlAddToSendToStruct s; s.context = context; s.desc = description; s.user32 = unique; SendMessage(library, WM_ML_IPC, (WPARAM)&s, ML_IPC_ADDTOSENDTO); } void MediaLibraryInterface::AddToSendTo(wchar_t description[], INT_PTR context, INT_PTR unique) { mlAddToSendToStructW s; s.context = context; s.desc = description; s.user32 = unique; SendMessage(library, WM_ML_IPC, (WPARAM)&s, ML_IPC_ADDTOSENDTOW); } void MediaLibraryInterface::BranchSendTo(INT_PTR context) { mlAddToSendToStructW s = {0}; s.context = context; SendMessage(library, WM_ML_IPC, (WPARAM)&s, ML_IPC_BRANCHSENDTO); } void MediaLibraryInterface::AddToBranchSendTo(const wchar_t description[], INT_PTR context, INT_PTR unique) { mlAddToSendToStructW s; s.context = context; s.desc = const_cast(description); s.user32 = unique; SendMessage(library, WM_ML_IPC, (WPARAM)&s, ML_IPC_ADDTOBRANCH); } void MediaLibraryInterface::EndBranchSendTo(const wchar_t description[], INT_PTR context) { mlAddToSendToStructW s = {0}; s.context = context; s.desc = const_cast(description); SendMessage(library, WM_ML_IPC, (WPARAM)&s, ML_IPC_BRANCHSENDTO); } void MediaLibraryInterface::PlayFile(const wchar_t *url) { wchar_t temp[2048] = {0}; wchar_t *end=0; StringCchCopyExW(temp, 2047, url, &end, 0, 0); if (end) { end[1]=0; // double null terminate mlSendToWinampStruct send; send.type = ML_TYPE_FILENAMESW; send.enqueue = 0 | 2; send.data = (void *)temp; SendMessage(library, WM_ML_IPC, (WPARAM)&send, ML_IPC_SENDTOWINAMP); } } void MediaLibraryInterface::EnqueueFile(const wchar_t *url) { wchar_t temp[2048] = {0}; wchar_t *end=0; StringCchCopyExW(temp, 2047, url, &end, 0, 0); if (end) { end[1]=0; // double null terminate mlSendToWinampStruct send; send.type = ML_TYPE_FILENAMESW; send.enqueue = 1 | 2; send.data = (void *)temp; SendMessage(library, WM_ML_IPC, (WPARAM)&send, ML_IPC_SENDTOWINAMP); } } void MediaLibraryInterface::BuildPluginPath(const TCHAR *filename, TCHAR *path, size_t pathSize) { if (!pluginDirectory) pluginDirectory = (const char *)SendMessage(winamp, WM_WA_IPC, 0, IPC_GETPLUGINDIRECTORY); #ifdef UNICODE StringCchPrintf(path, pathSize, L"%S\\%s", pluginDirectory, filename); #else StringCchPrintf(path, pathSize, "%s\\%s", pluginDirectory, filename); #endif } void MediaLibraryInterface::AddToMediaLibrary(const char *filename) { LMDB_FILE_ADD_INFO fi = {const_cast(filename), -1, -1}; SendMessage(library, WM_ML_IPC, (WPARAM)&fi, ML_IPC_DB_ADDORUPDATEFILE); PostMessage(library, WM_ML_IPC, 0, ML_IPC_DB_SYNCDB); } void MediaLibraryInterface::AddToMediaLibrary(const wchar_t *filename) { LMDB_FILE_ADD_INFOW fi = {const_cast(filename), -1, -1}; SendMessage(library, WM_ML_IPC, (WPARAM)&fi, ML_IPC_DB_ADDORUPDATEFILEW); PostMessage(library, WM_ML_IPC, 0, ML_IPC_DB_SYNCDB); } IDispatch *MediaLibraryInterface::GetDispatchObject() { IDispatch *dispatch = (IDispatch *)SendMessage(winamp, WM_WA_IPC, 0, IPC_GET_DISPATCH_OBJECT); if (dispatch == (IDispatch *)1) return 0; else return dispatch; } int MediaLibraryInterface::GetUniqueDispatchId() { return (int)(INT_PTR)SendMessage(winamp, WM_WA_IPC, 0, IPC_GET_UNIQUE_DISPATCH_ID); } void MediaLibraryInterface::ListSkinDisableHorizontalScrollbar(int listSkin) { SendMessage(library, WM_ML_IPC, listSkin, ML_IPC_LISTVIEW_DISABLEHSCROLL); } DWORD MediaLibraryInterface::AddDispatch(wchar_t *name, IDispatch *object) { DispatchInfo dispatchInfo; dispatchInfo.name = name; dispatchInfo.dispatch = object; if (SendMessage(winamp, WM_WA_IPC, (WPARAM)&dispatchInfo, IPC_ADD_DISPATCH_OBJECT) == 0) return dispatchInfo.id; else return 0; } void MediaLibraryInterface::GetFileInfo(const char *filename, char *title, int titleCch, int *length) { basicFileInfoStruct infoStruct = {0}; infoStruct.filename = filename; infoStruct.title = title; infoStruct.titlelen = titleCch; SendMessage(winamp, WM_WA_IPC, (WPARAM)&infoStruct, IPC_GET_BASIC_FILE_INFO); *length = infoStruct.length; } void MediaLibraryInterface::GetFileInfo(const wchar_t *filename, wchar_t *title, int titleCch, int *p_length) { if (filename) { basicFileInfoStructW infoStruct = {0}; infoStruct.filename = filename; infoStruct.title = title; infoStruct.titlelen = titleCch; SendMessage(winamp, WM_WA_IPC, (WPARAM)&infoStruct, IPC_GET_BASIC_FILE_INFOW); if ( p_length != NULL ) *p_length = infoStruct.length; } else { title[0] = 0; *p_length = -1; } } const char *MediaLibraryInterface::GetWinampIni() { if (winampIni && *winampIni) return winampIni; winampIni = (const char *)SendMessage(winamp, WM_WA_IPC, 0, IPC_GETINIFILE); return winampIni; } const wchar_t *MediaLibraryInterface::GetWinampIniW() { if (winampIniW && *winampIniW) return winampIniW; winampIniW = (const wchar_t *)SendMessage(winamp, WM_WA_IPC, 0, IPC_GETINIFILEW); return winampIniW; } INT_PTR MediaLibraryInterface::GetChildId(INT_PTR id) { return SendMessage(library, WM_ML_IPC, id, ML_IPC_TREEITEM_GETCHILD_ID); } INT_PTR MediaLibraryInterface::GetNextId(INT_PTR id) { return SendMessage(library, WM_ML_IPC, id, ML_IPC_TREEITEM_GETNEXT_ID); } void MediaLibraryInterface::RenameTreeId(INT_PTR treeId, const wchar_t *newName) { MLTREEITEMINFOW info = {0}; info.mask = MLTI_TEXT; info.item.size = sizeof(info.item); info.item.id = treeId; info.item.title = const_cast(newName); SendMessage(library, WM_ML_IPC, (WPARAM) &info, ML_IPC_TREEITEM_SETINFOW); }