blob: dd8f2b1fc8f1486c5311ecc6483bbfc2f6ba0384 (
plain) (
blame)
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
|
#include "api.h"
#include "../nu/ServiceWatcher.h"
#include "../Agave/Component/ifc_wa5component.h"
#include <api/service/waServiceFactory.h>
#include "Factory.h"
#include "ScriptFactory.h"
Factory factory;
static ScriptFactory scriptFactory;
api_config *WASABI_API_CONFIG = 0;
api_syscb *WASABI_API_SYSCB = 0;
api_service *WASABI_API_SVC = 0;
api_maki *WASABI_API_MAKI = 0;
static ServiceWatcher serviceWatcher;
class TimerComponent : public ifc_wa5component
{
public:
void RegisterServices(api_service *service);
int RegisterServicesSafeModeOk();
void DeregisterServices(api_service *service);
protected:
RECVS_DISPATCH;
};
template <class api_t>
api_t *GetService(GUID serviceGUID)
{
waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(serviceGUID);
if (sf)
return (api_t *)sf->getInterface();
else
return 0;
}
inline void ReleaseService(GUID serviceGUID, void *service)
{
if (service)
{
waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(serviceGUID);
if (sf)
sf->releaseInterface(service);
}
}
void TimerComponent::RegisterServices(api_service *service)
{
WASABI_API_SVC = service;
WASABI_API_SYSCB = GetService<api_syscb>(syscbApiServiceGuid);
serviceWatcher.WatchWith(WASABI_API_SVC);
serviceWatcher.WatchFor(&WASABI_API_CONFIG, configApiServiceGuid);
serviceWatcher.WatchFor(&WASABI_API_MAKI, makiApiServiceGuid);
service->service_register(&factory);
service->service_register(&scriptFactory);
// register for service callbacks in case any of these don't exist yet
WASABI_API_SYSCB->syscb_registerCallback(&serviceWatcher);
}
int TimerComponent::RegisterServicesSafeModeOk()
{
return 1;
}
void TimerComponent::DeregisterServices(api_service *service)
{
service->service_deregister(&factory);
service->service_deregister(&scriptFactory);
serviceWatcher.StopWatching();
serviceWatcher.Clear();
ReleaseService(configApiServiceGuid, WASABI_API_CONFIG);
ReleaseService(syscbApiServiceGuid, WASABI_API_SYSCB);
ReleaseService(makiApiServiceGuid, WASABI_API_MAKI);
factory.Stop();
}
TimerComponent timerComponent;
extern "C" __declspec(dllexport) ifc_wa5component *GetWinamp5SystemComponent()
{
return &timerComponent;
}
#define CBCLASS TimerComponent
START_DISPATCH;
VCB(API_WA5COMPONENT_REGISTERSERVICES, RegisterServices)
CB(15, RegisterServicesSafeModeOk)
VCB(API_WA5COMPONENT_DEREEGISTERSERVICES, DeregisterServices)
END_DISPATCH;
#undef CBCLASS
|