123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- #include "../Winamp/in2.h"
- #include "api__in_mkv.h"
- #include "MKVInfo.h"
- #include "../Winamp/wa_ipc.h"
- #include "main.h"
- #include "MKVPlayer.h"
- #include "MKVDuration.h"
- #include "../nu/ns_wc.h"
- #include "resource.h"
- #include <strsafe.h>
- #define MKV_PLUGIN_VERSION L"0.86"
- static wchar_t pluginName[256] = {0};
- int g_duration=0;
- int paused = 0;
- static HANDLE play_thread = 0;
- static MKVPlayer *player = 0;
- // {B6CB4A7C-A8D0-4c55-8E60-9F7A7A23DA0F}
- static const GUID playbackConfigGroupGUID =
- {
- 0xb6cb4a7c, 0xa8d0, 0x4c55, { 0x8e, 0x60, 0x9f, 0x7a, 0x7a, 0x23, 0xda, 0xf }
- };
- void SetFileExtensions(void)
- {
- static char fileExtensionsString[256] = {0}; // "MKV\0Matroska Video (MKV)\0"
- char* end = 0;
- size_t remaining;
- StringCchCopyExA(fileExtensionsString, 255, "MKV", &end, &remaining, 0);
- StringCchCopyExA(end+1, remaining-1, WASABI_API_LNGSTRING(IDS_MKV_DESC), &end, &remaining, 0);
- StringCchCopyExA(end+1, remaining-1, "webm", &end, &remaining, 0);
- StringCchCopyExA(end+1, remaining-1, WASABI_API_LNGSTRING(IDS_WEBM_DESC), &end, &remaining, 0);
- plugin.FileExtensions = fileExtensionsString;
- }
- static int DoAboutMessageBox(HWND parent, wchar_t* title, wchar_t* message)
- {
- MSGBOXPARAMS msgbx = {sizeof(MSGBOXPARAMS),0};
- msgbx.lpszText = message;
- msgbx.lpszCaption = title;
- msgbx.lpszIcon = MAKEINTRESOURCE(102);
- msgbx.hInstance = GetModuleHandle(0);
- msgbx.dwStyle = MB_USERICON;
- msgbx.hwndOwner = parent;
- return MessageBoxIndirect(&msgbx);
- }
- void About(HWND hwndParent)
- {
- wchar_t message[1024] = {0}, text[1024] = {0};
- WASABI_API_LNGSTRINGW_BUF(IDS_NULLSOFT_MKV_OLD,text,1024);
- StringCchPrintf(message, 1024, WASABI_API_LNGSTRINGW(IDS_ABOUT_TEXT),
- plugin.description, TEXT(__DATE__));
- DoAboutMessageBox(hwndParent,text,message);
- }
- int Init()
- {
- if (!IsWindow(plugin.hMainWindow))
- return IN_INIT_FAILURE;
- WasabiInit();
- StringCchPrintfW(pluginName,256,WASABI_API_LNGSTRINGW(IDS_NULLSOFT_MKV),MKV_PLUGIN_VERSION);
- plugin.description = (char*)pluginName;
- SetFileExtensions();
- return IN_INIT_SUCCESS;
- }
- void Quit()
- {
- WasabiQuit();
- }
- void GetFileInfo(const wchar_t *file, wchar_t *title, int *length_in_ms)
- {
- if (title)
- *title=0;
- if (length_in_ms)
- {
- if (file && *file)
- {
- MKVDuration duration;
- if (duration.Open(file))
- {
- if (title)
- {
- const char *mkv_title = duration.GetTitle();
- if (mkv_title)
- MultiByteToWideCharSZ(CP_UTF8, 0, mkv_title, -1, title, GETFILEINFO_TITLE_LENGTH);
- }
- *length_in_ms=duration.GetLengthMilliseconds();
- }
- else
- *length_in_ms=-1000;
- }
- else
- *length_in_ms = g_duration;
- }
- }
- int InfoBox(const wchar_t *file, HWND hwndParent)
- {
- MKVInfo info;
- if (info.Open(file))
- {
- WASABI_API_DIALOGBOXPARAMW(IDD_INFODIALOG, hwndParent, InfoDialog, (LPARAM)&info);
- }
- return INFOBOX_UNCHANGED;
- }
- int IsOurFile(const wchar_t *fn)
- {
- return 0;
- }
- DWORD CALLBACK MKVThread(LPVOID param);
- int Play(const wchar_t *fn) // return zero on success, -1 on file-not-found, some other value on other (stopping winamp) error
- {
- g_duration=-1000;
- delete player;
- player = new MKVPlayer(fn);
- play_thread = CreateThread(0, 0, MKVThread, player, 0, 0);
- SetThreadPriority(play_thread, (int)AGAVE_API_CONFIG->GetInt(playbackConfigGroupGUID, L"priority", THREAD_PRIORITY_HIGHEST));
- return 0; // success
- }
- void Pause()
- {
- paused = 1;
- plugin.outMod->Pause(1);
- }
- void UnPause()
- {
- paused = 0;
- plugin.outMod->Pause(0);
- }
- int IsPaused()
- {
- return paused;
- }
- void Stop()
- {
- if (player)
- {
- player->Kill();
- if (play_thread) {
- WaitForSingleObject(play_thread, INFINITE);
- }
- play_thread = 0;
- delete player;
- player=0;
- }
- }
- // time stuff
- int GetLength()
- {
- return g_duration;
- }
- int GetOutputTime()
- {
- if (plugin.outMod && player)
- return player->GetOutputTime();
- else
- return 0;
- }
- void SetOutputTime(int time_in_ms)
- {
- if (player)
- player->Seek(time_in_ms);
- }
- void SetVolume(int volume)
- {
- plugin.outMod->SetVolume(volume);
- }
- void SetPan(int pan)
- {
- plugin.outMod->SetPan(pan);
- }
- void EQSet(int on, char data[10], int preamp)
- {
- }
- In_Module plugin =
- {
- IN_VER_RET,
- "nullsoft(in_mkv.dll)",
- NULL, // hMainWindow
- NULL, // hDllInstance
- 0 /*"mkv\0Matroska Video\0"*/,
- 1, // is seekable
- IN_MODULE_FLAG_USES_OUTPUT_PLUGIN, //UsesOutputPlug
- About,
- About,
- Init,
- Quit,
- GetFileInfo,
- InfoBox,
- IsOurFile,
- Play,
- Pause,
- UnPause,
- IsPaused,
- Stop,
- GetLength,
- GetOutputTime,
- SetOutputTime,
- SetVolume,
- SetPan,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- EQSet,
- 0,
- 0
- };
- extern "C" __declspec(dllexport) In_Module * winampGetInModule2()
- {
- return &plugin;
- }
|