#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, TF_ONE_WAY); 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