AAudioThread.h revision dec33abe3739b2116ef6fbac36f7ca5d26f9d190
1dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk/*
2dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * Copyright (C) 2016 The Android Open Source Project
3dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk *
4dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * Licensed under the Apache License, Version 2.0 (the "License");
5dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * you may not use this file except in compliance with the License.
6dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * You may obtain a copy of the License at
7dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk *
8dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk *      http://www.apache.org/licenses/LICENSE-2.0
9dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk *
10dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * Unless required by applicable law or agreed to in writing, software
11dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * distributed under the License is distributed on an "AS IS" BASIS,
12dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * See the License for the specific language governing permissions and
14dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * limitations under the License.
15dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk */
16dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
17dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#ifndef OBOE_THREAD_H
18dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#define OBOE_THREAD_H
19dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
20dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#include <atomic>
21dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#include <pthread.h>
22dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
23dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#include <oboe/OboeDefinitions.h>
24dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
25dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burknamespace oboe {
26dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
27dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burkclass Runnable {
28dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burkpublic:
29dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    Runnable() {};
30dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    virtual ~Runnable() = default;
31dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
32dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    virtual void run() {}
33dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk};
34dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
35dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk/**
36dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk * Abstraction for a host thread.
37dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk */
38dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burkclass OboeThread
39dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk{
40dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burkpublic:
41dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    OboeThread();
42dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    OboeThread(Runnable *runnable);
43dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    virtual ~OboeThread() = default;
44dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
45dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    /**
46dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk     * Start the thread running.
47dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk     */
48dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    oboe_result_t start(Runnable *runnable = nullptr);
49dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
50dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    /**
51dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk     * Join the thread.
52dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk     * The caller must somehow tell the thread to exit before calling join().
53dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk     */
54dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    oboe_result_t stop();
55dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
56dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    /**
57dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk     * This will get called in the thread.
58dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk     * Override this or pass a Runnable to start().
59dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk     */
60dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    virtual void run() {};
61dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
62dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    void dispatch(); // called internally from 'C' thread wrapper
63dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
64dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burkprivate:
65dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    Runnable*                mRunnable = nullptr; // TODO make atomic with memory barrier?
66dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    bool                     mHasThread = false;
67dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk    pthread_t                mThread; // initialized in constructor
68dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
69dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk};
70dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
71dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk} /* namespace oboe */
72dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk
73dec33abe3739b2116ef6fbac36f7ca5d26f9d190Phil Burk#endif ///OBOE_THREAD_H
74