172961230a5890071bcca436eb5630172ce84ec41Andreas Huber/*
272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Copyright (C) 2010 The Android Open Source Project
372961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
572961230a5890071bcca436eb5630172ce84ec41Andreas Huber * you may not use this file except in compliance with the License.
672961230a5890071bcca436eb5630172ce84ec41Andreas Huber * You may obtain a copy of the License at
772961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
872961230a5890071bcca436eb5630172ce84ec41Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
972961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
1072961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Unless required by applicable law or agreed to in writing, software
1172961230a5890071bcca436eb5630172ce84ec41Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * See the License for the specific language governing permissions and
1472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * limitations under the License.
1572961230a5890071bcca436eb5630172ce84ec41Andreas Huber */
1672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#ifndef A_LOOPER_H_
1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define A_LOOPER_H_
2072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <media/stagefright/foundation/ABase.h>
22a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber#include <media/stagefright/foundation/AString.h>
2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <utils/Errors.h>
2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <utils/KeyedVector.h>
2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <utils/List.h>
2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <utils/RefBase.h>
2772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <utils/threads.h>
2872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2972961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android {
3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3172961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct AHandler;
3272961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct AMessage;
333f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken;
3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3572961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct ALooper : public RefBase {
3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    typedef int32_t event_id;
3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    typedef int32_t handler_id;
3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    ALooper();
4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
41a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber    // Takes effect in a subsequent call to start().
42a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber    void setName(const char *name);
43a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber
4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    handler_id registerHandler(const sp<AHandler> &handler);
4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void unregisterHandler(handler_id handlerID);
4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4742d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber    status_t start(
4842d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber            bool runOnCallingThread = false,
49348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber            bool canCallJava = false,
50348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber            int32_t priority = PRIORITY_DEFAULT
51348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber            );
5242d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber
5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    status_t stop();
5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    static int64_t GetNowUs();
5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
575804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    const char *getName() const {
585804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        return mName.c_str();
595804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    }
605804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
6172961230a5890071bcca436eb5630172ce84ec41Andreas Huberprotected:
6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    virtual ~ALooper();
6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huberprivate:
655804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    friend struct AMessage;       // post()
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    struct Event {
6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        int64_t mWhenUs;
6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        sp<AMessage> mMessage;
7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Mutex mLock;
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Condition mQueueChangedCondition;
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
75a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber    AString mName;
76a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber
7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    List<Event> mEventQueue;
7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    struct LooperThread;
8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<LooperThread> mThread;
8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool mRunningLocally;
8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
833f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // use a separate lock for reply handling, as it is always on another thread
843f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // use a central lock, however, to avoid creating a mutex for each reply
853f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    Mutex mRepliesLock;
863f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    Condition mRepliesCondition;
873f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
883f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // START --- methods used only by AMessage
893f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
903f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // posts a message on this looper with the given timeout
9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void post(const sp<AMessage> &msg, int64_t delayUs);
923f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
933f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // creates a reply token to be used with this looper
943f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> createReplyToken();
953f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // waits for a response for the reply token.  If status is OK, the response
963f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // is stored into the supplied variable.  Otherwise, it is unchanged.
973f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    status_t awaitResponse(const sp<AReplyToken> &replyToken, sp<AMessage> *response);
983f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // posts a reply for a reply token.  If the reply could be successfully posted,
993f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // it returns OK. Otherwise, it returns an error value.
1003f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    status_t postReply(const sp<AReplyToken> &replyToken, const sp<AMessage> &msg);
1013f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
1023f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // END --- methods used only by AMessage
1033f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool loop();
10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ALooper);
10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber};
10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1095804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar} // namespace android
11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif  // A_LOOPER_H_
112