1 #include "include/private/dvr/vsync_service.h" 2 3 #include <binder/Parcel.h> 4 #include <log/log.h> 5 6 namespace android { 7 namespace dvr { 8 9 status_t BnVsyncCallback::onTransact( 10 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 11 switch (code) { 12 case ON_VSYNC: { 13 CHECK_INTERFACE(IVsyncCallback, data, reply); 14 int64_t vsync_timestamp = 0; 15 status_t result = data.readInt64(&vsync_timestamp); 16 if (result != OK) { 17 ALOGE("onVsync failed to readInt64: %d", result); 18 return result; 19 } 20 onVsync(vsync_timestamp); 21 return OK; 22 } 23 default: { 24 return BBinder::onTransact(code, data, reply, flags); 25 } 26 } 27 } 28 29 class BpVsyncCallback : public BpInterface<IVsyncCallback> { 30 public: 31 explicit BpVsyncCallback(const sp<IBinder>& impl) 32 : BpInterface<IVsyncCallback>(impl) {} 33 virtual ~BpVsyncCallback() {} 34 35 virtual status_t onVsync(int64_t vsync_timestamp) { 36 Parcel data, reply; 37 status_t result = data.writeInterfaceToken( 38 IVsyncCallback::getInterfaceDescriptor()); 39 if (result != OK) { 40 ALOGE("onVsync failed to writeInterfaceToken: %d", result); 41 return result; 42 } 43 result = data.writeInt64(vsync_timestamp); 44 if (result != OK) { 45 ALOGE("onVsync failed to writeInt64: %d", result); 46 return result; 47 } 48 result = remote()->transact( 49 BnVsyncCallback::ON_VSYNC, data, &reply, TF_ONE_WAY); 50 if (result != OK) { 51 ALOGE("onVsync failed to transact: %d", result); 52 return result; 53 } 54 return result; 55 } 56 }; 57 58 IMPLEMENT_META_INTERFACE(VsyncCallback, "android.dvr.IVsyncCallback"); 59 60 61 status_t BnVsyncService::onTransact( 62 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { 63 switch (code) { 64 case REGISTER_CALLBACK: { 65 CHECK_INTERFACE(IVsyncService, data, reply); 66 sp<IBinder> callback; 67 status_t result = data.readStrongBinder(&callback); 68 if (result != OK) { 69 ALOGE("registerCallback failed to readStrongBinder: %d", result); 70 return result; 71 } 72 registerCallback(interface_cast<IVsyncCallback>(callback)); 73 return OK; 74 } 75 case UNREGISTER_CALLBACK: { 76 CHECK_INTERFACE(IVsyncService, data, reply); 77 sp<IBinder> callback; 78 status_t result = data.readStrongBinder(&callback); 79 if (result != OK) { 80 ALOGE("unregisterCallback failed to readStrongBinder: %d", result); 81 return result; 82 } 83 unregisterCallback(interface_cast<IVsyncCallback>(callback)); 84 return OK; 85 } 86 default: { 87 return BBinder::onTransact(code, data, reply, flags); 88 } 89 } 90 } 91 92 class BpVsyncService : public BpInterface<IVsyncService> { 93 public: 94 explicit BpVsyncService(const sp<IBinder>& impl) 95 : BpInterface<IVsyncService>(impl) {} 96 virtual ~BpVsyncService() {} 97 98 virtual status_t registerCallback(const sp<IVsyncCallback> callback) { 99 Parcel data, reply; 100 status_t result = data.writeInterfaceToken( 101 IVsyncService::getInterfaceDescriptor()); 102 if (result != OK) { 103 ALOGE("registerCallback failed to writeInterfaceToken: %d", result); 104 return result; 105 } 106 result = data.writeStrongBinder(IInterface::asBinder(callback)); 107 if (result != OK) { 108 ALOGE("registerCallback failed to writeStrongBinder: %d", result); 109 return result; 110 } 111 result = remote()->transact( 112 BnVsyncService::REGISTER_CALLBACK, data, &reply); 113 if (result != OK) { 114 ALOGE("registerCallback failed to transact: %d", result); 115 return result; 116 } 117 return result; 118 } 119 120 virtual status_t unregisterCallback(const sp<IVsyncCallback> callback) { 121 Parcel data, reply; 122 status_t result = data.writeInterfaceToken( 123 IVsyncService::getInterfaceDescriptor()); 124 if (result != OK) { 125 ALOGE("unregisterCallback failed to writeInterfaceToken: %d", result); 126 return result; 127 } 128 result = data.writeStrongBinder(IInterface::asBinder(callback)); 129 if (result != OK) { 130 ALOGE("unregisterCallback failed to writeStrongBinder: %d", result); 131 return result; 132 } 133 result = remote()->transact( 134 BnVsyncService::UNREGISTER_CALLBACK, data, &reply); 135 if (result != OK) { 136 ALOGE("unregisterCallback failed to transact: %d", result); 137 return result; 138 } 139 return result; 140 } 141 }; 142 143 IMPLEMENT_META_INTERFACE(VsyncService, "android.dvr.IVsyncService"); 144 145 } // namespace dvr 146 } // namespace android 147