|  | #include "include/private/dvr/vsync_client.h" | 
|  |  | 
|  | #include <log/log.h> | 
|  |  | 
|  | #include <pdx/default_transport/client_channel_factory.h> | 
|  | #include <private/dvr/display_protocol.h> | 
|  |  | 
|  | using android::dvr::display::VSyncProtocol; | 
|  | using android::pdx::Transaction; | 
|  |  | 
|  | namespace android { | 
|  | namespace dvr { | 
|  |  | 
|  | VSyncClient::VSyncClient(long timeout_ms) | 
|  | : BASE(pdx::default_transport::ClientChannelFactory::Create( | 
|  | VSyncProtocol::kClientPath), | 
|  | timeout_ms) {} | 
|  |  | 
|  | VSyncClient::VSyncClient() | 
|  | : BASE(pdx::default_transport::ClientChannelFactory::Create( | 
|  | VSyncProtocol::kClientPath)) {} | 
|  |  | 
|  | int VSyncClient::Wait(int64_t* timestamp_ns) { | 
|  | auto status = InvokeRemoteMethod<VSyncProtocol::Wait>(); | 
|  | if (!status) { | 
|  | ALOGE("VSyncClient::Wait: Failed to wait for vsync: %s", | 
|  | status.GetErrorMessage().c_str()); | 
|  | return -status.error(); | 
|  | } | 
|  |  | 
|  | if (timestamp_ns != nullptr) { | 
|  | *timestamp_ns = status.get(); | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int VSyncClient::GetFd() { return event_fd(); } | 
|  |  | 
|  | int VSyncClient::GetLastTimestamp(int64_t* timestamp_ns) { | 
|  | auto status = InvokeRemoteMethod<VSyncProtocol::GetLastTimestamp>(); | 
|  | if (!status) { | 
|  | ALOGE("VSyncClient::GetLastTimestamp: Failed to get vsync timestamp: %s", | 
|  | status.GetErrorMessage().c_str()); | 
|  | return -status.error(); | 
|  | } | 
|  | *timestamp_ns = status.get(); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int VSyncClient::GetSchedInfo(int64_t* vsync_period_ns, int64_t* timestamp_ns, | 
|  | uint32_t* next_vsync_count) { | 
|  | if (!vsync_period_ns || !timestamp_ns || !next_vsync_count) | 
|  | return -EINVAL; | 
|  |  | 
|  | auto status = InvokeRemoteMethod<VSyncProtocol::GetSchedInfo>(); | 
|  | if (!status) { | 
|  | ALOGE("VSyncClient::GetSchedInfo:: Failed to get warp timestamp: %s", | 
|  | status.GetErrorMessage().c_str()); | 
|  | return -status.error(); | 
|  | } | 
|  |  | 
|  | *vsync_period_ns = status.get().vsync_period_ns; | 
|  | *timestamp_ns = status.get().timestamp_ns; | 
|  | *next_vsync_count = status.get().next_vsync_count; | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int VSyncClient::Acknowledge() { | 
|  | auto status = InvokeRemoteMethod<VSyncProtocol::Acknowledge>(); | 
|  | ALOGE_IF(!status, "VSuncClient::Acknowledge: Failed to ack vsync because: %s", | 
|  | status.GetErrorMessage().c_str()); | 
|  | return ReturnStatusOrError(status); | 
|  | } | 
|  |  | 
|  | }  // namespace dvr | 
|  | }  // namespace android |