1*05767d91SRobert Wu /* 2*05767d91SRobert Wu * Copyright 2018 The Android Open Source Project 3*05767d91SRobert Wu * 4*05767d91SRobert Wu * Licensed under the Apache License, Version 2.0 (the "License"); 5*05767d91SRobert Wu * you may not use this file except in compliance with the License. 6*05767d91SRobert Wu * You may obtain a copy of the License at 7*05767d91SRobert Wu * 8*05767d91SRobert Wu * http://www.apache.org/licenses/LICENSE-2.0 9*05767d91SRobert Wu * 10*05767d91SRobert Wu * Unless required by applicable law or agreed to in writing, software 11*05767d91SRobert Wu * distributed under the License is distributed on an "AS IS" BASIS, 12*05767d91SRobert Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*05767d91SRobert Wu * See the License for the specific language governing permissions and 14*05767d91SRobert Wu * limitations under the License. 15*05767d91SRobert Wu */ 16*05767d91SRobert Wu 17*05767d91SRobert Wu 18*05767d91SRobert Wu #ifndef SHARED_OSCILLATOR_H 19*05767d91SRobert Wu #define SHARED_OSCILLATOR_H 20*05767d91SRobert Wu 21*05767d91SRobert Wu 22*05767d91SRobert Wu #include <cstdint> 23*05767d91SRobert Wu #include <atomic> 24*05767d91SRobert Wu #include <math.h> 25*05767d91SRobert Wu #include <memory> 26*05767d91SRobert Wu #include "IRenderableAudio.h" 27*05767d91SRobert Wu 28*05767d91SRobert Wu constexpr double kDefaultFrequency = 440.0; 29*05767d91SRobert Wu constexpr int32_t kDefaultSampleRate = 48000; 30*05767d91SRobert Wu constexpr double kPi = M_PI; 31*05767d91SRobert Wu constexpr double kTwoPi = kPi * 2; 32*05767d91SRobert Wu 33*05767d91SRobert Wu class Oscillator : public IRenderableAudio { 34*05767d91SRobert Wu 35*05767d91SRobert Wu public: 36*05767d91SRobert Wu 37*05767d91SRobert Wu ~Oscillator() = default; 38*05767d91SRobert Wu setWaveOn(bool isWaveOn)39*05767d91SRobert Wu void setWaveOn(bool isWaveOn) { 40*05767d91SRobert Wu mIsWaveOn.store(isWaveOn); 41*05767d91SRobert Wu }; 42*05767d91SRobert Wu setSampleRate(int32_t sampleRate)43*05767d91SRobert Wu void setSampleRate(int32_t sampleRate) { 44*05767d91SRobert Wu mSampleRate = sampleRate; 45*05767d91SRobert Wu updatePhaseIncrement(); 46*05767d91SRobert Wu }; 47*05767d91SRobert Wu setFrequency(double frequency)48*05767d91SRobert Wu void setFrequency(double frequency) { 49*05767d91SRobert Wu mFrequency = frequency; 50*05767d91SRobert Wu updatePhaseIncrement(); 51*05767d91SRobert Wu }; 52*05767d91SRobert Wu setAmplitude(float amplitude)53*05767d91SRobert Wu inline void setAmplitude(float amplitude) { 54*05767d91SRobert Wu mAmplitude = amplitude; 55*05767d91SRobert Wu }; 56*05767d91SRobert Wu 57*05767d91SRobert Wu // From IRenderableAudio renderAudio(float * audioData,int32_t numFrames)58*05767d91SRobert Wu void renderAudio(float *audioData, int32_t numFrames) override { 59*05767d91SRobert Wu 60*05767d91SRobert Wu if (mIsWaveOn){ 61*05767d91SRobert Wu for (int i = 0; i < numFrames; ++i) { 62*05767d91SRobert Wu 63*05767d91SRobert Wu // Sine wave (sinf) 64*05767d91SRobert Wu //audioData[i] = sinf(mPhase) * mAmplitude; 65*05767d91SRobert Wu 66*05767d91SRobert Wu // Square wave 67*05767d91SRobert Wu if (mPhase <= kPi){ 68*05767d91SRobert Wu audioData[i] = -mAmplitude; 69*05767d91SRobert Wu } else { 70*05767d91SRobert Wu audioData[i] = mAmplitude; 71*05767d91SRobert Wu } 72*05767d91SRobert Wu 73*05767d91SRobert Wu mPhase += mPhaseIncrement; 74*05767d91SRobert Wu if (mPhase > kTwoPi) mPhase -= kTwoPi; 75*05767d91SRobert Wu } 76*05767d91SRobert Wu } else { 77*05767d91SRobert Wu memset(audioData, 0, sizeof(float) * numFrames); 78*05767d91SRobert Wu } 79*05767d91SRobert Wu }; 80*05767d91SRobert Wu 81*05767d91SRobert Wu private: 82*05767d91SRobert Wu std::atomic<bool> mIsWaveOn { false }; 83*05767d91SRobert Wu float mPhase = 0.0; 84*05767d91SRobert Wu std::atomic<float> mAmplitude { 0 }; 85*05767d91SRobert Wu std::atomic<double> mPhaseIncrement { 0.0 }; 86*05767d91SRobert Wu double mFrequency = kDefaultFrequency; 87*05767d91SRobert Wu int32_t mSampleRate = kDefaultSampleRate; 88*05767d91SRobert Wu updatePhaseIncrement()89*05767d91SRobert Wu void updatePhaseIncrement(){ 90*05767d91SRobert Wu mPhaseIncrement.store((kTwoPi * mFrequency) / static_cast<double>(mSampleRate)); 91*05767d91SRobert Wu }; 92*05767d91SRobert Wu }; 93*05767d91SRobert Wu 94*05767d91SRobert Wu #endif //SHARED_OSCILLATOR_H 95