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