xref: /aosp_15_r20/external/oboe/include/oboe/StabilizedCallback.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 #ifndef OBOE_STABILIZEDCALLBACK_H
18*05767d91SRobert Wu #define OBOE_STABILIZEDCALLBACK_H
19*05767d91SRobert Wu 
20*05767d91SRobert Wu #include <cstdint>
21*05767d91SRobert Wu #include "oboe/AudioStream.h"
22*05767d91SRobert Wu 
23*05767d91SRobert Wu namespace oboe {
24*05767d91SRobert Wu 
25*05767d91SRobert Wu class StabilizedCallback : public AudioStreamCallback {
26*05767d91SRobert Wu 
27*05767d91SRobert Wu public:
28*05767d91SRobert Wu     explicit StabilizedCallback(AudioStreamCallback *callback);
29*05767d91SRobert Wu 
30*05767d91SRobert Wu     DataCallbackResult
31*05767d91SRobert Wu     onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) override;
32*05767d91SRobert Wu 
onErrorBeforeClose(AudioStream * oboeStream,Result error)33*05767d91SRobert Wu     void onErrorBeforeClose(AudioStream *oboeStream, Result error) override {
34*05767d91SRobert Wu         return mCallback->onErrorBeforeClose(oboeStream, error);
35*05767d91SRobert Wu     }
36*05767d91SRobert Wu 
onErrorAfterClose(AudioStream * oboeStream,Result error)37*05767d91SRobert Wu     void onErrorAfterClose(AudioStream *oboeStream, Result error) override {
38*05767d91SRobert Wu 
39*05767d91SRobert Wu         // Reset all fields now that the stream has been closed
40*05767d91SRobert Wu         mFrameCount = 0;
41*05767d91SRobert Wu         mEpochTimeNanos = 0;
42*05767d91SRobert Wu         mOpsPerNano = 1;
43*05767d91SRobert Wu         return mCallback->onErrorAfterClose(oboeStream, error);
44*05767d91SRobert Wu     }
45*05767d91SRobert Wu 
46*05767d91SRobert Wu private:
47*05767d91SRobert Wu 
48*05767d91SRobert Wu     AudioStreamCallback *mCallback = nullptr;
49*05767d91SRobert Wu     int64_t mFrameCount = 0;
50*05767d91SRobert Wu     int64_t mEpochTimeNanos = 0;
51*05767d91SRobert Wu     double  mOpsPerNano = 1;
52*05767d91SRobert Wu 
53*05767d91SRobert Wu     void generateLoad(int64_t durationNanos);
54*05767d91SRobert Wu };
55*05767d91SRobert Wu 
56*05767d91SRobert Wu /**
57*05767d91SRobert Wu  * cpu_relax is an architecture specific method of telling the CPU that you don't want it to
58*05767d91SRobert Wu  * do much work. asm volatile keeps the compiler from optimising these instructions out.
59*05767d91SRobert Wu  */
60*05767d91SRobert Wu #if defined(__i386__) || defined(__x86_64__)
61*05767d91SRobert Wu #define cpu_relax() asm volatile("rep; nop" ::: "memory");
62*05767d91SRobert Wu 
63*05767d91SRobert Wu #elif defined(__arm__) || defined(__mips__) || defined(__riscv)
64*05767d91SRobert Wu     #define cpu_relax() asm volatile("":::"memory")
65*05767d91SRobert Wu 
66*05767d91SRobert Wu #elif defined(__aarch64__)
67*05767d91SRobert Wu #define cpu_relax() asm volatile("yield" ::: "memory")
68*05767d91SRobert Wu 
69*05767d91SRobert Wu #else
70*05767d91SRobert Wu #error "cpu_relax is not defined for this architecture"
71*05767d91SRobert Wu #endif
72*05767d91SRobert Wu 
73*05767d91SRobert Wu }
74*05767d91SRobert Wu 
75*05767d91SRobert Wu #endif //OBOE_STABILIZEDCALLBACK_H
76