You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.4 KiB
147 lines
4.4 KiB
4 months ago
|
#include "include/private/dvr/vsync_service.h"
|
||
|
|
||
|
#include <binder/Parcel.h>
|
||
|
#include <log/log.h>
|
||
|
|
||
|
namespace android {
|
||
|
namespace dvr {
|
||
|
|
||
|
status_t BnVsyncCallback::onTransact(
|
||
|
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
|
||
|
switch (code) {
|
||
|
case ON_VSYNC: {
|
||
|
CHECK_INTERFACE(IVsyncCallback, data, reply);
|
||
|
int64_t vsync_timestamp = 0;
|
||
|
status_t result = data.readInt64(&vsync_timestamp);
|
||
|
if (result != OK) {
|
||
|
ALOGE("onVsync failed to readInt64: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
onVsync(vsync_timestamp);
|
||
|
return OK;
|
||
|
}
|
||
|
default: {
|
||
|
return BBinder::onTransact(code, data, reply, flags);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class BpVsyncCallback : public BpInterface<IVsyncCallback> {
|
||
|
public:
|
||
|
explicit BpVsyncCallback(const sp<IBinder>& impl)
|
||
|
: BpInterface<IVsyncCallback>(impl) {}
|
||
|
virtual ~BpVsyncCallback() {}
|
||
|
|
||
|
virtual status_t onVsync(int64_t vsync_timestamp) {
|
||
|
Parcel data, reply;
|
||
|
status_t result = data.writeInterfaceToken(
|
||
|
IVsyncCallback::getInterfaceDescriptor());
|
||
|
if (result != OK) {
|
||
|
ALOGE("onVsync failed to writeInterfaceToken: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
result = data.writeInt64(vsync_timestamp);
|
||
|
if (result != OK) {
|
||
|
ALOGE("onVsync failed to writeInt64: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
result = remote()->transact(BnVsyncCallback::ON_VSYNC, data, &reply,
|
||
|
IBinder::FLAG_ONEWAY);
|
||
|
if (result != OK) {
|
||
|
ALOGE("onVsync failed to transact: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
IMPLEMENT_META_INTERFACE(VsyncCallback, "android.dvr.IVsyncCallback");
|
||
|
|
||
|
|
||
|
status_t BnVsyncService::onTransact(
|
||
|
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
|
||
|
switch (code) {
|
||
|
case REGISTER_CALLBACK: {
|
||
|
CHECK_INTERFACE(IVsyncService, data, reply);
|
||
|
sp<IBinder> callback;
|
||
|
status_t result = data.readStrongBinder(&callback);
|
||
|
if (result != OK) {
|
||
|
ALOGE("registerCallback failed to readStrongBinder: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
registerCallback(interface_cast<IVsyncCallback>(callback));
|
||
|
return OK;
|
||
|
}
|
||
|
case UNREGISTER_CALLBACK: {
|
||
|
CHECK_INTERFACE(IVsyncService, data, reply);
|
||
|
sp<IBinder> callback;
|
||
|
status_t result = data.readStrongBinder(&callback);
|
||
|
if (result != OK) {
|
||
|
ALOGE("unregisterCallback failed to readStrongBinder: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
unregisterCallback(interface_cast<IVsyncCallback>(callback));
|
||
|
return OK;
|
||
|
}
|
||
|
default: {
|
||
|
return BBinder::onTransact(code, data, reply, flags);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class BpVsyncService : public BpInterface<IVsyncService> {
|
||
|
public:
|
||
|
explicit BpVsyncService(const sp<IBinder>& impl)
|
||
|
: BpInterface<IVsyncService>(impl) {}
|
||
|
virtual ~BpVsyncService() {}
|
||
|
|
||
|
virtual status_t registerCallback(const sp<IVsyncCallback> callback) {
|
||
|
Parcel data, reply;
|
||
|
status_t result = data.writeInterfaceToken(
|
||
|
IVsyncService::getInterfaceDescriptor());
|
||
|
if (result != OK) {
|
||
|
ALOGE("registerCallback failed to writeInterfaceToken: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
result = data.writeStrongBinder(IInterface::asBinder(callback));
|
||
|
if (result != OK) {
|
||
|
ALOGE("registerCallback failed to writeStrongBinder: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
result = remote()->transact(
|
||
|
BnVsyncService::REGISTER_CALLBACK, data, &reply);
|
||
|
if (result != OK) {
|
||
|
ALOGE("registerCallback failed to transact: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
virtual status_t unregisterCallback(const sp<IVsyncCallback> callback) {
|
||
|
Parcel data, reply;
|
||
|
status_t result = data.writeInterfaceToken(
|
||
|
IVsyncService::getInterfaceDescriptor());
|
||
|
if (result != OK) {
|
||
|
ALOGE("unregisterCallback failed to writeInterfaceToken: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
result = data.writeStrongBinder(IInterface::asBinder(callback));
|
||
|
if (result != OK) {
|
||
|
ALOGE("unregisterCallback failed to writeStrongBinder: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
result = remote()->transact(
|
||
|
BnVsyncService::UNREGISTER_CALLBACK, data, &reply);
|
||
|
if (result != OK) {
|
||
|
ALOGE("unregisterCallback failed to transact: %d", result);
|
||
|
return result;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
IMPLEMENT_META_INTERFACE(VsyncService, "android.dvr.IVsyncService");
|
||
|
|
||
|
} // namespace dvr
|
||
|
} // namespace android
|