/*
 * Copyright (C) 2012 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.
 */
#include <math.h>
#include <stdint.h>
#include <stdlib.h>

#include "Log.h"
#include "audio/AudioSignalFactory.h"

android::sp<Buffer> AudioSignalFactory::generateSineWave(AudioHardware::BytesPerSample BPS,
        int maxPositive, AudioHardware::SamplingRate samplingRate, int signalFreq,
        int samples,  bool stereo)
{
    int bufferSize = samples * (stereo? 2 : 1) * BPS;
    android::sp<Buffer> buffer(new Buffer(bufferSize));
    // only 16bit signed
    ASSERT(BPS == AudioHardware::E2BPS);
    int16_t* data = reinterpret_cast<int16_t*>(buffer->getData());
    double multiplier = 2.0 * M_PI * (double)signalFreq / samplingRate;
    for (int i = 0; i < samples; i++) {
        double val = sin(multiplier * i) * maxPositive;
        *data = (int16_t)val;
        data++;
        if(stereo) {
            *data = (int16_t)val;
            data++;
        }
    }
    buffer->setSize(buffer->getCapacity());
    return buffer;
}
android::sp<Buffer> AudioSignalFactory::generateWhiteNoise(AudioHardware::BytesPerSample BPS,
        int maxPositive, int samples, bool stereo)
{
    int bufferSize = samples * (stereo? 2 : 1) * BPS;
    android::sp<Buffer> buffer(new Buffer(bufferSize, bufferSize));
    // only 16bit signed
    ASSERT(BPS == AudioHardware::E2BPS);
    srand(123456);
    int16_t* data = reinterpret_cast<int16_t*>(buffer->getData());
    int middle = RAND_MAX / 2;
    double multiplier = (double)maxPositive / middle;
    for (int i = 0; i < samples; i++) {
        int val =  rand();
        val = (int16_t)((val - middle) * maxPositive / middle);
        *data = val;
        data++;
        if (stereo) {
            *data = val;
            data++;
        }
    }
    buffer->setSize(buffer->getCapacity());
    return buffer;
}

android::sp<Buffer> AudioSignalFactory::generateZeroSound(AudioHardware::BytesPerSample BPS,
        int samples, bool stereo)
{
    int bufferSize = samples * (stereo? 2 : 1) * BPS;
    android::sp<Buffer> buffer(new Buffer(bufferSize, bufferSize));
    // only 16bit signed
    ASSERT(BPS == AudioHardware::E2BPS);
    int16_t* data = reinterpret_cast<int16_t*>(buffer->getData());
    for (int i = 0; i < samples; i++) {
        *data = 0;
        data++;
        if (stereo) {
            *data = 0;
            data++;
        }
    }
    buffer->setSize(buffer->getCapacity());
    return buffer;
}