RepeaterSource.cpp revision 1d15ab58bf8239069ef343de6cb21aabf3ef7d78
1d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber//#define LOG_NDEBUG 0
2d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#define LOG_TAG "RepeaterSource"
3d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <utils/Log.h>
4d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
5d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include "RepeaterSource.h"
6d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
7d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/foundation/ADebug.h>
8d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/foundation/ALooper.h>
9d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/foundation/AMessage.h>
10d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/MediaBuffer.h>
11d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#include <media/stagefright/MetaData.h>
12d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
13d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubernamespace android {
14d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
15d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas HuberRepeaterSource::RepeaterSource(const sp<MediaSource> &source, double rateHz)
1677245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber    : mStarted(false),
1777245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber      mSource(source),
18d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber      mRateHz(rateHz),
19d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber      mBuffer(NULL),
20d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber      mResult(OK),
214a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber      mLastBufferUpdateUs(-1ll),
22d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber      mStartTimeUs(-1ll),
23d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber      mFrameCount(0) {
24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}
25d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
26d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas HuberRepeaterSource::~RepeaterSource() {
2777245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber    CHECK(!mStarted);
28d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}
29d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
30eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huberdouble RepeaterSource::getFrameRate() const {
31eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber    return mRateHz;
32eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber}
33eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber
34eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Hubervoid RepeaterSource::setFrameRate(double rateHz) {
35eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber    Mutex::Autolock autoLock(mLock);
36eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber
37eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber    if (rateHz == mRateHz) {
38eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber        return;
39eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber    }
40eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber
41eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber    if (mStartTimeUs >= 0ll) {
42eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber        int64_t nextTimeUs = mStartTimeUs + (mFrameCount * 1000000ll) / mRateHz;
43eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber        mStartTimeUs = nextTimeUs;
44eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber        mFrameCount = 0;
45eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber    }
46eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber    mRateHz = rateHz;
47eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber}
48eaf5381f38bf6c3ecb5fe32a8351c26a447549f5Andreas Huber
49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::start(MetaData *params) {
5077245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber    CHECK(!mStarted);
5177245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber
52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    status_t err = mSource->start(params);
53d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
54d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    if (err != OK) {
55d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        return err;
56d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    }
57d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
58d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    mBuffer = NULL;
59d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    mResult = OK;
60d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    mStartTimeUs = -1ll;
61d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    mFrameCount = 0;
62d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
63d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    mLooper = new ALooper;
64e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber    mLooper->setName("repeater_looper");
65d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    mLooper->start();
66d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
67d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    mReflector = new AHandlerReflector<RepeaterSource>(this);
68d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    mLooper->registerHandler(mReflector);
69d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
70d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    postRead();
71d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
7277245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber    mStarted = true;
7377245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber
74d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    return OK;
75d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}
76d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
77d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::stop() {
7877245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber    CHECK(mStarted);
7977245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber
8096fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    ALOGV("stopping");
8196fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber
82456fa912e46edf0b01ea3b7760ea922c01ca1866Chong Zhang    status_t err = mSource->stop();
83456fa912e46edf0b01ea3b7760ea922c01ca1866Chong Zhang
84d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    if (mLooper != NULL) {
85d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        mLooper->stop();
86d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        mLooper.clear();
87d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
88d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        mReflector.clear();
89d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    }
90d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
9196fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    if (mBuffer != NULL) {
9296fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber        ALOGV("releasing mbuf %p", mBuffer);
9396fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber        mBuffer->release();
9496fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber        mBuffer = NULL;
9596fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    }
9696fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber
9796fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber
9896fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    ALOGV("stopped");
9996fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber
10077245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber    mStarted = false;
10177245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber
10296fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    return err;
103d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}
104d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
105d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubersp<MetaData> RepeaterSource::getFormat() {
106d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    return mSource->getFormat();
107d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}
108d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
109d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberstatus_t RepeaterSource::read(
110d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        MediaBuffer **buffer, const ReadOptions *options) {
111d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    int64_t seekTimeUs;
112d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    ReadOptions::SeekMode seekMode;
113d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    CHECK(options == NULL || !options->getSeekTo(&seekTimeUs, &seekMode));
114d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1154a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber    for (;;) {
1164a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        int64_t bufferTimeUs = -1ll;
117d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1184a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        if (mStartTimeUs < 0ll) {
1194a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            Mutex::Autolock autoLock(mLock);
1204a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            while ((mLastBufferUpdateUs < 0ll || mBuffer == NULL)
1214a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                    && mResult == OK) {
1224a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                mCondition.wait(mLock);
1234a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            }
124d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1254a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            ALOGV("now resuming.");
1264a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            mStartTimeUs = ALooper::GetNowUs();
1274a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            bufferTimeUs = mStartTimeUs;
1284a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        } else {
1294a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            bufferTimeUs = mStartTimeUs + (mFrameCount * 1000000ll) / mRateHz;
130d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1314a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            int64_t nowUs = ALooper::GetNowUs();
1324a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            int64_t delayUs = bufferTimeUs - nowUs;
133d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1344a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            if (delayUs > 0ll) {
1354a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                usleep(delayUs);
1364a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            }
137d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        }
138d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1394a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        bool stale = false;
140d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1414a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        {
1424a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            Mutex::Autolock autoLock(mLock);
1434a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            if (mResult != OK) {
1444a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                CHECK(mBuffer == NULL);
1454a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                return mResult;
1464a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            }
147d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
1480224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber#if SUSPEND_VIDEO_IF_IDLE
1494a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            int64_t nowUs = ALooper::GetNowUs();
1504a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            if (nowUs - mLastBufferUpdateUs > 1000000ll) {
1514a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                mLastBufferUpdateUs = -1ll;
1524a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                stale = true;
1530224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber            } else
1540224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber#endif
1550224bf170a3904576bba81593eaab113c5d3a4e7Andreas Huber            {
1564a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                mBuffer->add_ref();
1574a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                *buffer = mBuffer;
1584a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                (*buffer)->meta_data()->setInt64(kKeyTime, bufferTimeUs);
1594a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber                ++mFrameCount;
1604a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            }
1614a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        }
1624a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber
1634a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        if (!stale) {
1644a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            break;
1654a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        }
1664a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber
1674a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        mStartTimeUs = -1ll;
1684a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        mFrameCount = 0;
1694a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        ALOGV("now dormant");
1704a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber    }
171d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
172d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    return OK;
173d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}
174d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
175d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubervoid RepeaterSource::postRead() {
1761d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    (new AMessage(kWhatRead, mReflector))->post();
177d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}
178d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
179d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Hubervoid RepeaterSource::onMessageReceived(const sp<AMessage> &msg) {
180d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    switch (msg->what()) {
181d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        case kWhatRead:
182d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        {
183d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            MediaBuffer *buffer;
184d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            status_t err = mSource->read(&buffer);
185d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
18696fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber            ALOGV("read mbuf %p", buffer);
18796fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber
188d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            Mutex::Autolock autoLock(mLock);
189d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            if (mBuffer != NULL) {
190d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber                mBuffer->release();
191d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber                mBuffer = NULL;
192d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            }
193d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            mBuffer = buffer;
194d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            mResult = err;
1954a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber            mLastBufferUpdateUs = ALooper::GetNowUs();
196d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
197d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            mCondition.broadcast();
198d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
199d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            if (err == OK) {
200d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber                postRead();
201d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            }
202d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            break;
203d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        }
204d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
205d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        default:
206d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber            TRESPASS();
207d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    }
208d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}
209d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
2104a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Hubervoid RepeaterSource::wakeUp() {
2114a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber    ALOGV("wakeUp");
2124a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber    Mutex::Autolock autoLock(mLock);
2134a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber    if (mLastBufferUpdateUs < 0ll && mBuffer != NULL) {
2144a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        mLastBufferUpdateUs = ALooper::GetNowUs();
2154a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber        mCondition.broadcast();
2164a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber    }
2174a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber}
2184a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber
219d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber}  // namespace android
220