winamp/Src/burnlib/item.h
2024-09-24 14:54:57 +02:00

105 lines
3.4 KiB
C++

#pragma once
#include "./main.h"
#include "../Agave/DecodeFile/api_decodefile.h"
#include "../Agave/DecodeFile/ifc_audiostream.h"
#include "./manager.h"
//#include "../primo/obj_primo.h"
#define BURNERITEM_SUCCESS 0x0000
#define BURNERITEM_STATUS 0x0000
#define BURNERITEM_ERROR 0x1000
// states
#define BURNERITEM_SKIPPED 0x0100
#define BURNERITEM_READY 0x0101
#define BURNERITEM_LICENSING 0x0102
#define BURNERITEM_LICENSED 0x0103
#define BURNERITEM_DECODING 0x0104
#define BURNERITEM_DECODED 0x0105
#define BURNERITEM_BURNING 0x0106
#define BURNERITEM_BURNED 0x0107
// error codes
#define BURNERITEM_FAILED ((BURNERITEM_ERROR) + 0x001)
#define BURNERITEM_BADFILENAME ((BURNERITEM_ERROR) + 0x002)
#define BURNERITEM_UNABLEOPENFILE ((BURNERITEM_ERROR) + 0x003)
#define BURNERITEM_WRITEERROR ((BURNERITEM_ERROR) + 0x004)
#define BURNERITEM_DECODEERROR ((BURNERITEM_ERROR) + 0x005)
#define BURNERITEM_ALREADYCREATED ((BURNERITEM_ERROR) + 0x006)
#define BURNERITEM_ADDSTREAMFAILED ((BURNERITEM_ERROR) + 0x007)
#define BURNERITEM_READSTREAMERROR ((BURNERITEM_ERROR) + 0x008)
#define BURNERITEM_ABORTED ((BURNERITEM_ERROR) + 0x009)
#define BURNERITEM_CANCELING ((BURNERITEM_ERROR) + 0x00A)
// statuses
#define BURNERITEM_DECODESTARTING ((BURNERITEM_STATUS) + 0x001)
#define BURNERITEM_DECODEPROGRESS ((BURNERITEM_STATUS) + 0x002)
#define BURNERITEM_DECODECANCELING ((BURNERITEM_STATUS) + 0x003)
#define BURNERITEM_DECODEFINISHED ((BURNERITEM_STATUS) + 0x004)
// callback returns
#define BURNERITEM_CONTINUE 0
#define BURNERITEM_STOP 1
typedef DWORD (WINAPI *BURNERITEMCALLBACK)(void*, void*, DWORD, DWORD); // sender, parameter, notifyCode, errorCode
#define ZEROMEM_SIZE 1024
class BurnerItem
{
friend class BurnerPlaylist;
public:
BURNLIB_API BurnerItem(void);
BURNLIB_API ~BurnerItem(void);
public:
BURNLIB_API HRESULT Create(const wchar_t *fullname, const wchar_t *title, int length);
BURNLIB_API void Destroy(void);
BURNLIB_API HRESULT Decode(BurnManager *manager, void *fileHandle, BURNERITEMCALLBACK notifyCB, void *userparam);
BURNLIB_API HRESULT AddStream(obj_primo *primoSDK, void *fileHandle);
public:
BURNLIB_API const wchar_t* GetFullName(void) { return fullname; }
BURNLIB_API const wchar_t* GetTitle(void) { return title; }
BURNLIB_API int GetLength(void) { return length; }
BURNLIB_API unsigned __int64 GetSize(void) { return sizeBytes; }
BURNLIB_API DWORD GetSizeInSectors(void) { return sizeSectors; }
BURNLIB_API unsigned int GetPreGap(void) { return preGap; }
BURNLIB_API unsigned __int8* GetISRC(void) { return ISRC; }
BURNLIB_API __int64 GetDecodedFilePosition(void) { return fposition; }
BURNLIB_API int GetStatus(DWORD *retCode); // if retCode not NULL - can return completed percentage or error code
void SetPreGap(unsigned int preGap);
void SetISRC(unsigned __int8 *ISRC);
protected:
static wchar_t* DuplicateString(void *heap, const wchar_t *source, unsigned int cchSource);
static DWORD StreamFiller(PBYTE pBuffer, DWORD dwBytesRequested, PDWORD pdwBytesWritten, PVOID pContext);
protected:
void *heap;
wchar_t *fullname;
wchar_t *title;
int length;
unsigned __int64 sizeBytes;
DWORD sizeSectors;
unsigned int preGap;
unsigned __int8 ISRC[12];
void* fhandle;
__int64 fposition;
BOOL needSetFilePos;
unsigned __int64 streamedSize;
int percentCompleted;
int itemStatus;
DWORD errorCode;
static DWORD zeroMem[ZEROMEM_SIZE];
};