16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* Redistribution and use in source and binary forms, with or without
46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* modification, are permitted provided that the following conditions are
56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* met:
66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Redistributions of source code must retain the above copyright
76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       notice, this list of conditions and the following disclaimer.
86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Redistributions in binary form must reproduce the above
96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       copyright notice, this list of conditions and the following
106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       disclaimer in the documentation and/or other materials provided
116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       with the distribution.
126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Neither the name of The Linux Foundation nor the names of its
136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       contributors may be used to endorse or promote products derived
146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       from this software without specific prior written permission.
156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*/
296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define LOG_TAG "QCameraStateMachine"
316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/Errors.h>
336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCamera2HWI.h"
346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraStateMachine.h"
356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera {
376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : smEvtProcRoutine
406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Statemachine process thread routine to handle events
426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              in different state.
436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @data    : ptr to QCameraStateMachine object
466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid *QCameraStateMachine::smEvtProcRoutine(void *data)
506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int running = 1, ret;
526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraStateMachine *pme = (QCameraStateMachine *)data;
536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ALOGD("%s: E", __func__);
556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    do {
566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        do {
576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ret = cam_sem_wait(&pme->cmd_sem);
586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (ret != 0 && errno != EINVAL) {
596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: cam_sem_wait error (%s)",
606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           __func__, strerror(errno));
616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                return NULL;
626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } while (ret != 0);
646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // we got notified about new cmd avail in cmd queue
666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // first check API cmd queue
676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        qcamera_sm_cmd_t *node = (qcamera_sm_cmd_t *)pme->api_queue.dequeue();
686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (node == NULL) {
696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // no API cmd, then check evt cmd queue
706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            node = (qcamera_sm_cmd_t *)pme->evt_queue.dequeue();
716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (node != NULL) {
736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (node->cmd) {
746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_SM_CMD_TYPE_API:
756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                pme->stateMachine(node->evt, node->evt_payload);
766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // API is in a way sync call, so evt_payload is managed by HWI
776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // no need to free payload for API
786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_SM_CMD_TYPE_EVT:
806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                pme->stateMachine(node->evt, node->evt_payload);
816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // EVT is async call, so payload need to be free after use
836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                free(node->evt_payload);
846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                node->evt_payload = NULL;
856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_SM_CMD_TYPE_EXIT:
876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                running = 0;
886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            free(node);
936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            node = NULL;
946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } while (running);
966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ALOGD("%s: X", __func__);
976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NULL;
986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraStateMachine
1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraStateMachine. Will start process thread
1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ctrl    : ptr to HWI object
1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraStateMachine::QCameraStateMachine(QCamera2HardwareInterface *ctrl) :
1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    api_queue(),
1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    evt_queue()
1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_parent = ctrl;
1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cmd_pid = 0;
1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_sem_init(&cmd_sem, 0);
1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_create(&cmd_pid,
1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   NULL,
1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   smEvtProcRoutine,
1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   this);
1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : ~QCameraStateMachine
1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: desctructor of QCameraStateMachine. Will stop process thread.
1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraStateMachine::~QCameraStateMachine()
1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (cmd_pid != 0) {
1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        qcamera_sm_cmd_t *node =
1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (NULL != node) {
1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            memset(node, 0, sizeof(qcamera_sm_cmd_t));
1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            node->cmd = QCAMERA_SM_CMD_TYPE_EXIT;
1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            api_queue.enqueue((void *)node);
1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            cam_sem_post(&cmd_sem);
1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* wait until cmd thread exits */
1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (pthread_join(cmd_pid, NULL) != 0) {
1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGD("%s: pthread dead already\n", __func__);
1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        cmd_pid = 0;
1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_sem_destroy(&cmd_sem);
1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procAPI
1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process incoming API request from framework layer.
1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt          : event to be processed
1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @api_payload  : API payload. Can be NULL if not needed.
1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procAPI(qcamera_sm_evt_enum_t evt,
1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     void *api_payload)
1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_sm_cmd_t *node =
1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == node) {
1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(node, 0, sizeof(qcamera_sm_cmd_t));
1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    node->cmd = QCAMERA_SM_CMD_TYPE_API;
1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    node->evt = evt;
1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    node->evt_payload = api_payload;
1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (api_queue.enqueue((void *)node)) {
1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        cam_sem_post(&cmd_sem);
1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_ERROR;
1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        free(node);
1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return UNKNOWN_ERROR;
1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvt
1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process incoming envent from mm-camera-interface and
1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              mm-jpeg-interface.
1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt          : event to be processed
1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt_payload  : event payload. Can be NULL if not needed.
2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvt(qcamera_sm_evt_enum_t evt,
2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     void *evt_payload)
2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_sm_cmd_t *node =
2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        (qcamera_sm_cmd_t *)malloc(sizeof(qcamera_sm_cmd_t));
2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == node) {
2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No memory for qcamera_sm_cmd_t", __func__);
2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(node, 0, sizeof(qcamera_sm_cmd_t));
2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    node->cmd = QCAMERA_SM_CMD_TYPE_EVT;
2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    node->evt = evt;
2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    node->evt_payload = evt_payload;
2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (evt_queue.enqueue((void *)node)) {
2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        cam_sem_post(&cmd_sem);
2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_ERROR;
2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        free(node);
2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return UNKNOWN_ERROR;
2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : stateMachine
2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine entry function. Depends on state,
2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              incoming event will be handled differently.
2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::stateMachine(qcamera_sm_evt_enum_t evt, void *payload)
2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (m_state) {
2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_PREVIEW_STOPPED:
2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = procEvtPreviewStoppedState(evt, payload);
2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_PREVIEW_READY:
2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = procEvtPreviewReadyState(evt, payload);
2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_PREVIEWING:
2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = procEvtPreviewingState(evt, payload);
2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = procEvtPrepareSnapshotState(evt, payload);
2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_PIC_TAKING:
2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = procEvtPicTakingState(evt, payload);
2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_RECORDING:
2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = procEvtRecordingState(evt, payload);
2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = procEvtVideoPicTakingState(evt, payload);
2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = procEvtPreviewPicTakingState(evt, payload);
2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvtPreviewStoppedState
2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine function to handle event in state of
2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              QCAMERA_SM_STATE_PREVIEW_STOPPED.
2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvtPreviewStoppedState(qcamera_sm_evt_enum_t evt,
2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                        void *payload)
2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_api_result_t result;
2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&result, 0, sizeof(qcamera_api_result_t));
2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (evt) {
2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_CALLBACKS:
3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_setcb_payload_t *setcbs =
3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_setcb_payload_t *)payload;
3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->setCallBacks(setcbs->notify_cb,
3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb,
3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb_timestamp,
3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->get_memory,
3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->user);
3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->enableMsgType(int32_t(payload));
3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->disableMsgType(int32_t(payload));
3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int enabled = m_parent->msgTypeEnabled(int32_t(payload));
3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = enabled;
3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PARAMS:
3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bool needRestart = false;
3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateParameters((char*)payload, needRestart);
3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->commitParameterChanges();
3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_GET_PARAMS:
3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.params = m_parent->getParameters();
3676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
3686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
3696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
3706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
3716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
3726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PUT_PARAMS:
3756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->putParameters((char*)payload);
3776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
3786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
3796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
3806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
3816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_PREVIEW:
3846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
3856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (m_parent->mPreviewWindow == NULL) {
3866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->preparePreview();
3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if(rc == NO_ERROR) {
3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // preview window is not set yet, move to previewReady state
3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_state = QCAMERA_SM_STATE_PREVIEW_READY;
3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                } else {
3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    ALOGE("%s: preparePreview failed",__func__);
3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->preparePreview();
3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (rc == NO_ERROR) {
3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->startPreview();
3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    if (rc != NO_ERROR) {
3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        m_parent->unpreparePreview();
3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    } else {
4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        // start preview success, move to previewing state
4016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        m_state = QCAMERA_SM_STATE_PREVIEWING;
4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    }
4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
4096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->preparePreview();
4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->startPreview();
4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (rc != NO_ERROR) {
4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_parent->unpreparePreview();
4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                } else {
4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_state = QCAMERA_SM_STATE_PREVIEWING;
4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    break;
4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_PREVIEW:
4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // no op needed here
4316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGD("%s: already in preview stopped state, do nothing", __func__);
4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = NO_ERROR;
4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RECORDING_ENABLED:
4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = NO_ERROR;
4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 0;
4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE:
4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->release();
4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->storeMetaDataInBuffers(int(payload));
4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DUMP:
4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->dump((int)payload);
4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SEND_COMMAND:
4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_command_payload_t *cmd_payload =
4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_command_payload_t *)payload;
4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->sendCommand(cmd_payload->cmd,
4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg1,
4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg2);
4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_RECORDING:
4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_RECORDING:
4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
4926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_TAKE_PICTURE:
4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
4996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_CANCEL_PICTURE:
5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // no op needed here
5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGD("%s: No ops for evt(%d) in state(%d)", __func__, evt, m_state);
5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = NO_ERROR;
5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelAutoFocus();
5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
5236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int32_t faceID = 0;
5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_reg_face_payload_t *reg_payload =
5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_reg_face_payload_t *)payload;
5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             reg_payload->config,
5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             faceID);
5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
5316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.handle = faceID;
5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
537744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
538744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        {
539744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            rc = m_parent->updateThermalLevel(
540744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    *(qcamera_thermal_level_enum_t *)&payload);
541744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        }
542744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        break;
5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_NOTIFY:
544744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        {
545744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
546744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            switch (cam_evt->server_event_type) {
547744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            case CAM_EVENT_TYPE_DAEMON_DIED:
548744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                {
549744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
550744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            CAMERA_ERROR_SERVER_DIED,
551744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            0);
552744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
553744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
554744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            default:
555744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                ALOGE("%s: Invalid internal event %d in state(%d)",
556744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                            __func__, cam_evt->server_event_type, m_state);
557744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
558744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            }
559744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        }
560744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        break;
561744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy    case QCAMERA_SM_EVT_EVT_INTERNAL:
5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvtPreviewReadyState
5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine function to handle event in state of
5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              QCAMERA_SM_STATE_PREVIEW_READY.
5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvtPreviewReadyState(qcamera_sm_evt_enum_t evt,
5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                      void *payload)
5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_api_result_t result;
5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&result, 0, sizeof(qcamera_api_result_t));
5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (evt) {
5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->setPreviewWindow((struct preview_stream_ops *)payload);
5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (m_parent->mPreviewWindow != NULL) {
5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->startPreview();
5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (rc != NO_ERROR) {
6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_parent->unpreparePreview();
6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                } else {
6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_state = QCAMERA_SM_STATE_PREVIEWING;
6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
6116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_CALLBACKS:
6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_setcb_payload_t *setcbs =
6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_setcb_payload_t *)payload;
6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->setCallBacks(setcbs->notify_cb,
6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb,
6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb_timestamp,
6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->get_memory,
6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->user);
6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->enableMsgType(int32_t(payload));
6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->disableMsgType(int32_t(payload));
6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int enabled = m_parent->msgTypeEnabled(int32_t(payload));
6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
6506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
6516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = enabled;
6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PARAMS:
6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bool needRestart = false;
6596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateParameters((char*)payload, needRestart);
6606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
6616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (needRestart) {
6626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // need restart preview for parameters to take effect
6636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_parent->unpreparePreview();
6646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // commit parameter changes to server
6656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_parent->commitParameterChanges();
6666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // prepare preview again
6676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->preparePreview();
6686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    if (rc != NO_ERROR) {
6696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
6706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    }
6716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                } else {
6726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->commitParameterChanges();
6736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_GET_PARAMS:
6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.params = m_parent->getParameters();
6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PUT_PARAMS:
6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->putParameters((char*)payload);
6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_PREVIEW:
7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // no ops here
7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_PREVIEW:
7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->unpreparePreview();
7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = 0;
7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 1;
7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RECORDING_ENABLED:
7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = 0;
7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 0;
7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->storeMetaDataInBuffers(int(payload));
7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DUMP:
7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->dump((int)payload);
7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->autoFocus();
7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelAutoFocus();
7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SEND_COMMAND:
7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_command_payload_t *cmd_payload =
7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_command_payload_t *)payload;
7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->sendCommand(cmd_payload->cmd,
7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg1,
7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg2);
7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int32_t faceID = 0;
7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_reg_face_payload_t *reg_payload =
7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_reg_face_payload_t *)payload;
7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             reg_payload->config,
7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             faceID);
7996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
8006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
8026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.handle = faceID;
8036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
8046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
8076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_RECORDING:
8086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_RECORDING:
8096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
8106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_TAKE_PICTURE:
8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_CANCEL_PICTURE:
8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
8136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE:
8146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
8166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_NOTIFY:
824744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        {
825744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
826744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            switch (cam_evt->server_event_type) {
827744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            case CAM_EVENT_TYPE_DAEMON_DIED:
828744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                {
829744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
830744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            CAMERA_ERROR_SERVER_DIED,
831744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            0);
832744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
833744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
834744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            default:
835744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                ALOGE("%s: Invalid internal event %d in state(%d)",
836744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                            __func__, cam_evt->server_event_type, m_state);
837744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
838744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            }
839744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        }
840744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        break;
841744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy    case QCAMERA_SM_EVT_EVT_INTERNAL:
8426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
8436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
8446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
8456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
8466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
8476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
8516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
8546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvtPreviewingState
8556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine function to handle event in state of
8576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              QCAMERA_SM_STATE_PREVIEWING.
8586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
8606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
8616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
8626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
8646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
8656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
8666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvtPreviewingState(qcamera_sm_evt_enum_t evt,
8686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                    void *payload)
8696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
8716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_api_result_t result;
8726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&result, 0, sizeof(qcamera_api_result_t));
8736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (evt) {
8756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
8766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Error setting preview window during previewing
8786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("Cannot set preview window when preview is running");
8796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
8806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
8816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
8826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
8846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_CALLBACKS:
8876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_setcb_payload_t *setcbs =
8896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_setcb_payload_t *)payload;
8906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->setCallBacks(setcbs->notify_cb,
8916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb,
8926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb_timestamp,
8936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->get_memory,
8946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->user);
8956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
8966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
8976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
8986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
8996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
9026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->enableMsgType(int32_t(payload));
9046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
9056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
9066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
9086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
9116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->disableMsgType(int32_t(payload));
9136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
9146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
9156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
9176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
9206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int enabled = m_parent->msgTypeEnabled(int32_t(payload));
9226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
9236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
9246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
9256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = enabled;
9266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
9276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PARAMS:
9306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bool needRestart = false;
9326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateParameters((char*)payload, needRestart);
9336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
9346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (needRestart) {
9356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // need restart preview for parameters to take effect
9366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // stop preview
9376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_parent->stopPreview();
9386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // commit parameter changes to server
9396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_parent->commitParameterChanges();
9406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // start preview again
9416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->preparePreview();
9426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    if (rc == NO_ERROR) {
9436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        rc = m_parent->startPreview();
9446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        if (rc != NO_ERROR) {
9456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            m_parent->unpreparePreview();
9466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        }
9476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    }
9486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    if (rc != NO_ERROR) {
9496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
9506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    }
9516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                } else {
9526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->commitParameterChanges();
9536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
9546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
9556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
9566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
9576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
9596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_GET_PARAMS:
9626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.params = m_parent->getParameters();
9646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
9656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
9666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
9676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
9686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
9696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PUT_PARAMS:
9726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->putParameters((char*)payload);
9746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
9756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
9766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
9786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_PREVIEW:
9816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
9826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // no ops here
9846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGD("%s: Already in previewing, no ops here to start preview", __func__);
9856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
9866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
9876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
9886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
9906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_PREVIEW:
9936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->stopPreview();
9956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
9966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
9976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
9986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
9996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
10006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
10036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
10046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
10056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
10066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
10076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
10086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 1;
10096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
10106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RECORDING_ENABLED:
10136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
10146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
10156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
10166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
10176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
10186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 0;
10196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
10206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
10236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
10246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->storeMetaDataInBuffers(int(payload));
10256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
10266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
10276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
10296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DUMP:
10326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
10336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->dump((int)payload);
10346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
10356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
10366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
10386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
10416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
10426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->autoFocus();
10436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
10446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
10456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
10476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
10506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
10516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelAutoFocus();
10526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
10536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
10546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
10566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_RECORDING:
10596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
10606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->startRecording();
10616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
10626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // move state to recording state
10636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_state = QCAMERA_SM_STATE_RECORDING;
10646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
10656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
10666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
10676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
10696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
10726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
10736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->prepareHardwareForSnapshot(FALSE);
10746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
10756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // Do not signal API result in this case.
10766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // Need to wait for snapshot done in metadta.
10776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_state = QCAMERA_SM_STATE_PREPARE_SNAPSHOT;
10786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
10796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // Do not change state in this case.
10806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: prepareHardwareForSnapshot failed %d",
10816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    __func__, rc);
10826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                result.status = rc;
10846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                result.request_api = evt;
10856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
10866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_parent->signalAPIResult(&result);
10876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
10886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
10906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_TAKE_PICTURE:
10916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev       {
1092744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy           if ( m_parent->mParameters.getRecordingHintValue() == false) {
10936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           rc = m_parent->takePicture();
10946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           if (rc == NO_ERROR) {
10956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev               // move state to picture taking state
10966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev               if (m_parent->isZSLMode()) {
10976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
10986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev               } else {
10996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   m_state = QCAMERA_SM_STATE_PIC_TAKING;
11006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev               }
11016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
11026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // move state to preview stopped state
11036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
11046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
11056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
11066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
11076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
11086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
1109744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy           } else {
1110744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy               rc = m_parent->takeLiveSnapshot();
1111744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy               if (rc == NO_ERROR ) {
1112744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                   m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
1113744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                   result.status = rc;
1114744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                   result.request_api = evt;
1115744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                   result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1116744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                   m_parent->signalAPIResult(&result);
1117744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy               }
1118744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy           }
11196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
11206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
11216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SEND_COMMAND:
11226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
11236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_command_payload_t *cmd_payload =
11246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_command_payload_t *)payload;
11256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->sendCommand(cmd_payload->cmd,
11266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg1,
11276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg2);
11286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
11296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
11306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
11316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
11326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
11336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
11346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
11356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
11366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int32_t faceID = 0;
11376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_reg_face_payload_t *reg_payload =
11386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_reg_face_payload_t *)payload;
11396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
11406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             reg_payload->config,
11416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             faceID);
11426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
11436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
11446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
11456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.handle = faceID;
11466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
11476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
11486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
11496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_CANCEL_PICTURE:
11506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_RECORDING:
11516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
11526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE:
11536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
11546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
11556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
11566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
11576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
11586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
11596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
11606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
11616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
11626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_INTERNAL:
11636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
11646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_internal_evt_payload_t *internal_evt =
11656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_internal_evt_payload_t *)payload;
11666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (internal_evt->evt_type) {
11676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
11686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
11696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
11706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
11716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: Invalid internal event %d in state(%d)",
11726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            __func__, internal_evt->evt_type, m_state);
11736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
11746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
11756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
11766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
11776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_NOTIFY:
11786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
11796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
11806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (cam_evt->server_event_type) {
1181744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            case CAM_EVENT_TYPE_DAEMON_DIED:
1182744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                {
1183744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1184744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            CAMERA_ERROR_SERVER_DIED,
1185744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            0);
1186744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
1187744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
11886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
11896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGD("%s: no handling for server evt (%d) at this state",
11906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                      __func__, cam_evt->server_event_type);
11916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
11926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
11936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
11946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
11956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
11966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
11976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateThermalLevel(
11986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    *(qcamera_thermal_level_enum_t *)&payload);
11996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
12006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
12026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
12036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
12046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
12056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
12076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
12096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
12106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
12126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvtPrepareSnapshotState
12136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine function to handle event in state of
12156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              QCAMERA_SM_STATE_PREPARE_SNAPSHOT.
12166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
12186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
12196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
12206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
12226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
12236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
12246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
12256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvtPrepareSnapshotState(qcamera_sm_evt_enum_t evt,
12266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                    void *payload)
12276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
12286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
12296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_api_result_t result;
12306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&result, 0, sizeof(qcamera_api_result_t));
12316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (evt) {
12336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
12346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_CALLBACKS:
12356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
12366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
12376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
12386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PARAMS:
12396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_GET_PARAMS:
12406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PUT_PARAMS:
12416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_PREVIEW:
12426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
12436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_PREVIEW:
12446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
12456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RECORDING_ENABLED:
12466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
12476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DUMP:
12486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
12496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
12506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_RECORDING:
12516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_TAKE_PICTURE:
12526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SEND_COMMAND:
12536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_CANCEL_PICTURE:
12546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_RECORDING:
12556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
12566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE:
12576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
12586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
12596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
12606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
12616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
12626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
12636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
12646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
12656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_INTERNAL:
12676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
12686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_internal_evt_payload_t *internal_evt =
12696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_internal_evt_payload_t *)payload;
12706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (internal_evt->evt_type) {
12716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE:
12726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGI("%s: Received QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE event",
12736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    __func__);
12746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_parent->processPrepSnapshotDoneEvent(internal_evt->prep_snapshot_state);
12756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_state = QCAMERA_SM_STATE_PREVIEWING;
12766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                result.status = NO_ERROR;
12786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                result.request_api = QCAMERA_SM_EVT_PREPARE_SNAPSHOT;
12796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
12806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_parent->signalAPIResult(&result);
12816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
12826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
12836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: Invalid internal event %d in state(%d)",
12846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            __func__, internal_evt->evt_type, m_state);
12856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
12866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
12876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
12886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_NOTIFY:
1290744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        {
1291744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
1292744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            switch (cam_evt->server_event_type) {
1293744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            case CAM_EVENT_TYPE_DAEMON_DIED:
1294744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                {
1295744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1296744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            CAMERA_ERROR_SERVER_DIED,
1297744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            0);
1298744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
1299744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
1300744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            default:
1301744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                ALOGE("%s: Invalid internal event %d in state(%d)",
1302744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                            __func__, cam_evt->server_event_type, m_state);
1303744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
1304744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            }
1305744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        }
1306744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        break;
13076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
13086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
13096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
13106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
13116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
13126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
13146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
13166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
13176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
13196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvtPicTakingState
13206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine function to handle event in state of
13226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              QCAMERA_SM_STATE_PIC_TAKING.
13236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
13256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
13266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
13276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
13296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
13306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
13316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
13326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvtPicTakingState(qcamera_sm_evt_enum_t evt,
13336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                   void *payload)
13346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
13356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
13366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_api_result_t result;
13376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&result, 0, sizeof(qcamera_api_result_t));
13386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (evt) {
13406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
13416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
13426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Error setting preview window during previewing
13436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("Cannot set preview window when preview is running");
13446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
13456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
13466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
13476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
13496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_CALLBACKS:
13526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
13536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_setcb_payload_t *setcbs =
13546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_setcb_payload_t *)payload;
13556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->setCallBacks(setcbs->notify_cb,
13566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb,
13576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb_timestamp,
13586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->get_memory,
13596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->user);
13606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
13616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
13626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
13646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
13676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
13686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->enableMsgType(int32_t(payload));
13696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
13706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
13716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
13736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
13766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
13776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->disableMsgType(int32_t(payload));
13786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
13796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
13806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
13816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
13826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
13856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
13866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int enabled = m_parent->msgTypeEnabled(int32_t(payload));
13876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
13886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
13896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
13906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = enabled;
13916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
13926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PARAMS:
13956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
13966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bool needRestart = false;
13976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateParameters((char*)payload, needRestart);
13986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
13996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->commitParameterChanges();
14006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
14016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_GET_PARAMS:
14086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.params = m_parent->getParameters();
14106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
14116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
14146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PUT_PARAMS:
14186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->putParameters((char*)payload);
14206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_PREVIEW:
14276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // cancel picture first
14296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelPicture();
14306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
14316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
14396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
14416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
14446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 0;
14456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RECORDING_ENABLED:
14496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
14516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
14546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 0;
14556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
14596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->storeMetaDataInBuffers(int(payload));
14616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DUMP:
14686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->dump((int)payload);
14706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
14776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->autoFocus();
14796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
14866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelAutoFocus();
14886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
14896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
14906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
14916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
14926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SEND_COMMAND:
14956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
14966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_command_payload_t *cmd_payload =
14976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_command_payload_t *)payload;
14986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->sendCommand(cmd_payload->cmd,
14996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg1,
15006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg2);
15016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
15026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
15036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
15046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
15056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
15076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_CANCEL_PICTURE:
15086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
15096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelPicture();
15106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
15116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
15126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
15136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
15146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
15156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
15176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
15186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
15196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int32_t faceID = 0;
15206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_reg_face_payload_t *reg_payload =
15216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_reg_face_payload_t *)payload;
15226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
15236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             reg_payload->config,
15246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             faceID);
15256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
15266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
15276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
15286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.handle = faceID;
15296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
15306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
15326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_TAKE_PICTURE:
15336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_RECORDING:
15346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_RECORDING:
15356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
15366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_PREVIEW:
15376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
15386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE:
15396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
15406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
15416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
15426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
15436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
15446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
15456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
15466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
15486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_INTERNAL:
15496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
15506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_internal_evt_payload_t *internal_evt =
15516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_internal_evt_payload_t *)payload;
15526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (internal_evt->evt_type) {
15536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
15546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
15556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
15566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
15576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
15586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
15596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
15616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_NOTIFY:
15626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
15636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
15646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (cam_evt->server_event_type) {
1565744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            case CAM_EVENT_TYPE_DAEMON_DIED:
1566744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                {
1567744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1568744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            CAMERA_ERROR_SERVER_DIED,
1569744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            0);
1570744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
1571744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
15726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
15736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGD("%s: no handling for server evt (%d) at this state",
15746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                      __func__, cam_evt->server_event_type);
15756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
15766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
15776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
15796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
15806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
15816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_jpeg_evt_payload_t *jpeg_job =
15826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_jpeg_evt_payload_t *)payload;
15836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->processJpegNotify(jpeg_job);
15846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
15866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
15876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
15886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelPicture();
15896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
1590744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.status = rc;
1591744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.request_api = evt;
1592744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
1593744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            m_parent->signalEvtResult(&result);
15946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
15966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
1597744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        {
1598744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            rc = m_parent->updateThermalLevel(
1599744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    *(qcamera_thermal_level_enum_t *)&payload);
1600744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        }
1601744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        break;
16026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
16036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
16046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
16066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
16086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
16096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
16116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvtRecordingState
16126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine function to handle event in state of
16146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              QCAMERA_SM_STATE_RECORDING.
16156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
16176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
16186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
16196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
16216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
16226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
16236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
16246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvtRecordingState(qcamera_sm_evt_enum_t evt,
16256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                   void *payload)
16266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
16276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
16286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_api_result_t result;
16296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&result, 0, sizeof(qcamera_api_result_t));
16306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (evt) {
16326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
16336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
16346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Error setting preview window during previewing
16356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("Cannot set preview window when preview is running");
16366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
16376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
16386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
16396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
16406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
16416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
16426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_CALLBACKS:
16446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
16456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_setcb_payload_t *setcbs =
16466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_setcb_payload_t *)payload;
16476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->setCallBacks(setcbs->notify_cb,
16486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb,
16496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb_timestamp,
16506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->get_memory,
16516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->user);
16526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
16536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
16546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
16556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
16566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
16576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
16596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
16606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->enableMsgType(int32_t(payload));
16616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
16626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
16636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
16646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
16656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
16666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
16686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
16696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->disableMsgType(int32_t(payload));
16706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
16716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
16726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
16736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
16746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
16756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
16776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
16786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int enabled = m_parent->msgTypeEnabled(int32_t(payload));
16796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
16806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
16816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
16826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = enabled;
16836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
16846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
16856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PARAMS:
16876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
16886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bool needRestart = false;
16896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateParameters((char*)payload, needRestart);
16906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
16916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (needRestart) {
16926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // cannot set parameters that requires restart during recording
16936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    ALOGE("%s: Cannot set parameters that requires restart during recording",
16946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          __func__);
16956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = BAD_VALUE;
16966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                } else {
16976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->commitParameterChanges();
16986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
16996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
17006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_GET_PARAMS:
17076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.params = m_parent->getParameters();
17096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
17106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
17136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PUT_PARAMS:
17176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->putParameters((char*)payload);
17196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
17266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
17286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
17316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 0;
17326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RECORDING_ENABLED:
17366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
17386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
17416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 1;
17426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
17466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->storeMetaDataInBuffers(int(payload));
17486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DUMP:
17556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->dump((int)payload);
17576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
17646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->autoFocus();
17666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
17736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelAutoFocus();
17756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SEND_COMMAND:
17826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_command_payload_t *cmd_payload =
17846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_command_payload_t *)payload;
17856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->sendCommand(cmd_payload->cmd,
17866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg1,
17876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg2);
17886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
17896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
17906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
17916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
17926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_TAKE_PICTURE:
17956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
17976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->takeLiveSnapshot();
17986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc != NO_ERROR) {
17996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_state = QCAMERA_SM_STATE_RECORDING;
18006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
18016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
18026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
18036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
18056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_RECORDING:
18086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // no ops here
18106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGD("%s: already in recording state, no ops for start_recording", __func__);
18116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = 0;
18126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
18136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
18146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
18166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_RECORDING:
18196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->stopRecording();
18216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEWING;
18226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
18236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
18246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
18266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
18296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->releaseRecordingFrame((const void *)payload);
18316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
18326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
18336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
18356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
18386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int32_t faceID = 0;
18406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_reg_face_payload_t *reg_payload =
18416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_reg_face_payload_t *)payload;
18426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
18436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             reg_payload->config,
18446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             faceID);
18456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
18466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
18476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
18486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.handle = faceID;
18496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
18506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREPARE_SNAPSHOT:
18536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            //In Video snapshot, prepare hardware is a no-op.
18556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = NO_ERROR;
18566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
18576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
18596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_CANCEL_PICTURE:
18626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_PREVIEW:
18636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
18646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_PREVIEW:
18656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE:
18666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
18686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
18696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
18706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
18716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
18726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
18736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_INTERNAL:
18766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_internal_evt_payload_t *internal_evt =
18786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_internal_evt_payload_t *)payload;
18796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (internal_evt->evt_type) {
18806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
18816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
18826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
18836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
18846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
18856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
18866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_NOTIFY:
18896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
18916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (cam_evt->server_event_type) {
1892744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            case CAM_EVENT_TYPE_DAEMON_DIED:
1893744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                {
1894744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
1895744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            CAMERA_ERROR_SERVER_DIED,
1896744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            0);
1897744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
1898744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
18996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
1900744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                ALOGE("%s: Invalid internal event %d in state(%d)",
1901744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                            __func__, cam_evt->server_event_type, m_state);
19026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
19036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
19046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
19076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
19086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateThermalLevel(
19096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    *(qcamera_thermal_level_enum_t *)&payload);
19106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
19136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
19146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
19156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
19166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
19186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
19206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
19216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
19236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvtVideoPicTakingState
19246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine function to handle event in state of
19266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              QCAMERA_SM_STATE_VIDEO_PIC_TAKING.
19276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
19296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
19306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
19316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
19336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
19346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
19356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
19366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvtVideoPicTakingState(qcamera_sm_evt_enum_t evt,
19376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                        void *payload)
19386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
19396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
19406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_api_result_t result;
19416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&result, 0, sizeof(qcamera_api_result_t));
19426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (evt) {
19446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
19456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
19466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Error setting preview window during previewing
19476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("Cannot set preview window when preview is running");
19486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
19496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
19506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
19516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
19536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_CALLBACKS:
19566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
19576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_setcb_payload_t *setcbs =
19586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_setcb_payload_t *)payload;
19596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->setCallBacks(setcbs->notify_cb,
19606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb,
19616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb_timestamp,
19626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->get_memory,
19636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->user);
19646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
19656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
19666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
19686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
19716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
19726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->enableMsgType(int32_t(payload));
19736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
19746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
19756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
19776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
19806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
19816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->disableMsgType(int32_t(payload));
19826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
19836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
19846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
19856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
19866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
19896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
19906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int enabled = m_parent->msgTypeEnabled(int32_t(payload));
19916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
19926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
19936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
19946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = enabled;
19956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
19966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PARAMS:
19996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bool needRestart = false;
20016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateParameters((char*)payload, needRestart);
20026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
20036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (needRestart) {
20046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // cannot set parameters that requires restart during recording
20056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    ALOGE("%s: Cannot set parameters that requires restart during recording",
20066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          __func__);
20076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = BAD_VALUE;
20086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                } else {
20096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->commitParameterChanges();
20106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
20116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
20126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_GET_PARAMS:
20196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.params = m_parent->getParameters();
20216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
20226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
20256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PUT_PARAMS:
20296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->putParameters((char*)payload);
20316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
20386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
20406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
20436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 1;
20446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RECORDING_ENABLED:
20486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
20506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
20536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 1;
20546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
20586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->storeMetaDataInBuffers(int(payload));
20606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DUMP:
20676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->dump((int)payload);
20696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
20766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->autoFocus();
20786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
20856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelAutoFocus();
20876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
20886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
20896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
20906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
20916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SEND_COMMAND:
20946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
20956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_command_payload_t *cmd_payload =
20966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_command_payload_t *)payload;
20976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->sendCommand(cmd_payload->cmd,
20986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg1,
20996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg2);
21006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
21016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
21026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
21046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
21056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_RECORDING:
21076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
21086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->stopRecording();
21096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEW_PIC_TAKING;
21106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
21116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
21126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
21146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
21156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
21176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
21186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->releaseRecordingFrame((const void *)payload);
21196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
21206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
21216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
21236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
21246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_CANCEL_PICTURE:
21266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
21276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelLiveSnapshot();
21286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_RECORDING;
21296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
21306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
21316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
21336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
21346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
21366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
21376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int32_t faceID = 0;
21386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_reg_face_payload_t *reg_payload =
21396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_reg_face_payload_t *)payload;
21406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
21416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             reg_payload->config,
21426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             faceID);
21436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
21446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
21456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
21466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.handle = faceID;
21476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
21486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
21496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_RECORDING:
21516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_PREVIEW:
21526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
21536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_PREVIEW:
21546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_TAKE_PICTURE:
21556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE:
21566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
21576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
21586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
21596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
21606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
21616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
21626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
21636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
21646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_INTERNAL:
21666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
21676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_internal_evt_payload_t *internal_evt =
21686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_internal_evt_payload_t *)payload;
21696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (internal_evt->evt_type) {
21706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
21716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
21726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
21736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
21746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
21756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
21766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
21776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_NOTIFY:
21796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
21806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
21816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (cam_evt->server_event_type) {
2182744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            case CAM_EVENT_TYPE_DAEMON_DIED:
2183744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                {
2184744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2185744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            CAMERA_ERROR_SERVER_DIED,
2186744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            0);
2187744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
2188744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
21896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
2190744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                ALOGE("%s: Invalid internal event %d in state(%d)",
2191744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                            __func__, cam_evt->server_event_type, m_state);
21926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
21936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
21946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
21956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
21976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
21986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_jpeg_evt_payload_t *jpeg_job =
21996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_jpeg_evt_payload_t *)payload;
22006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->processJpegNotify(jpeg_job);
22016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
22026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
22036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
22046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
22056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelLiveSnapshot();
22066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_RECORDING;
2207744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.status = rc;
2208744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.request_api = evt;
2209744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2210744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            m_parent->signalEvtResult(&result);
22116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
22126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
22136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
22146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
22156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateThermalLevel(
22166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    *(qcamera_thermal_level_enum_t *)&payload);
22176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
22186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
22196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
22206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
22216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
22226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
22236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
22256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
22266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
22286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : procEvtPreviewPicTakingState
22296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: finite state machine function to handle event in state of
22316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              QCAMERA_SM_STATE_PREVIEW_PIC_TAKING.
22326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
22346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : event to be processed
22356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @payload  : event payload. Can be NULL if not needed.
22366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
22386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
22396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
22406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
22416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraStateMachine::procEvtPreviewPicTakingState(qcamera_sm_evt_enum_t evt,
22426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                          void *payload)
22436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
22446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
22456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_api_result_t result;
22466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&result, 0, sizeof(qcamera_api_result_t));
22476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (evt) {
22496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_CALLBACKS:
22506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
22516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_setcb_payload_t *setcbs =
22526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_setcb_payload_t *)payload;
22536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->setCallBacks(setcbs->notify_cb,
22546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb,
22556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->data_cb_timestamp,
22566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->get_memory,
22576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        setcbs->user);
22586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
22596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
22606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
22616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
22626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
22636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
22646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_ENABLE_MSG_TYPE:
22656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
22666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->enableMsgType(int32_t(payload));
22676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
22686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
22696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
22706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
22716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
22726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
22736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DISABLE_MSG_TYPE:
22746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
22756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->disableMsgType(int32_t(payload));
22766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
22776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
22786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
22796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
22806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
22816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
22826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_MSG_TYPE_ENABLED:
22836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
22846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int enabled = m_parent->msgTypeEnabled(int32_t(payload));
22856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
22866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
22876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
22886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = enabled;
22896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
22906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
22916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
22926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PARAMS:
22936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
22946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bool needRestart = false;
22956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateParameters((char*)payload, needRestart);
22966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
22976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (needRestart) {
22986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // need restart preview for parameters to take effect
22996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // stop preview
23006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_parent->stopPreview();
23016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // commit parameter changes to server
23026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_parent->commitParameterChanges();
23036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    // start preview again
23046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->preparePreview();
23056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    if (rc == NO_ERROR) {
23066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        rc = m_parent->startPreview();
23076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        if (rc != NO_ERROR) {
23086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            m_parent->unpreparePreview();
23096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        }
23106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    }
23116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    if (rc != NO_ERROR) {
23126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        m_state = QCAMERA_SM_STATE_PIC_TAKING;
23136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    }
23146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                } else {
23156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    rc = m_parent->commitParameterChanges();
23166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
23176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
23186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
23216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_GET_PARAMS:
23256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
23266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.params = m_parent->getParameters();
23276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
23286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_PARAMS;
23316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PUT_PARAMS:
23356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
23366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->putParameters((char*)payload);
23376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
23406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_PREVIEW_ENABLED:
23446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
23456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
23466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
23496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 1;
23506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RECORDING_ENABLED:
23546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
23556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
23566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_ENABLE_FLAG;
23596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.enabled = 0;
23606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS:
23646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
23656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->storeMetaDataInBuffers(int(payload));
23666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
23696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_DUMP:
23736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
23746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->dump((int)payload);
23756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
23786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_AUTO_FOCUS:
23826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
23836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->autoFocus();
23846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
23876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_AUTO_FOCUS:
23916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
23926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->cancelAutoFocus();
23936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
23946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
23956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
23966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
23976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SEND_COMMAND:
24006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
24016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_command_payload_t *cmd_payload =
24026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_command_payload_t *)payload;
24036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->sendCommand(cmd_payload->cmd,
24046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg1,
24056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cmd_payload->arg2);
24066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
24076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
24086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
24106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME:
24136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
24146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->releaseRecordingFrame((const void *)payload);
24156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
24166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
24176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
24196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_CANCEL_PICTURE:
24226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
24236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (m_parent->isZSLMode()) {
24246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->cancelPicture();
24256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
24266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->cancelLiveSnapshot();
24276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
24286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEWING;
24296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
24306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
24316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
24336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_PREVIEW:
24366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
24376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (m_parent->isZSLMode()) {
24386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // cancel picture first
24396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->cancelPicture();
24406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_parent->stopChannel(QCAMERA_CH_TYPE_ZSL);
24416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
24426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->cancelLiveSnapshot();
24436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_parent->stopChannel(QCAMERA_CH_TYPE_PREVIEW);
24446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
24456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // unprepare preview
24466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->unpreparePreview();
24476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEW_STOPPED;
24486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
24496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
24506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
24526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_RECORDING:
24556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
24566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->stopRecording();
24576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
24586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_state = QCAMERA_SM_STATE_VIDEO_PIC_TAKING;
24596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
24606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
24616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
24626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
24646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_REG_FACE_IMAGE:
24676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
24686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            int32_t faceID = 0;
24696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_evt_reg_face_payload_t *reg_payload =
24706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_evt_reg_face_payload_t *)payload;
24716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->registerFaceImage(reg_payload->img_ptr,
24726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             reg_payload->config,
24736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             faceID);
24746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
24756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
24766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_HANDLE;
24776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.handle = faceID;
24786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
24796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_STOP_RECORDING:
24826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_PREVIEW:
24836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW:
24846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_TAKE_PICTURE:
24856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SET_PREVIEW_WINDOW:
24866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_RELEASE:
24876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
24886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
24896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = INVALID_OPERATION;
24906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.status = rc;
24916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.request_api = evt;
24926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
24936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_parent->signalAPIResult(&result);
24946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_INTERNAL:
24976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
24986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_sm_internal_evt_payload_t *internal_evt =
24996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_sm_internal_evt_payload_t *)payload;
25006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (internal_evt->evt_type) {
25016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            case QCAMERA_INTERNAL_EVT_FOCUS_UPDATE:
25026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->processAutoFocusEvent(internal_evt->focus_data);
25036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
25046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
25056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
25066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
25076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
25086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
25096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_EVT_NOTIFY:
25106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
25116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_camera_event_t *cam_evt = (mm_camera_event_t *)payload;
25126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            switch (cam_evt->server_event_type) {
2513744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            case CAM_EVENT_TYPE_DAEMON_DIED:
2514744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                {
2515744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    m_parent->sendEvtNotify(CAMERA_MSG_ERROR,
2516744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            CAMERA_ERROR_SERVER_DIED,
2517744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            0);
2518744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
2519744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                break;
25206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            default:
2521744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                ALOGE("%s: Invalid internal event %d in state(%d)",
2522744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                            __func__, cam_evt->server_event_type, m_state);
25236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
25246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
25256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
25266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
25276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_JPEG_EVT_NOTIFY:
25286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
25296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_jpeg_evt_payload_t *jpeg_job =
25306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (qcamera_jpeg_evt_payload_t *)payload;
25316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->processJpegNotify(jpeg_job);
25326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
25336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
25346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_SNAPSHOT_DONE:
25356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
25366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (m_parent->isZSLMode()) {
25376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->cancelPicture();
25386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
25396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = m_parent->cancelLiveSnapshot();
25406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
25416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_state = QCAMERA_SM_STATE_PREVIEWING;
2542744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.status = rc;
2543744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.request_api = evt;
2544744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            result.result_type = QCAMERA_API_RESULT_TYPE_DEF;
2545744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            m_parent->signalEvtResult(&result);
25466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
25476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
25486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_EVT_THERMAL_NOTIFY:
25496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
25506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = m_parent->updateThermalLevel(
25516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    *(qcamera_thermal_level_enum_t *)&payload);
25526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
25536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
25546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
25556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: cannot handle evt(%d) in state(%d)", __func__, evt, m_state);
25566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
25576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
25586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
25606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
25616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
25636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : isPreviewRunning
25646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: check if preview is in process.
25666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
25686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : true -- preview running
25706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              false -- preview stopped
25716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
25726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCameraStateMachine::isPreviewRunning()
25736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
25746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (m_state) {
25756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_PREVIEWING:
25766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_RECORDING:
25776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_VIDEO_PIC_TAKING:
25786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_SM_STATE_PREVIEW_PIC_TAKING:
2579744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy    case QCAMERA_SM_STATE_PREPARE_SNAPSHOT:
25806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return true;
25816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
25826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return false;
25836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
25846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
25856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera
2587