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