winamp/Src/Plugins/Library/ml_rg/main.h
2024-09-24 14:54:57 +02:00

146 lines
3.5 KiB
C++

#ifndef NULLSOFT_ML_RG_MAIN_H
#define NULLSOFT_ML_RG_MAIN_H
#include <windows.h>
#include "../../General/gen_ml/ml.h"
#include <windowsx.h>
#include "../winamp/wa_ipc.h"
#include "../../General/gen_ml/ml.h"
#include "resource.h"
#include <string>
#include <vector>
#include <map>
extern winampMediaLibraryPlugin plugin;
extern char *iniFile;
LRESULT SetFileInfo(const wchar_t *filename, const wchar_t *metadata, const wchar_t *data);
int GetFileInfo(const wchar_t *filename, const wchar_t *metadata, wchar_t *dest, int len);
void WriteFileInfo();
void TagUpdated(const wchar_t *filename);
struct RGWorkFile
{
RGWorkFile(const wchar_t *_filename=0)
{
if (_filename)
lstrcpynW(filename, _filename, MAX_PATH);
else
filename[0]=0;
track_gain[0]=0;
track_peak[0]=0;
album_gain[0]=0;
album_peak[0]=0;
}
wchar_t filename[MAX_PATH];
wchar_t track_gain[64];
wchar_t track_peak[64];
wchar_t album_gain[64];
wchar_t album_peak[64];
};
class ProgressCallback;
class WorkQueue
{
public:
WorkQueue() : totalFiles(0){}
void Add(const wchar_t *filename);
void Calculate(ProgressCallback *callback, int *killSwitch);
typedef std::vector<RGWorkFile> RGWorkQueue;
typedef std::map<std::wstring, RGWorkQueue> AlbumMap;
AlbumMap albums;
RGWorkQueue unclassified;
size_t totalFiles;
};
constexpr auto TIME_SPAN_MS = 10;
class ProgressCallback
{
public:
ProgressCallback(HWND _c)
: callback(_c),
totalReceived(0)
{
ticks = GetTickCount64();
}
void InformSize(size_t bytes)
{
if (!PostMessage(callback, WM_USER + 3, 0, bytes))
{
// LOG the error
DWORD e = GetLastError();
}
}
/// <summary>
/// This function may fire an "ERROR_NOT_ENOUGH_QUOTA" 1816 (0x718) error when the limit is hit!
/// Put some throttle here, post message every 10 ms, not each time we receive a progress.
/// </summary>
/// <param name="bytes"></param>
void Progress(size_t bytes)
{
totalReceived += bytes;
ULONGLONG currentTicks = GetTickCount64();
if (currentTicks - ticks >= TIME_SPAN_MS)
{
ticks = currentTicks;
if (!PostMessage(callback, WM_USER + 4, 0, totalReceived))
{
// LOG the error
DWORD e = GetLastError();
}
totalReceived = 0;
}
}
void FileFinished()
{
// notify remaining bytes
if (totalReceived)
{
PostMessage(callback, WM_USER + 4, 0, totalReceived);
totalReceived = 0;
}
if(!PostMessage(callback, WM_USER, 0, 0))
{
// LOG the error
DWORD e = GetLastError();
}
}
void AlbumFinished(WorkQueue::RGWorkQueue *album)
{
if(!PostMessage(callback, WM_USER + 1, 0, (LPARAM)album))
{
// LOG the error
DWORD e = GetLastError();
}
}
HWND callback;
ULONGLONG ticks;
size_t totalReceived;
};
void CopyAlbumData(WorkQueue::RGWorkQueue &workQueue, const wchar_t *album_gain, const wchar_t *album_peak);
void WriteAlbum(WorkQueue::RGWorkQueue &workQueue);
void WriteTracks(WorkQueue::RGWorkQueue &workQueue);
void DoResults(WorkQueue::RGWorkQueue &queue);
void DoResults(WorkQueue &queue);
void DoProgress(WorkQueue &workQueue);
void DestroyRG(void *context);
void *CreateRG();
void CalculateAlbumRG(void *context, wchar_t album_gain[64], wchar_t album_peak[64], float &albumPeak);
void StartRG(void *context);
void CalculateRG(void *context, const wchar_t *filename, wchar_t track_gain[64], wchar_t track_peak[64], ProgressCallback *callback, int *killSwitch, float &albumPeak);
HWND GetDialogBoxParent();
BOOL windowOffScreen(HWND hwnd, POINT pt);
extern int config_ask, config_ask_each_album, config_ignore_gained_album;
INT_PTR WINAPI RGConfig(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
#endif