/*
* 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;
}