1cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza/*
2cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Copyright 2013 The Android Open Source Project
3cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza *
4cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License");
5cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * you may not use this file except in compliance with the License.
6cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * You may obtain a copy of the License at
7cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza *
8cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza *      http://www.apache.org/licenses/LICENSE-2.0
9cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza *
10cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * Unless required by applicable law or agreed to in writing, software
11cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS,
12cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * See the License for the specific language governing permissions and
14cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza * limitations under the License.
15cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza */
16cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
17cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#ifndef ANDROID_DISCONNECT_WAITER_H
18cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#define ANDROID_DISCONNECT_WAITER_H
19cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
20cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <gui/IConsumerListener.h>
21cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
22cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <utils/Condition.h>
23cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#include <utils/Mutex.h>
24cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
25cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozanamespace android {
26cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
27cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// Note that GLConsumer will lose the notifications
28cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// onBuffersReleased and onFrameAvailable as there is currently
29cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// no way to forward the events.  This DisconnectWaiter will not let the
30cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// disconnect finish until finishDisconnect() is called.  It will
31cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza// also block until a disconnect is called
32cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozaclass DisconnectWaiter : public BnConsumerListener {
33cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozapublic:
34cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    DisconnectWaiter () :
35cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mWaitForDisconnect(false),
36cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mPendingFrames(0) {
37cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
38cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
39cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    void waitForFrame() {
40cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        Mutex::Autolock lock(mMutex);
41cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        while (mPendingFrames == 0) {
42cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mFrameCondition.wait(mMutex);
43cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        }
44cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mPendingFrames--;
45cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
46cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
478dc55396fc9bc425b5e2c82e76a38080f2a655ffDan Stoza    virtual void onFrameAvailable(const BufferItem& /* item */) {
48cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        Mutex::Autolock lock(mMutex);
49cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mPendingFrames++;
50cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mFrameCondition.signal();
51cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
52cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
53cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    virtual void onBuffersReleased() {
54cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        Mutex::Autolock lock(mMutex);
55cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        while (!mWaitForDisconnect) {
56cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza            mDisconnectCondition.wait(mMutex);
57cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        }
58cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
59cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
6049bfda1fbdf828a8ea63ae2c2fa25739f6e48527Jesse Hall    virtual void onSidebandStreamChanged() {}
6149bfda1fbdf828a8ea63ae2c2fa25739f6e48527Jesse Hall
62cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    void finishDisconnect() {
63cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        Mutex::Autolock lock(mMutex);
64cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mWaitForDisconnect = true;
65cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza        mDisconnectCondition.signal();
66cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    }
67cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
68cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stozaprivate:
69cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    Mutex mMutex;
70cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
71cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    bool mWaitForDisconnect;
72cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    Condition mDisconnectCondition;
73cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
74cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    int mPendingFrames;
75cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza    Condition mFrameCondition;
76cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza};
77cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
78cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza} // namespace android
79cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza
80cb1fcdedaaf95acabeac6a2d5bff423d6ca62296Dan Stoza#endif
81