1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include <gui/IConsumerListener.h> 18 19#include <gui/BufferItem.h> 20 21namespace android { 22 23namespace { // Anonymous 24 25enum class Tag : uint32_t { 26 ON_DISCONNECT = IBinder::FIRST_CALL_TRANSACTION, 27 ON_FRAME_AVAILABLE, 28 ON_FRAME_REPLACED, 29 ON_BUFFERS_RELEASED, 30 ON_SIDEBAND_STREAM_CHANGED, 31 LAST = ON_SIDEBAND_STREAM_CHANGED, 32}; 33 34} // Anonymous namespace 35 36class BpConsumerListener : public SafeBpInterface<IConsumerListener> { 37public: 38 explicit BpConsumerListener(const sp<IBinder>& impl) 39 : SafeBpInterface<IConsumerListener>(impl, "BpConsumerListener") {} 40 41 ~BpConsumerListener() override; 42 43 void onDisconnect() override { 44 callRemoteAsync<decltype(&IConsumerListener::onDisconnect)>(Tag::ON_DISCONNECT); 45 } 46 47 void onFrameAvailable(const BufferItem& item) override { 48 callRemoteAsync<decltype(&IConsumerListener::onFrameAvailable)>(Tag::ON_FRAME_AVAILABLE, 49 item); 50 } 51 52 void onFrameReplaced(const BufferItem& item) override { 53 callRemoteAsync<decltype(&IConsumerListener::onFrameReplaced)>(Tag::ON_FRAME_REPLACED, 54 item); 55 } 56 57 void onBuffersReleased() override { 58 callRemoteAsync<decltype(&IConsumerListener::onBuffersReleased)>(Tag::ON_BUFFERS_RELEASED); 59 } 60 61 void onSidebandStreamChanged() override { 62 callRemoteAsync<decltype(&IConsumerListener::onSidebandStreamChanged)>( 63 Tag::ON_SIDEBAND_STREAM_CHANGED); 64 } 65 66 void addAndGetFrameTimestamps(const NewFrameEventsEntry* /*newTimestamps*/, 67 FrameEventHistoryDelta* /*outDelta*/) override { 68 LOG_ALWAYS_FATAL("IConsumerListener::addAndGetFrameTimestamps cannot be proxied"); 69 } 70}; 71 72// Out-of-line virtual method definitions to trigger vtable emission in this translation unit (see 73// clang warning -Wweak-vtables) 74BpConsumerListener::~BpConsumerListener() = default; 75ConsumerListener::~ConsumerListener() = default; 76 77IMPLEMENT_META_INTERFACE(ConsumerListener, "android.gui.IConsumerListener"); 78 79status_t BnConsumerListener::onTransact(uint32_t code, const Parcel& data, Parcel* reply, 80 uint32_t flags) { 81 if (code < IBinder::FIRST_CALL_TRANSACTION || code > static_cast<uint32_t>(Tag::LAST)) { 82 return BBinder::onTransact(code, data, reply, flags); 83 } 84 auto tag = static_cast<Tag>(code); 85 switch (tag) { 86 case Tag::ON_DISCONNECT: 87 return callLocalAsync(data, reply, &IConsumerListener::onDisconnect); 88 case Tag::ON_FRAME_AVAILABLE: 89 return callLocalAsync(data, reply, &IConsumerListener::onFrameAvailable); 90 case Tag::ON_FRAME_REPLACED: 91 return callLocalAsync(data, reply, &IConsumerListener::onFrameReplaced); 92 case Tag::ON_BUFFERS_RELEASED: 93 return callLocalAsync(data, reply, &IConsumerListener::onBuffersReleased); 94 case Tag::ON_SIDEBAND_STREAM_CHANGED: 95 return callLocalAsync(data, reply, &IConsumerListener::onSidebandStreamChanged); 96 } 97} 98 99} // namespace android 100