Skip to content

Commit 25686e6

Browse files
committed
Implement sensing_loudness block
1 parent d624dc0 commit 25686e6

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include <utf8.h>
1818

1919
#include "sensingblocks.h"
20+
#include "audio/audioinput.h"
21+
#include "audio/iaudioloudness.h"
2022

2123
using namespace libscratchcpp;
2224

@@ -48,6 +50,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
4850
engine->addCompileFunction(this, "sensing_mousex", &compileMouseX);
4951
engine->addCompileFunction(this, "sensing_mousey", &compileMouseY);
5052
engine->addCompileFunction(this, "sensing_setdragmode", &compileSetDragMode);
53+
engine->addCompileFunction(this, "sensing_loudness", &compileLoudness);
5154
}
5255

5356
void SensingBlocks::onInit(IEngine *engine)
@@ -209,6 +212,11 @@ CompilerValue *SensingBlocks::compileSetDragMode(Compiler *compiler)
209212
return nullptr;
210213
}
211214

215+
CompilerValue *SensingBlocks::compileLoudness(Compiler *compiler)
216+
{
217+
return compiler->addFunctionCall("sensing_loudness", Compiler::StaticType::Number);
218+
}
219+
212220
void SensingBlocks::onAnswer(const std::string &answer)
213221
{
214222
// https://github.com/scratchfoundation/scratch-vm/blob/6055823f203a696165084b873e661713806583ec/src/blocks/scratch3_sensing.js#L99-L115
@@ -390,3 +398,12 @@ extern "C" void sensing_setdragmode(Sprite *sprite, bool draggable)
390398
{
391399
sprite->setDraggable(draggable);
392400
}
401+
402+
extern "C" double sensing_loudness()
403+
{
404+
if (!SensingBlocks::audioInput)
405+
SensingBlocks::audioInput = AudioInput::instance().get();
406+
407+
auto audioLoudness = SensingBlocks::audioInput->audioLoudness();
408+
return audioLoudness->getLoudness();
409+
}

src/blocks/sensingblocks.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace libscratchcpp
1010
{
1111

12+
class IAudioInput;
1213
class ExecutionContext;
1314
class Thread;
1415

@@ -25,6 +26,8 @@ class SensingBlocks : public IExtension
2526
static void clearQuestions();
2627
static void askQuestion(ExecutionContext *ctx, const StringPtr *question);
2728

29+
static inline IAudioInput *audioInput = nullptr;
30+
2831
private:
2932
struct Question
3033
{
@@ -53,6 +56,7 @@ class SensingBlocks : public IExtension
5356
static CompilerValue *compileMouseX(Compiler *compiler);
5457
static CompilerValue *compileMouseY(Compiler *compiler);
5558
static CompilerValue *compileSetDragMode(Compiler *compiler);
59+
static CompilerValue *compileLoudness(Compiler *compiler);
5660

5761
static void onAnswer(const std::string &answer);
5862
static void enqueueAsk(const std::string &question, Thread *thread);

test/blocks/sensing_blocks_test.cpp

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <scratchcpp/test/scriptbuilder.h>
1010
#include <enginemock.h>
1111
#include <targetmock.h>
12+
#include <audioinputmock.h>
13+
#include <audioloudnessmock.h>
1214

1315
#include "../common.h"
1416
#include "blocks/sensingblocks.h"
@@ -36,14 +38,26 @@ class SensingBlocksTest : public testing::Test
3638
m_extension->registerBlocks(m_engine);
3739
m_extension->onInit(m_engine);
3840
registerBlocks(m_engine, m_extension.get());
41+
42+
m_audioLoudness = std::make_shared<AudioLoudnessMock>();
43+
SensingBlocks::audioInput = &m_audioInput;
44+
EXPECT_CALL(m_audioInput, audioLoudness()).WillRepeatedly(Return(m_audioLoudness));
3945
}
4046

41-
void TearDown() override { SensingBlocks::clearQuestions(); }
47+
void TearDown() override
48+
{
49+
SensingBlocks::clearQuestions();
50+
SensingBlocks::audioInput = nullptr;
51+
}
4252

4353
std::unique_ptr<IExtension> m_extension;
4454
Project m_project;
4555
IEngine *m_engine = nullptr;
4656
EngineMock m_engineMock;
57+
std::shared_ptr<AudioLoudnessMock> m_audioLoudness;
58+
59+
private:
60+
AudioInputMock m_audioInput;
4761
};
4862

4963
TEST_F(SensingBlocksTest, TouchingObject_Sprite_CompileTime)
@@ -1362,3 +1376,23 @@ TEST_F(SensingBlocksTest, SetDragMode_Stage)
13621376

13631377
builder.run();
13641378
}
1379+
1380+
TEST_F(SensingBlocksTest, Loudness)
1381+
{
1382+
auto targetMock = std::make_shared<TargetMock>();
1383+
1384+
ScriptBuilder builder(m_extension.get(), m_engine, targetMock);
1385+
builder.addBlock("sensing_loudness");
1386+
Block *block = builder.currentBlock();
1387+
1388+
Compiler compiler(&m_engineMock, targetMock.get());
1389+
auto code = compiler.compile(block, Compiler::CodeType::Reporter);
1390+
Script script(targetMock.get(), block, &m_engineMock);
1391+
script.setCode(code);
1392+
Thread thread(targetMock.get(), &m_engineMock, &script);
1393+
1394+
EXPECT_CALL(*m_audioLoudness, getLoudness()).WillOnce(Return(62));
1395+
ValueData value = thread.runReporter();
1396+
ASSERT_EQ(value_toDouble(&value), 62);
1397+
value_free(&value);
1398+
}

0 commit comments

Comments
 (0)