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