aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_mkv/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_mkv/main.cpp')
-rw-r--r--Src/Plugins/Input/in_mkv/main.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_mkv/main.cpp b/Src/Plugins/Input/in_mkv/main.cpp
new file mode 100644
index 00000000..6db55f9f
--- /dev/null
+++ b/Src/Plugins/Input/in_mkv/main.cpp
@@ -0,0 +1,242 @@
+#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;
+} \ No newline at end of file