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