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;
3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3472961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct ALooper : public RefBase {
3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    typedef int32_t event_id;
3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    typedef int32_t handler_id;
3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    ALooper();
3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
40a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber    // Takes effect in a subsequent call to start().
41a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber    void setName(const char *name);
42a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber
4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    handler_id registerHandler(const sp<AHandler> &handler);
4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void unregisterHandler(handler_id handlerID);
4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4642d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber    status_t start(
4742d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber            bool runOnCallingThread = false,
48348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber            bool canCallJava = false,
49348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber            int32_t priority = PRIORITY_DEFAULT
50348a8eab84f4bba76c04ca83b2f5418467aa1a48Andreas Huber            );
5142d7f83904b8a91ce33e87a44de109572679ac1fAndreas Huber
5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    status_t stop();
5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    static int64_t GetNowUs();
5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5672961230a5890071bcca436eb5630172ce84ec41Andreas Huberprotected:
5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    virtual ~ALooper();
5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5972961230a5890071bcca436eb5630172ce84ec41Andreas Huberprivate:
6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    friend struct ALooperRoster;
6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    struct Event {
6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        int64_t mWhenUs;
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        sp<AMessage> mMessage;
6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Mutex mLock;
6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Condition mQueueChangedCondition;
6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
70a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber    AString mName;
71a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber
7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    List<Event> mEventQueue;
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    struct LooperThread;
7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<LooperThread> mThread;
7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool mRunningLocally;
7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void post(const sp<AMessage> &msg, int64_t delayUs);
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool loop();
8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ALooper);
8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber};
8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif  // A_LOOPER_H_
87