CallbackProtector.h revision 83ac345e264c1e22b7a2f1a110b2fe92473394ec
183ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi/* 283ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 383ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * 483ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 583ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * you may not use this file except in compliance with the License. 683ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * You may obtain a copy of the License at 783ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * 883ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 983ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * 1083ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1183ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1283ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1383ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * See the License for the specific language governing permissions and 1483ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * limitations under the License. 1583ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi */ 1683ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 1783ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi#include "utils/threads.h" 1883ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 1983ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi//-------------------------------------------------------------------------------------------------- 2083ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivinamespace android { 2183ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 2283ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Triviclass AudioTrackProtector : public RefBase { 2383ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 2483ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivipublic: 2583ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi AudioTrackProtector(); 2683ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi virtual ~AudioTrackProtector(); 2783ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 2883ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi /** 2983ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * Indicates whether it's safe to enter the AudioTrack callback. It would typically return 3083ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * false if the AudioTrack is about to be destroyed 3183ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi */ 3283ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi bool enterCb(); 3383ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 3483ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi /** 3583ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * This method must be paired to each call to enterCb(), only if enterCb() returned that it is 3683ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * safe enter the callback; 3783ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi */ 3883ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi void exitCb(); 3983ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 4083ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi /** 4183ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * Called to signal the track is about to be destroyed, so whenever an AudioTrack callback is 4283ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * entered (see enterCb) it will be notified it is pointless to process the callback. This will 4383ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi * return immediately if there are no callbacks, and will block until current callbacks exit. 4483ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi */ 4583ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi void requestCbExitAndWait(); 4683ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 4783ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Triviprotected: 4883ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi Mutex mLock; 4983ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi Condition mCbExitedCondition; 5083ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 5183ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi bool mSafeToEnterCb; 5283ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 5383ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi /** Counts the number of AudioTrack callbacks actively locking the associated AudioPlayer */ 5483ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi unsigned int mCbCount; 5583ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi}; 5683ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi 5783ac345e264c1e22b7a2f1a110b2fe92473394ecJean-Michel Trivi} // namespace android 58