Home | History | Annotate | Download | only in gui
      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 
     21 namespace android {
     22 
     23 namespace { // Anonymous
     24 
     25 enum 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 
     36 class BpConsumerListener : public SafeBpInterface<IConsumerListener> {
     37 public:
     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)
     74 BpConsumerListener::~BpConsumerListener() = default;
     75 ConsumerListener::~ConsumerListener() = default;
     76 
     77 IMPLEMENT_META_INTERFACE(ConsumerListener, "android.gui.IConsumerListener");
     78 
     79 status_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