/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "DummyRecorder"
// #define LOG_NDEBUG 0

#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaSource.h>
#include "DummyRecorder.h"

#include <utils/Log.h>

namespace android {

// static
void *DummyRecorder::threadWrapper(void *pthis) {
    ALOGV("ThreadWrapper: %p", pthis);
    DummyRecorder *writer = static_cast<DummyRecorder *>(pthis);
    writer->readFromSource();
    return NULL;
}


status_t DummyRecorder::start() {
    ALOGV("Start");
    mStarted = true;

    mSource->start();

    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    int err = pthread_create(&mThread, &attr, threadWrapper, this);
    pthread_attr_destroy(&attr);

    if (err) {
        ALOGE("Error creating thread!");
        return -ENODEV;
    }
    return OK;
}


status_t DummyRecorder::stop() {
    ALOGV("Stop");
    mStarted = false;

    mSource->stop();
    void *dummy;
    pthread_join(mThread, &dummy);
    status_t err = static_cast<status_t>(reinterpret_cast<uintptr_t>(dummy));

    ALOGV("Ending the reading thread");
    return err;
}

// pretend to read the source buffers
void DummyRecorder::readFromSource() {
    ALOGV("ReadFromSource");
    if (!mStarted) {
        return;
    }

    status_t err = OK;
    MediaBuffer *buffer;
    ALOGV("A fake writer accessing the frames");
    while (mStarted && (err = mSource->read(&buffer)) == OK){
        // if not getting a valid buffer from source, then exit
        if (buffer == NULL) {
            return;
        }
        buffer->release();
        buffer = NULL;
    }
}


} // end of namespace android
