123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- //#define PLUGIN_NAME "Nullsoft Creative NJB Plug-in"
- #define PLUGIN_VERSION L"0.57"
- #include "NJBDevice.h"
- #include "../Winamp/wa_ipc.h"
- #define WM_PMP_NJB_DEVICE_CONNECTED (WM_USER+23)
- int init();
- void quit();
- intptr_t MessageProc(int msg, intptr_t param1, intptr_t param2, intptr_t param3);
- PMPDevicePlugin plugin = {PMPHDR_VER, 0, init, quit, MessageProc};
- LRESULT CALLBACK CallbackWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
- C_ItemList devices;
- // wasabi based services for localisation support
- api_language *WASABI_API_LNG = 0;
- HINSTANCE WASABI_API_LNG_HINST = 0, WASABI_API_ORIG_HINST = 0;
- ICTJukebox2 * m_pCTJukebox2 = NULL;
- HWND mainMessageWindow = 0;
- static bool classRegistered = 0;
- HWND CreateDummyWindow()
- {
- if (!classRegistered)
- {
- WNDCLASSW wc = {0, };
- wc.style = 0;
- wc.lpfnWndProc = CallbackWndProc;
- wc.hInstance = plugin.hDllInstance;
- wc.hIcon = 0;
- wc.hCursor = NULL;
- wc.lpszClassName = L"pmp_njb_window";
- if (!RegisterClassW(&wc))
- return 0;
- classRegistered = true;
- }
- HWND dummy = CreateWindowW(L"pmp_njb_window", L"pmp_njb_window", 0, 0, 0, 0, 0, NULL, NULL, plugin.hDllInstance, NULL);
- return dummy;
- }
- int init()
- {
- waServiceFactory *sf = plugin.service->service_getServiceByGuid(languageApiGUID);
- if (sf) WASABI_API_LNG = reinterpret_cast<api_language*>(sf->getInterface());
- // need to have this initialised before we try to do anything with localisation features
- WASABI_API_START_LANG(plugin.hDllInstance,PmpNJBLangGUID);
- static wchar_t szDescription[256];
- swprintf(szDescription, ARRAYSIZE(szDescription),
- WASABI_API_LNGSTRINGW(IDS_NULLSOFT_CREATIVE_NJB), PLUGIN_VERSION);
- plugin.description = szDescription;
- OleInitialize(NULL);
- HRESULT hr = CoCreateInstance(CLSID_CTJukeBox2, NULL, CLSCTX_ALL, IID_ICTJukebox2, (void**) & m_pCTJukebox2);
- if (hr != S_OK) return 0;
- hr = m_pCTJukebox2->Initialize2();
- if (hr != S_OK)
- {
- m_pCTJukebox2->Release();
- m_pCTJukebox2=0;
- return 0;
- }
- mainMessageWindow = CreateDummyWindow();
- m_pCTJukebox2->SetCallbackWindow2(0, (long)mainMessageWindow);
-
- long devCount = 0;
- m_pCTJukebox2->GetDeviceCount2(&devCount);
- for (long i = 1; i <= devCount; i++)
- PostMessage(mainMessageWindow, WM_PMP_NJB_DEVICE_CONNECTED, i, 0);
- return 0;
- }
- void quit()
- {
- if (m_pCTJukebox2)
- {
- m_pCTJukebox2->ShutDown2();
- m_pCTJukebox2->Release();
- m_pCTJukebox2 = 0;
- }
- DestroyWindow(mainMessageWindow);
- OleUninitialize();
- }
- LRESULT CALLBACK CallbackWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_PMP_NJB_DEVICE_CONNECTED:
- {
- new NJBDevice((int)wParam);
- }
- break;
- case WM_DAPSDK_JUKEBOX_REMOVAL:
- {
- long devCount = 0;
- if (m_pCTJukebox2->GetDeviceCount2(&devCount) == S_OK)
- {
- if (devCount == 0) // TODO benski> shouldn't we always register for messages?
- m_pCTJukebox2->SetCallbackWindow2(0, (long)mainMessageWindow);
- for (long i = 0; i < devices.GetSize(); /*i++*/)
- {
- NJBDevice * dev = (NJBDevice *)devices.Get(i);
- bool attached = false;
- for (long j = 1; j <= devCount; j++)
- {
- BYTE * ptr = NULL;
- if (m_pCTJukebox2->GetDeviceProperties(j, kDeviceSerialNumberValue, (IUnknown*)ptr) == S_OK)
- {
- if (memcmp(ptr, dev->serial, 16) == 0)
- {
- attached = true;
- dev->id = j;
- break;
- }
- //free(ptr);
- }
- }
- if (!attached)
- {
- SendMessage(plugin.hwndPortablesParent,WM_PMP_IPC,(intptr_t)dev,PMP_IPC_DEVICEDISCONNECTED);
- delete dev;
- }
- else
- i++;
- }
- }
- }
- break;
- case WM_DAPSDK_JUKEBOX_ARRIVAL:
- {
- long devCount = 0;
- if (m_pCTJukebox2->GetDeviceCount2(&devCount) == S_OK)
- new NJBDevice(devCount);
- }
- break;
- default:
- {
- for (int i = 0; i < devices.GetSize(); i++)
- {
- NJBDevice * dev = (NJBDevice *)devices.Get(i);
- if (dev->messageWindow == hwnd)
- return dev->WindowMessage(hwnd, uMsg, wParam, lParam);
- }
- }
- }
- return DefWindowProc(hwnd, uMsg, wParam, lParam);;
- }
- intptr_t MessageProc(int msg, intptr_t param1, intptr_t param2, intptr_t param3) {
- switch(msg) {
- case PMP_DEVICECHANGE:
- return 0;
- case PMP_NO_CONFIG:
- return TRUE;
- case PMP_CONFIG:
- return 0;
- }
- return 0;
- }
- extern "C" {
- __declspec( dllexport ) PMPDevicePlugin * winampGetPMPDevicePlugin(){return &plugin;}
- __declspec( dllexport ) int winampUninstallPlugin(HINSTANCE hDllInst, HWND hwndDlg, int param) {
- int i = devices.GetSize();
- while(i-- > 0) ((Device*)devices.Get(i))->Close();
- return PMP_PLUGIN_UNINSTALL_NOW;
- }
- };
|