1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
#ifndef NULLSOFT_BurnerPlaylist_HEADER
#define NULLSOFT_BurnerPlaylist_HEADER
#include "./main.h"
#include "./api.h"
#include <api/service/waServiceFactory.h>
#include "../playlist/api_playlistmanager.h"
#include "../playlist/ifc_playlistloadercallback.h"
#include "../winamp/api_decodefile.h"
#include "../nu/vector.h"
#include "./item.h"
#include "./manager.h"
#define BURNERPLAYLIST_SUCCESS 0x0000
#define BURNERPLAYLIST_STATUS 0x0000
#define BURNERPLAYLIST_ERROR 0x1000
// error codes
#define BURNERPLAYLIST_FAILED ((BURNERPLAYLIST_ERROR) + 0x001)
#define BURNERPLAYLIST_BADFILENAME ((BURNERPLAYLIST_ERROR) + 0x002)
#define BURNERPLAYLIST_UNABLEOPENFILE ((BURNERPLAYLIST_ERROR) + 0x003)
#define BURNERPLAYLIST_WRITEERROR ((BURNERPLAYLIST_ERROR) + 0x004)
#define BURNERPLAYLIST_DECODEERROR ((BURNERPLAYLIST_ERROR) + 0x005)
#define BURNERPLAYLIST_DECODESERVICEFAILED ((BURNERPLAYLIST_ERROR) + 0x006)
#define BURNERPLAYLIST_THREADCREATEFAILED ((BURNERPLAYLIST_ERROR) + 0x007)
#define BURNERPLAYLIST_NOFILES ((BURNERPLAYLIST_ERROR) + 0x008)
#define BURNERPLAYLIST_WRONGFILECOUNT ((BURNERPLAYLIST_ERROR) + 0x009)
//
#define BURNERPLAYLIST_ABORTED ((BURNERPLAYLIST_STATUS) +0x100)
#define BURNERPLAYLIST_DECODENEXTITEM ((BURNERPLAYLIST_ERROR) + 0x111)
#define BURNERPLAYLIST_DECODEITEM ((BURNERPLAYLIST_ERROR) + 0x112)
#define BURNERPLAYLIST_NEWAUDIOFAILED ((BURNERPLAYLIST_ERROR) + 0x131)
#define BURNERPLAYLIST_ADDITEMFAILED ((BURNERPLAYLIST_ERROR) + 0x132)
#define BURNERPLAYLIST_ADDITEMSKIPPED ((BURNERPLAYLIST_ERROR) + 0x133)
#define BURNERPLAYLIST_ITEMADDED ((BURNERPLAYLIST_ERROR) + 0x134)
#define BURNERPLAYLIST_BEGINBURN ((BURNERPLAYLIST_ERROR) + 0x135)
#define BURNERPLAYLIST_ENDBURN ((BURNERPLAYLIST_ERROR) + 0x136)
#define BURNERPLAYLIST_BEGINBURNFAILED ((BURNERPLAYLIST_ERROR) + 0x137)
#define BURNERPLAYLIST_ENDBURNFAILED ((BURNERPLAYLIST_ERROR) + 0x138)
#define BURNERPLAYLIST_WRITEAUDIOFAILED ((BURNERPLAYLIST_ERROR) + 0x139)
#define BURNERPLAYLIST_WRITELEADIN ((BURNERPLAYLIST_ERROR) + 0x13A)
#define BURNERPLAYLIST_WRITEDATA ((BURNERPLAYLIST_ERROR) + 0x13B)
#define BURNERPLAYLIST_WRITELEADOUT ((BURNERPLAYLIST_ERROR) + 0x13C)
#define BURNERPLAYLIST_DISCOPEN ((BURNERPLAYLIST_ERROR) + 0x13D)
#define BURNERPLAYLIST_DISCCLOSE ((BURNERPLAYLIST_ERROR) + 0x13E)
#define BURNERPLAYLIST_WRITEITEMBEGIN ((BURNERPLAYLIST_ERROR) + 0x13F)
#define BURNERPLAYLIST_WRITEITEMEND ((BURNERPLAYLIST_ERROR) + 0x140)
#define BURNERPLAYLIST_BURNFAILED ((BURNERPLAYLIST_ERROR) + 0x141)
//
#define BURNERPLAYLIST_FILENOTLICENSED ((BURNERPLAYLIST_ERROR) + 0x150)
// statuses
#define BURNERPLAYLIST_LICENSINGFINISHED ((BURNERPLAYLIST_STATUS) + 0x001)
#define BURNERPLAYLIST_LICENSINGSTARTING ((BURNERPLAYLIST_STATUS) + 0x002)
#define BURNERPLAYLIST_LICENSINGPROGRESS ((BURNERPLAYLIST_STATUS) + 0x003)
#define BURNERPLAYLIST_DECODEFINISHED ((BURNERPLAYLIST_STATUS) + 0x010)
#define BURNERPLAYLIST_DECODESTARTING ((BURNERPLAYLIST_STATUS) + 0x011)
#define BURNERPLAYLIST_DECODEPROGRESS ((BURNERPLAYLIST_STATUS) + 0x012)
#define BURNERPLAYLIST_DECODECANCELING ((BURNERPLAYLIST_STATUS) + 0x013)
#define BURNERPLAYLIST_BURNFINISHED ((BURNERPLAYLIST_STATUS) + 0x031)
#define BURNERPLAYLIST_BURNSTARTING ((BURNERPLAYLIST_STATUS) + 0x032)
#define BURNERPLAYLIST_BURNPROGRESS ((BURNERPLAYLIST_STATUS) + 0x033)
#define BURNERPLAYLIST_BURNCANCELING ((BURNERPLAYLIST_STATUS) + 0x034)
#define BURNERPLAYLIST_BURNFINISHING ((BURNERPLAYLIST_STATUS) + 0x035)
// callback returns
#define BURNERPLAYLIST_CONTINUE 0
#define BURNERPLAYLIST_STOP 1
typedef Vector<BurnerItem*> BurnerVector;
typedef struct _BPLDECODEINFO
{
BurnerItem *iInstance;
int iIndex;
DWORD iNotifyCode;
DWORD iErrorCode;
float percentCompleted;
}BPLDECODEINFO;
typedef struct _BPLRUNSTATUS
{
DWORD sCurrent;
DWORD sTotal;
BurnerItem *iInstance;
int iIndex;
float percentCompleted;
}BPLRUNSTATUS;
typedef DWORD (WINAPI *BURNERPLAYLISTCALLBACK)(void *sender, void *userparam, DWORD notifyCode, DWORD errorCode, ULONG_PTR param);
class BurnerPlaylist : private ifc_playlistloadercallback, BurnerVector, BurnManagerCallback
{
public:
BURNLIB_API BurnerPlaylist(void);
BURNLIB_API ~BurnerPlaylist(void);
BURNLIB_API HRESULT Load(const wchar_t *filename);
BURNLIB_API HRESULT CheckLicense(BURNERPLAYLISTCALLBACK notifyCB, void *userparam);
BURNLIB_API HRESULT Decode(void* hFile, BURNERPLAYLISTCALLBACK notifyCB, void *userparam, BOOL block);
BURNLIB_API HRESULT Burn(obj_primo *primoSDK, DWORD drive, DWORD maxspeed, DWORD burnFlags, void* hFile,
BURNERPLAYLISTCALLBACK notifyCB, void *userparam, BOOL block);
BURNLIB_API DWORD AddCompilationToCDDB(void);
BURNLIB_API size_t GetCount(void) { return size(); }
BURNLIB_API DWORD GetTotalLengthMS(void) { return length; }
BURNLIB_API BurnerItem* &operator[](size_t index) { return BurnerVector::at(index); }
BURNLIB_API BurnerItem* &at(size_t index) { return BurnerVector::at(index); }
BURNLIB_API DWORD GetTotalSectors(void);
BURNLIB_API BOOL SetEjectWhenDone(BOOL eject) { BOOL tmp = ejectDone; ejectDone = eject; return tmp; }
BURNLIB_API DWORD GetStatus(DWORD *retCode); // if retCode not NULL - can return completed percentage or error code
// state based calls
BURNLIB_API size_t GetStateCount(DWORD state, DWORD code);
BURNLIB_API DWORD GetStateLengthMS(DWORD state, DWORD code);
BURNLIB_API DWORD GetStateSectors(DWORD state, DWORD code);
protected:
static DWORD WINAPI DecodeWorker(void* param);
static DWORD WINAPI BurnerWorker(void* param);
void OnFile(const wchar_t *filename, const wchar_t *title, int lengthInMS, ifc_plentryinfo *info);
static DWORD WINAPI OnItemDecode(void* sender, void *param, DWORD notifyCode, DWORD errorCode);
DWORD OnNotify(DWORD notifyCode, DWORD errorCode, ULONG_PTR param);
void OnLicenseCallback(size_t numFiles, WRESULT *results);
RECVS_DISPATCH;
protected:
unsigned long length;
wchar_t tmpfullname;
obj_primo *primoSDK;
DWORD drive;
BURNERPLAYLISTCALLBACK notifyCB;
void *userparam;
HANDLE hThread;
HANDLE hFile;
BPLDECODEINFO *activeDecode;
float percentStep;
DWORD maxspeed;
DWORD burnFlags;
DWORD statusCode;
DWORD errorCode;
HANDLE evntCancel;
BOOL ejectDone;
BurnManager manager;
};
#endif //NULLSOFT_BurnerPlaylist_HEADER
|