16c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen/*
26c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Copyright (C) 2011 The Android Open Source Project
36c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *
46c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Licensed under the Apache License, Version 2.0 (the "License");
56c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * you may not use this file except in compliance with the License.
66c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * You may obtain a copy of the License at
76c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *
86c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *      http://www.apache.org/licenses/LICENSE-2.0
96c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen *
106c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * Unless required by applicable law or agreed to in writing, software
116c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * distributed under the License is distributed on an "AS IS" BASIS,
126c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * See the License for the specific language governing permissions and
146c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen * limitations under the License.
156c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen */
166c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
176c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include <common_time/local_clock.h>
186c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include <utils/String8.h>
196c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
206c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include "common_clock_service.h"
216c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include "common_clock.h"
226c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen#include "common_time_server.h"
236c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
246c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chennamespace android {
256c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
266c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chensp<CommonClockService> CommonClockService::instantiate(
276c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        CommonTimeServer& timeServer) {
286c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    sp<CommonClockService> tcc = new CommonClockService(timeServer);
296c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    if (tcc == NULL)
306c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        return NULL;
316c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
326c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    defaultServiceManager()->addService(ICommonClock::kServiceName, tcc);
336c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return tcc;
346c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
356c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
366c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::dump(int fd, const Vector<String16>& args) {
376c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    Mutex::Autolock lock(mRegistrationLock);
386c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return mTimeServer.dumpClockInterface(fd, args, mListeners.size());
396c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
406c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
416c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::isCommonTimeValid(bool* valid,
426c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                                               uint32_t* timelineID) {
436c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return mTimeServer.isCommonTimeValid(valid, timelineID);
446c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
456c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
466c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::commonTimeToLocalTime(int64_t  commonTime,
476c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                                                   int64_t* localTime) {
486c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return mTimeServer.getCommonClock().commonToLocal(commonTime, localTime);
496c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
506c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
516c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::localTimeToCommonTime(int64_t  localTime,
526c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                                                   int64_t* commonTime) {
536c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return mTimeServer.getCommonClock().localToCommon(localTime, commonTime);
546c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
556c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
566c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getCommonTime(int64_t* commonTime) {
576c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return localTimeToCommonTime(mTimeServer.getLocalClock().getLocalTime(), commonTime);
586c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
596c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
606c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getCommonFreq(uint64_t* freq) {
616c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    *freq = mTimeServer.getCommonClock().getCommonFreq();
626c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return OK;
636c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
646c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
656c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getLocalTime(int64_t* localTime) {
666c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    *localTime = mTimeServer.getLocalClock().getLocalTime();
676c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return OK;
686c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
696c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
706c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getLocalFreq(uint64_t* freq) {
716c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    *freq = mTimeServer.getLocalClock().getLocalFreq();
726c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return OK;
736c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
746c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
756c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getEstimatedError(int32_t* estimate) {
766c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    *estimate = mTimeServer.getEstimatedError();
776c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return OK;
786c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
796c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
806c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getTimelineID(uint64_t* id) {
816c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    *id = mTimeServer.getTimelineID();
826c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return OK;
836c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
846c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
856c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getState(State* state) {
866c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    *state = mTimeServer.getState();
876c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return OK;
886c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
896c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
906c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::getMasterAddr(struct sockaddr_storage* addr) {
916c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return mTimeServer.getMasterAddr(addr);
926c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
936c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
946c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::registerListener(
956c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        const sp<ICommonClockListener>& listener) {
966c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    Mutex::Autolock lock(mRegistrationLock);
976c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
986c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    {   // scoping for autolock pattern
996c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        Mutex::Autolock lock(mCallbackLock);
1006c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        // check whether this is a duplicate
1016c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        for (size_t i = 0; i < mListeners.size(); i++) {
1026c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen            if (mListeners[i]->asBinder() == listener->asBinder())
1036c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                return ALREADY_EXISTS;
1046c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        }
1056c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    }
1066c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1076c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    mListeners.add(listener);
1086c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
1096c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return listener->asBinder()->linkToDeath(this);
1106c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
1116c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1126c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenstatus_t CommonClockService::unregisterListener(
1136c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        const sp<ICommonClockListener>& listener) {
1146c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    Mutex::Autolock lock(mRegistrationLock);
1156c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    status_t ret_val = NAME_NOT_FOUND;
1166c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1176c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    {   // scoping for autolock pattern
1186c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        Mutex::Autolock lock(mCallbackLock);
1196c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        for (size_t i = 0; i < mListeners.size(); i++) {
1206c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen            if (mListeners[i]->asBinder() == listener->asBinder()) {
1216c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                mListeners[i]->asBinder()->unlinkToDeath(this);
1226c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                mListeners.removeAt(i);
1236c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                ret_val = OK;
1246c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                break;
1256c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen            }
1266c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        }
1276c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    }
1286c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1296c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
1306c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    return ret_val;
1316c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
1326c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1336c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenvoid CommonClockService::binderDied(const wp<IBinder>& who) {
1346c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    Mutex::Autolock lock(mRegistrationLock);
1356c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1366c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    {   // scoping for autolock pattern
1376c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        Mutex::Autolock lock(mCallbackLock);
1386c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        for (size_t i = 0; i < mListeners.size(); i++) {
1396c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen            if (mListeners[i]->asBinder() == who) {
1406c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                mListeners.removeAt(i);
1416c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen                break;
1426c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen            }
1436c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        }
1446c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    }
1456c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1466c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    mTimeServer.reevaluateAutoDisableState(0 != mListeners.size());
1476c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
1486c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1496c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chenvoid CommonClockService::notifyOnTimelineChanged(uint64_t timelineID) {
1506c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    Mutex::Autolock lock(mCallbackLock);
1516c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1526c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    for (size_t i = 0; i < mListeners.size(); i++) {
1536c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen        mListeners[i]->onTimelineChanged(timelineID);
1546c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen    }
1556c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}
1566c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen
1576c929510474caa14dc9d56826b2c65552861d6b3Mike J. Chen}; // namespace android
158