| #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 |