/* * Copyright 2018 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. */ #ifndef SHARED_OSCILLATOR_H #define SHARED_OSCILLATOR_H #include #include #include #include #include "IRenderableAudio.h" constexpr double kDefaultFrequency = 440.0; constexpr int32_t kDefaultSampleRate = 48000; constexpr double kPi = M_PI; constexpr double kTwoPi = kPi * 2; class Oscillator : public IRenderableAudio { public: ~Oscillator() = default; void setWaveOn(bool isWaveOn) { mIsWaveOn.store(isWaveOn); }; void setSampleRate(int32_t sampleRate) { mSampleRate = sampleRate; updatePhaseIncrement(); }; void setFrequency(double frequency) { mFrequency = frequency; updatePhaseIncrement(); }; inline void setAmplitude(float amplitude) { mAmplitude = amplitude; }; // From IRenderableAudio void renderAudio(float *audioData, int32_t numFrames) override { if (mIsWaveOn){ for (int i = 0; i < numFrames; ++i) { // Sine wave (sinf) //data[i*kChannelCount] = sinf(mPhase) * mAmplitude; // Square wave if (mPhase <= kPi){ audioData[i] = -mAmplitude; } else { audioData[i] = mAmplitude; } mPhase += mPhaseIncrement; if (mPhase > kTwoPi) mPhase -= kTwoPi; } } else { memset(audioData, 0, sizeof(float) * numFrames); } }; private: std::atomic mIsWaveOn { false }; float mPhase = 0.0; std::atomic mAmplitude { 0 }; std::atomic mPhaseIncrement { 0.0 }; double mFrequency = kDefaultFrequency; int32_t mSampleRate = kDefaultSampleRate; void updatePhaseIncrement(){ mPhaseIncrement.store((kTwoPi * mFrequency) / static_cast(mSampleRate)); }; }; #endif //SHARED_OSCILLATOR_H