127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/* 227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project 327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License. 627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at 727c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 827c174483a8ae9688d5d4897c19074f62c7f1701James Dong * http://www.apache.org/licenses/LICENSE-2.0 927c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software 1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and 1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License. 1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */ 1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong 1714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber//#define LOG_NDEBUG 0 1814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#define LOG_TAG "AHierarchicalStateMachine" 1914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include <utils/Log.h> 2014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AHierarchicalStateMachine.h> 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Vector.h> 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 27f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 29f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAState::AState(const sp<AState> &parentState) 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : mParentState(parentState) { 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAState::~AState() { 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 36f933441648ef6a71dee783d733aac17b9508b452Andreas Hubersp<AState> AState::parentState() { 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mParentState; 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AState::stateEntered() { 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AState::stateExited() { 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAHierarchicalStateMachine::AHierarchicalStateMachine() { 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51f933441648ef6a71dee783d733aac17b9508b452Andreas HuberAHierarchicalStateMachine::~AHierarchicalStateMachine() { 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5405ca3bfb847ff3c1980f2f0922a4d494c0e7ebabLajos Molnarvoid AHierarchicalStateMachine::handleMessage(const sp<AMessage> &msg) { 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AState> save = mState; 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AState> cur = mState; 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (cur != NULL && !cur->onMessageReceived(msg)) { 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If you claim not to have handled the message you shouldn't 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // have called setState... 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(save == mState); 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cur = cur->parentState(); 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (cur != NULL) { 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 705ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Warning message %s unhandled in root state.", 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->debugString().c_str()); 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid AHierarchicalStateMachine::changeState(const sp<AState> &state) { 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (state == mState) { 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Quick exit for the easy case. 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Vector<sp<AState> > A; 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AState> cur = mState; 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber A.push(cur); 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (cur == NULL) { 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cur = cur->parentState(); 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber Vector<sp<AState> > B; 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cur = state; 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber B.push(cur); 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (cur == NULL) { 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cur = cur->parentState(); 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Remove the common tail. 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (A.size() > 0 && B.size() > 0 && A.top() == B.top()) { 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber A.pop(); 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber B.pop(); 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mState = state; 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < A.size(); ++i) { 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber A.editItemAt(i)->stateExited(); 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 112938e2b34b16c3c1fd29c753eeb53ee95a2b2e2b3Nick Kralevich for (size_t i = B.size(); i > 0;) { 113938e2b34b16c3c1fd29c753eeb53ee95a2b2e2b3Nick Kralevich i--; 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber B.editItemAt(i)->stateEntered(); 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 119