1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 #include <math.h> 17 #include <stdint.h> 18 #include <stdlib.h> 19 20 #include "Log.h" 21 #include "audio/AudioSignalFactory.h" 22 23 android::sp<Buffer> AudioSignalFactory::generateSineWave(AudioHardware::BytesPerSample BPS, 24 int maxPositive, AudioHardware::SamplingRate samplingRate, int signalFreq, 25 int samples, bool stereo) 26 { 27 int bufferSize = samples * (stereo? 2 : 1) * BPS; 28 android::sp<Buffer> buffer(new Buffer(bufferSize)); 29 // only 16bit signed 30 ASSERT(BPS == AudioHardware::E2BPS); 31 int16_t* data = reinterpret_cast<int16_t*>(buffer->getData()); 32 double multiplier = 2.0 * M_PI * (double)signalFreq / samplingRate; 33 for (int i = 0; i < samples; i++) { 34 double val = sin(multiplier * i) * maxPositive; 35 *data = (int16_t)val; 36 data++; 37 if(stereo) { 38 *data = (int16_t)val; 39 data++; 40 } 41 } 42 buffer->setSize(buffer->getCapacity()); 43 return buffer; 44 } 45 android::sp<Buffer> AudioSignalFactory::generateWhiteNoise(AudioHardware::BytesPerSample BPS, 46 int maxPositive, int samples, bool stereo) 47 { 48 int bufferSize = samples * (stereo? 2 : 1) * BPS; 49 android::sp<Buffer> buffer(new Buffer(bufferSize, bufferSize)); 50 // only 16bit signed 51 ASSERT(BPS == AudioHardware::E2BPS); 52 srand(123456); 53 int16_t* data = reinterpret_cast<int16_t*>(buffer->getData()); 54 int middle = RAND_MAX / 2; 55 double multiplier = (double)maxPositive / middle; 56 for (int i = 0; i < samples; i++) { 57 int val = rand(); 58 val = (int16_t)((val - middle) * maxPositive / middle); 59 *data = val; 60 data++; 61 if (stereo) { 62 *data = val; 63 data++; 64 } 65 } 66 buffer->setSize(buffer->getCapacity()); 67 return buffer; 68 } 69 70 android::sp<Buffer> AudioSignalFactory::generateZeroSound(AudioHardware::BytesPerSample BPS, 71 int samples, bool stereo) 72 { 73 int bufferSize = samples * (stereo? 2 : 1) * BPS; 74 android::sp<Buffer> buffer(new Buffer(bufferSize, bufferSize)); 75 // only 16bit signed 76 ASSERT(BPS == AudioHardware::E2BPS); 77 int16_t* data = reinterpret_cast<int16_t*>(buffer->getData()); 78 for (int i = 0; i < samples; i++) { 79 *data = 0; 80 data++; 81 if (stereo) { 82 *data = 0; 83 data++; 84 } 85 } 86 buffer->setSize(buffer->getCapacity()); 87 return buffer; 88 } 89 90 91