17d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber/* 27d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Copyright (C) 2010 The Android Open Source Project 37d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * 47d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 57d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * you may not use this file except in compliance with the License. 67d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * You may obtain a copy of the License at 77d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * 87d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 97d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * 107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Unless required by applicable law or agreed to in writing, software 117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * See the License for the specific language governing permissions and 147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * limitations under the License. 157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber */ 167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#ifndef A_LOOPER_H_ 187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 197d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#define A_LOOPER_H_ 207d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include <media/stagefright/foundation/ABase.h> 22c4e0b70a21fadb47d70955c71fc31ce1473da925Andreas Huber#include <media/stagefright/foundation/AString.h> 237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include <utils/Errors.h> 247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include <utils/KeyedVector.h> 257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include <utils/List.h> 267d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include <utils/RefBase.h> 277d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include <utils/threads.h> 287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubernamespace android { 307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberstruct AHandler; 327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberstruct AMessage; 337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberstruct ALooper : public RefBase { 357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber typedef int32_t event_id; 367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber typedef int32_t handler_id; 377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber ALooper(); 397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 40c4e0b70a21fadb47d70955c71fc31ce1473da925Andreas Huber // Takes effect in a subsequent call to start(). 41c4e0b70a21fadb47d70955c71fc31ce1473da925Andreas Huber void setName(const char *name); 42c4e0b70a21fadb47d70955c71fc31ce1473da925Andreas Huber 437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber handler_id registerHandler(const sp<AHandler> &handler); 447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber void unregisterHandler(handler_id handlerID); 457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 464f104d99d8657fd3fef675eb2a3e84ba9f5870e4Andreas Huber status_t start( 474f104d99d8657fd3fef675eb2a3e84ba9f5870e4Andreas Huber bool runOnCallingThread = false, 484e4173b0af52bdf2b5730a5837476e400c5b2040Andreas Huber bool canCallJava = false, 494e4173b0af52bdf2b5730a5837476e400c5b2040Andreas Huber int32_t priority = PRIORITY_DEFAULT 504e4173b0af52bdf2b5730a5837476e400c5b2040Andreas Huber ); 514f104d99d8657fd3fef675eb2a3e84ba9f5870e4Andreas Huber 527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber status_t stop(); 537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber static int64_t GetNowUs(); 557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberprotected: 577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber virtual ~ALooper(); 587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberprivate: 607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber friend struct ALooperRoster; 617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber struct Event { 637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber int64_t mWhenUs; 647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber sp<AMessage> mMessage; 657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber }; 667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Mutex mLock; 687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Condition mQueueChangedCondition; 697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 70c4e0b70a21fadb47d70955c71fc31ce1473da925Andreas Huber AString mName; 71c4e0b70a21fadb47d70955c71fc31ce1473da925Andreas Huber 727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber List<Event> mEventQueue; 737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber struct LooperThread; 757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber sp<LooperThread> mThread; 767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber bool mRunningLocally; 777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber void post(const sp<AMessage> &msg, int64_t delayUs); 797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber bool loop(); 807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ALooper); 827d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}; 837d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 847d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} // namespace android 857d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 867d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#endif // A_LOOPER_H_ 87