Skip to content

Commit 888b469

Browse files
authored
test: scheduled source tests (#782)
* test: scheduled source tests * test: fix in tests * test: refactor scheduled to be consistent
1 parent 44925d7 commit 888b469

File tree

9 files changed

+151
-13
lines changed

9 files changed

+151
-13
lines changed

packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
7676
auto sampleRate = context_->getSampleRate();
7777

7878
size_t firstFrame = context_->getCurrentSampleFrame();
79-
size_t lastFrame = firstFrame + framesToProcess;
79+
size_t lastFrame = firstFrame + framesToProcess - 1;
8080

8181
size_t startFrame =
8282
std::max(dsp::timeToSampleFrame(startTime_, sampleRate), firstFrame);
@@ -105,7 +105,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
105105
? std::max(startFrame, firstFrame) - firstFrame
106106
: 0;
107107
nonSilentFramesToProcess =
108-
std::max(std::min(lastFrame, stopFrame), startFrame) - startFrame;
108+
std::max(std::min(lastFrame, stopFrame) + 1, startFrame) - startFrame;
109109

110110
assert(startOffset <= framesToProcess);
111111
assert(nonSilentFramesToProcess <= framesToProcess);
@@ -124,7 +124,7 @@ void AudioScheduledSourceNode::updatePlaybackInfo(
124124

125125
// stop will happen in this render quantum
126126
// zero remaining frames after stop frame
127-
if (stopFrame < lastFrame && stopFrame >= firstFrame) {
127+
if (stopFrame <= lastFrame && stopFrame >= firstFrame) {
128128
playbackState_ = PlaybackState::STOP_SCHEDULED;
129129
startOffset = 0;
130130
nonSilentFramesToProcess = stopFrame - firstFrame;

packages/react-native-audio-api/common/cpp/test/src/AudioParamTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ using namespace audioapi;
88

99
class AudioParamTest : public ::testing::Test {
1010
protected:
11-
std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
11+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
1212
std::unique_ptr<OfflineAudioContext> context;
1313
static constexpr int sampleRate = 44100;
1414

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
#include <audioapi/core/OfflineAudioContext.h>
2+
#include <audioapi/core/destinations/AudioDestinationNode.h>
3+
#include <audioapi/core/sources/AudioScheduledSourceNode.h>
4+
#include <audioapi/core/utils/worklets/SafeIncludes.h>
5+
#include <audioapi/utils/AudioBus.h>
6+
#include <gtest/gtest.h>
7+
#include <test/src/MockAudioEventHandlerRegistry.h>
8+
9+
using namespace audioapi;
10+
static constexpr int SAMPLE_RATE = 44100;
11+
static constexpr int RENDER_QUANTUM = 128;
12+
static constexpr double RENDER_QUANTUM_TIME =
13+
static_cast<double>(RENDER_QUANTUM) / SAMPLE_RATE;
14+
15+
class AudioScheduledSourceTest : public ::testing::Test {
16+
protected:
17+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
18+
std::unique_ptr<OfflineAudioContext> context;
19+
20+
void SetUp() override {
21+
eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();
22+
context = std::make_unique<OfflineAudioContext>(
23+
2, 5 * SAMPLE_RATE, SAMPLE_RATE, eventRegistry, RuntimeRegistry{});
24+
}
25+
};
26+
27+
class TestableAudioScheduledSourceNode : public AudioScheduledSourceNode {
28+
public:
29+
explicit TestableAudioScheduledSourceNode(BaseAudioContext *context)
30+
: AudioScheduledSourceNode(context) {
31+
isInitialized_ = true;
32+
}
33+
34+
void updatePlaybackInfo(
35+
const std::shared_ptr<AudioBus> &processingBus,
36+
int framesToProcess,
37+
size_t &startOffset,
38+
size_t &nonSilentFramesToProcess) {
39+
AudioScheduledSourceNode::updatePlaybackInfo(
40+
processingBus, framesToProcess, startOffset, nonSilentFramesToProcess);
41+
}
42+
43+
std::shared_ptr<AudioBus> processNode(const std::shared_ptr<AudioBus> &, int)
44+
override {
45+
return nullptr;
46+
}
47+
48+
PlaybackState getPlaybackState() const {
49+
return playbackState_;
50+
}
51+
52+
void playFrames(int frames) {
53+
size_t startOffset = 0;
54+
size_t nonSilentFramesToProcess = 0;
55+
auto processingBus =
56+
std::make_shared<AudioBus>(128, 2, static_cast<float>(SAMPLE_RATE));
57+
updatePlaybackInfo(
58+
processingBus, frames, startOffset, nonSilentFramesToProcess);
59+
context_->getDestination()->renderAudio(processingBus, frames);
60+
}
61+
};
62+
63+
TEST_F(AudioScheduledSourceTest, IsUnscheduledStateSetCorrectly) {
64+
auto sourceNode = TestableAudioScheduledSourceNode(context.get());
65+
EXPECT_EQ(
66+
sourceNode.getPlaybackState(),
67+
AudioScheduledSourceNode::PlaybackState::UNSCHEDULED);
68+
69+
sourceNode.start(RENDER_QUANTUM_TIME);
70+
EXPECT_NE(
71+
sourceNode.getPlaybackState(),
72+
AudioScheduledSourceNode::PlaybackState::UNSCHEDULED);
73+
}
74+
75+
TEST_F(AudioScheduledSourceTest, IsScheduledStateSetCorrectly) {
76+
auto sourceNode = TestableAudioScheduledSourceNode(context.get());
77+
sourceNode.start(RENDER_QUANTUM_TIME);
78+
EXPECT_EQ(
79+
sourceNode.getPlaybackState(),
80+
AudioScheduledSourceNode::PlaybackState::SCHEDULED);
81+
82+
sourceNode.playFrames(RENDER_QUANTUM);
83+
EXPECT_EQ(
84+
sourceNode.getPlaybackState(),
85+
AudioScheduledSourceNode::PlaybackState::SCHEDULED);
86+
87+
sourceNode.playFrames(1);
88+
EXPECT_NE(
89+
sourceNode.getPlaybackState(),
90+
AudioScheduledSourceNode::PlaybackState::SCHEDULED);
91+
}
92+
93+
TEST_F(AudioScheduledSourceTest, IsPlayingStateSetCorrectly) {
94+
auto sourceNode = TestableAudioScheduledSourceNode(context.get());
95+
sourceNode.start(0);
96+
sourceNode.stop(RENDER_QUANTUM_TIME);
97+
98+
sourceNode.playFrames(RENDER_QUANTUM);
99+
EXPECT_EQ(
100+
sourceNode.getPlaybackState(),
101+
AudioScheduledSourceNode::PlaybackState::PLAYING);
102+
103+
sourceNode.playFrames(1);
104+
EXPECT_NE(
105+
sourceNode.getPlaybackState(),
106+
AudioScheduledSourceNode::PlaybackState::PLAYING);
107+
}
108+
109+
TEST_F(AudioScheduledSourceTest, IsStopScheduledStateSetCorrectly) {
110+
auto sourceNode = TestableAudioScheduledSourceNode(context.get());
111+
sourceNode.start(0);
112+
sourceNode.stop(RENDER_QUANTUM_TIME);
113+
sourceNode.playFrames(1); // start playing
114+
sourceNode.playFrames(RENDER_QUANTUM);
115+
EXPECT_EQ(
116+
sourceNode.getPlaybackState(),
117+
AudioScheduledSourceNode::PlaybackState::STOP_SCHEDULED);
118+
119+
sourceNode.playFrames(1);
120+
EXPECT_NE(
121+
sourceNode.getPlaybackState(),
122+
AudioScheduledSourceNode::PlaybackState::STOP_SCHEDULED);
123+
}
124+
125+
TEST_F(AudioScheduledSourceTest, IsFinishedStateSetCorrectly) {
126+
auto sourceNode = TestableAudioScheduledSourceNode(context.get());
127+
sourceNode.start(0);
128+
sourceNode.stop(RENDER_QUANTUM_TIME);
129+
sourceNode.playFrames(1); // start playing
130+
131+
EXPECT_CALL(
132+
*eventRegistry,
133+
invokeHandlerWithEventBody("ended", testing::_, testing::_))
134+
.Times(1);
135+
sourceNode.playFrames(RENDER_QUANTUM);
136+
sourceNode.playFrames(1);
137+
EXPECT_TRUE(sourceNode.isFinished());
138+
}

packages/react-native-audio-api/common/cpp/test/src/ConstantSourceTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ using namespace audioapi;
1010

1111
class ConstantSourceTest : public ::testing::Test {
1212
protected:
13-
std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
13+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
1414
std::unique_ptr<OfflineAudioContext> context;
1515
static constexpr int sampleRate = 44100;
1616

packages/react-native-audio-api/common/cpp/test/src/GainTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ using namespace audioapi;
1010

1111
class GainTest : public ::testing::Test {
1212
protected:
13-
std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
13+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
1414
std::unique_ptr<OfflineAudioContext> context;
1515
static constexpr int sampleRate = 44100;
1616

packages/react-native-audio-api/common/cpp/test/src/MockAudioEventHandlerRegistry.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ class MockAudioEventHandlerRegistry : public IAudioEventHandlerRegistry {
1717
MOCK_METHOD(void, unregisterHandler,
1818
(const std::string &eventName, uint64_t listenerId), (override));
1919

20-
MOCK_METHOD(void, invokeHandlerWithEventBody,
21-
(const std::string &eventName, const EventMap &body), (override));
22-
MOCK_METHOD(void, invokeHandlerWithEventBody,
23-
(const std::string &eventName, uint64_t listenerId, const EventMap &body), (override));
20+
MOCK_METHOD2(invokeHandlerWithEventBody, void
21+
(const std::string &eventName, const EventMap &body));
22+
MOCK_METHOD3(invokeHandlerWithEventBody, void
23+
(const std::string &eventName, uint64_t listenerId, const EventMap &body));
2424
};

packages/react-native-audio-api/common/cpp/test/src/OscillatorTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ using namespace audioapi;
88

99
class OscillatorTest : public ::testing::Test {
1010
protected:
11-
std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
11+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
1212
std::unique_ptr<OfflineAudioContext> context;
1313
static constexpr int sampleRate = 44100;
1414

packages/react-native-audio-api/common/cpp/test/src/StereoPannerTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ using namespace audioapi;
1010

1111
class StereoPannerTest : public ::testing::Test {
1212
protected:
13-
std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
13+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
1414
std::unique_ptr<OfflineAudioContext> context;
1515
static constexpr int sampleRate = 44100;
1616

packages/react-native-audio-api/common/cpp/test/src/biquad/BiquadFilterTest.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ static constexpr float tolerance = 0.0001f;
1414
namespace audioapi {
1515
class BiquadFilterTest : public ::testing::Test {
1616
protected:
17-
std::shared_ptr<IAudioEventHandlerRegistry> eventRegistry;
17+
std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;
1818
std::unique_ptr<OfflineAudioContext> context;
1919

2020
void SetUp() override {

0 commit comments

Comments
 (0)