xref: /aosp_15_r20/external/oboe/samples/shared/Oscillator.h (revision 05767d913155b055644481607e6fa1e35e2fe72c)
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