Skip to content

Commit 3b90446

Browse files
committed
Add global volume API
1 parent 9f8f75c commit 3b90446

File tree

5 files changed

+46
-1
lines changed

5 files changed

+46
-1
lines changed

include/scratchcpp/iengine.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ class LIBSCRATCHCPP_EXPORT IEngine
8787
/*! Stops all currently playing sounds. */
8888
virtual void stopSounds() = 0;
8989

90+
/*! Returns the global volume of all sounds (in %). */
91+
virtual double globalVolume() const = 0;
92+
93+
/*! Sets the global volume of all sounds (in %). */
94+
virtual void setGlobalVolume(double volume) = 0;
95+
9096
/*! Updates the values of stage monitors. */
9197
virtual void updateMonitors() = 0;
9298

src/engine/internal/engine.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "blocksectioncontainer.h"
2727
#include "timer.h"
2828
#include "clock.h"
29+
#include "audio/iaudioengine.h"
2930
#include "blocks/standardblocks.h"
3031
#include "blocks/variableblocks.h"
3132
#include "blocks/listblocks.h"
@@ -46,7 +47,8 @@ const std::unordered_map<Engine::HatType, bool> Engine::m_hatEdgeActivated = {
4647
Engine::Engine() :
4748
m_defaultTimer(std::make_unique<Timer>()),
4849
m_timer(m_defaultTimer.get()),
49-
m_clock(Clock::instance().get())
50+
m_clock(Clock::instance().get()),
51+
m_audioEngine(IAudioEngine::instance())
5052
{
5153
}
5254

@@ -469,6 +471,16 @@ void Engine::stopSounds()
469471
}
470472
}
471473

474+
double Engine::globalVolume() const
475+
{
476+
return m_audioEngine->volume() * 100;
477+
}
478+
479+
void Engine::setGlobalVolume(double volume)
480+
{
481+
m_audioEngine->setVolume(volume / 100);
482+
}
483+
472484
void Engine::updateMonitors()
473485
{
474486
// Execute the "script" of each visible monitor

src/engine/internal/engine.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace libscratchcpp
1919

2020
class Entity;
2121
class IClock;
22+
class IAudioEngine;
2223

2324
class Engine : public IEngine
2425
{
@@ -41,7 +42,10 @@ class Engine : public IEngine
4142
void stopTarget(Target *target, VirtualMachine *exceptScript) override;
4243
void initClone(std::shared_ptr<Sprite> clone) override;
4344
void deinitClone(std::shared_ptr<Sprite> clone) override;
45+
4446
void stopSounds() override;
47+
virtual double globalVolume() const override;
48+
virtual void setGlobalVolume(double volume) override;
4549

4650
void updateMonitors() override;
4751
void step() override;
@@ -163,6 +167,7 @@ class Engine : public IEngine
163167
void setUserAgent(const std::string &agent) override;
164168

165169
IClock *m_clock = nullptr;
170+
IAudioEngine *m_audioEngine = nullptr;
166171

167172
private:
168173
enum class HatType

test/engine/engine_test.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <scratch/sound_p.h>
1515
#include <timermock.h>
1616
#include <clockmock.h>
17+
#include <audioenginemock.h>
1718
#include <audioinputmock.h>
1819
#include <audiooutputmock.h>
1920
#include <audioplayermock.h>
@@ -318,6 +319,24 @@ TEST(EngineTest, StopSounds)
318319
SoundPrivate::audioOutput = nullptr;
319320
}
320321

322+
TEST(EngineTest, GlobalVolume)
323+
{
324+
Engine engine;
325+
ASSERT_EQ(engine.globalVolume(), 100);
326+
327+
engine.setGlobalVolume(58.3);
328+
ASSERT_EQ(engine.globalVolume(), 58.3);
329+
330+
AudioEngineMock audioEngine;
331+
engine.m_audioEngine = &audioEngine;
332+
333+
EXPECT_CALL(audioEngine, volume()).WillOnce(Return(0.275));
334+
ASSERT_EQ(engine.globalVolume(), 27.5);
335+
336+
EXPECT_CALL(audioEngine, setVolume(0.9236));
337+
engine.setGlobalVolume(92.36);
338+
}
339+
321340
TEST(EngineTest, Step)
322341
{
323342
Project p("step.sb3");

test/mocks/enginemock.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ class EngineMock : public IEngine
2424
MOCK_METHOD(void, stopTarget, (Target *, VirtualMachine *), (override));
2525
MOCK_METHOD(void, initClone, (std::shared_ptr<Sprite>), (override));
2626
MOCK_METHOD(void, deinitClone, (std::shared_ptr<Sprite>), (override));
27+
2728
MOCK_METHOD(void, stopSounds, (), (override));
29+
MOCK_METHOD(double, globalVolume, (), (const, override));
30+
MOCK_METHOD(void, setGlobalVolume, (double), (override));
2831

2932
MOCK_METHOD(void, updateMonitors, (), (override));
3033
MOCK_METHOD(void, step, (), (override));

0 commit comments

Comments
 (0)