Skip to content

Commit 04a177f

Browse files
committed
add performer speed
1 parent 815ba23 commit 04a177f

16 files changed

Lines changed: 134 additions & 33 deletions

include/barelymusician.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,12 @@ BARELY_API void BarelyPerformer_Destroy(BarelyEngine* engine, uint32_t performer
544544
/// @return Position in beats.
545545
BARELY_API double BarelyPerformer_GetPosition(const BarelyEngine* engine, uint32_t performer_id);
546546

547+
/// Sets the playback speed of a performer.
548+
/// @param engine Pointer to engine.
549+
/// @param performer_id Performer identifier.
550+
/// @param speed Playback speed.
551+
BARELY_API void BarelyPerformer_SetSpeed(BarelyEngine* engine, uint32_t performer_id, double speed);
552+
547553
/// Sets the loop begin position of a performer.
548554
/// @param engine Pointer to engine.
549555
/// @param performer_id Performer identifier.
@@ -1003,6 +1009,10 @@ class Performer {
10031009
return BarelyPerformer_GetPosition(engine_, performer_id_);
10041010
}
10051011

1012+
/// Sets the playback speed.
1013+
/// @param speed Playback speed.
1014+
void SetSpeed(double speed) noexcept { BarelyPerformer_SetSpeed(engine_, performer_id_, speed); }
1015+
10061016
/// Sets the loop begin position.
10071017
/// @param loop_begin_position Loop begin position in beats.
10081018
void SetLoopBeginPosition(double loop_begin_position) noexcept {

platforms/godot/performer.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,39 +61,31 @@ BarelyPerformer::~BarelyPerformer() {
6161
BarelyPerformer_Destroy(BarelyEngine::get_singleton()->get(), performer_id_);
6262
}
6363

64-
void BarelyPerformer::start() {
65-
playing_ = true;
66-
BarelyPerformer_Start(BarelyEngine::get_singleton()->get(), performer_id_);
67-
}
68-
69-
void BarelyPerformer::stop() {
70-
playing_ = false;
71-
BarelyPerformer_Stop(BarelyEngine::get_singleton()->get(), performer_id_);
72-
}
73-
74-
void BarelyPerformer::set_position(double position) {
75-
BarelyPerformer_SetPosition(BarelyEngine::get_singleton()->get(), performer_id_, position);
76-
}
77-
7864
void BarelyPerformer::set_loop_begin_position(double loop_begin_position) {
7965
loop_begin_position_ = loop_begin_position;
80-
8166
BarelyPerformer_SetLoopBeginPosition(BarelyEngine::get_singleton()->get(), performer_id_,
8267
loop_begin_position_);
8368
}
8469

8570
void BarelyPerformer::set_loop_length(double loop_length) {
8671
loop_length_ = loop_length;
87-
8872
BarelyPerformer_SetLoopLength(BarelyEngine::get_singleton()->get(), performer_id_, loop_length_);
8973
}
9074

9175
void BarelyPerformer::set_looping(bool looping) {
9276
looping_ = looping;
93-
9477
BarelyPerformer_SetLooping(BarelyEngine::get_singleton()->get(), performer_id_, looping_);
9578
}
9679

80+
void BarelyPerformer::set_position(double position) {
81+
BarelyPerformer_SetPosition(BarelyEngine::get_singleton()->get(), performer_id_, position);
82+
}
83+
84+
void BarelyPerformer::set_speed(double speed) {
85+
speed_ = speed;
86+
BarelyPerformer_SetSpeed(BarelyEngine::get_singleton()->get(), performer_id_, speed_);
87+
}
88+
9789
void BarelyPerformer::set_tasks(const TypedArray<Ref<BarelyTaskResource>>& tasks) {
9890
for (int i = 0; i < tasks_.size(); ++i) {
9991
Ref<BarelyTaskResource> task = tasks_[i];
@@ -111,6 +103,16 @@ void BarelyPerformer::set_tasks(const TypedArray<Ref<BarelyTaskResource>>& tasks
111103
_on_task_changed();
112104
}
113105

106+
void BarelyPerformer::start() {
107+
playing_ = true;
108+
BarelyPerformer_Start(BarelyEngine::get_singleton()->get(), performer_id_);
109+
}
110+
111+
void BarelyPerformer::stop() {
112+
playing_ = false;
113+
BarelyPerformer_Stop(BarelyEngine::get_singleton()->get(), performer_id_);
114+
}
115+
114116
double BarelyPerformer::get_position() const {
115117
return BarelyPerformer_GetPosition(BarelyEngine::get_singleton()->get(), performer_id_);
116118
}
@@ -132,6 +134,8 @@ void BarelyPerformer::_bind_methods() {
132134
ClassDB::bind_method(D_METHOD("get_loop_length"), &BarelyPerformer::get_loop_length);
133135
ClassDB::bind_method(D_METHOD("set_looping", "looping"), &BarelyPerformer::set_looping);
134136
ClassDB::bind_method(D_METHOD("is_looping"), &BarelyPerformer::is_looping);
137+
ClassDB::bind_method(D_METHOD("set_speed", "speed"), &BarelyPerformer::set_speed);
138+
ClassDB::bind_method(D_METHOD("get_speed"), &BarelyPerformer::get_speed);
135139

136140
ClassDB::bind_method(D_METHOD("set_tasks", "tasks"), &BarelyPerformer::set_tasks);
137141
ClassDB::bind_method(D_METHOD("get_tasks"), &BarelyPerformer::get_tasks);
@@ -141,6 +145,7 @@ void BarelyPerformer::_bind_methods() {
141145
"get_loop_begin_position");
142146
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "loop_length"), "set_loop_length", "get_loop_length");
143147
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "looping"), "set_looping", "is_looping");
148+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "speed"), "set_speed", "get_speed");
144149

145150
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "position"), "set_position", "get_position");
146151
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "tasks", PropertyHint::PROPERTY_HINT_ARRAY_TYPE,

platforms/godot/performer.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,22 @@ class BarelyPerformer : public ::godot::Node {
3636
BarelyPerformer();
3737
~BarelyPerformer();
3838

39-
void start();
40-
void stop();
41-
42-
void set_position(double position);
4339
void set_loop_begin_position(double position);
4440
void set_loop_length(double length);
4541
void set_looping(bool looping);
42+
void set_position(double position);
43+
void set_speed(double speed);
4644

4745
void set_tasks(const ::godot::TypedArray<::godot::Ref<BarelyTaskResource>>& tasks);
4846

47+
void start();
48+
void stop();
49+
4950
double get_position() const;
5051

5152
double get_loop_begin_position() const { return loop_begin_position_; }
5253
double get_loop_length() const { return loop_length_; }
54+
double get_speed() const { return speed_; }
5355
bool is_looping() const { return looping_; }
5456
bool is_playing() const { return playing_; }
5557

@@ -64,6 +66,7 @@ class BarelyPerformer : public ::godot::Node {
6466

6567
double loop_begin_position_ = 0.0;
6668
double loop_length_ = 1.0;
69+
double speed_ = 1.0;
6770
bool looping_ = false;
6871
bool playing_ = false;
6972

platforms/unity/Assets/BarelyMusician/Scripts/Engine.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,10 @@ public static void Performer_SetPosition(UInt32 performerId, double position) {
552552
BarelyPerformer_SetPosition(_handle, performerId, position);
553553
}
554554

555+
public static void Performer_SetSpeed(UInt32 performerId, double speed) {
556+
BarelyPerformer_SetSpeed(_handle, performerId, speed);
557+
}
558+
555559
public static void Performer_Start(UInt32 performerId) {
556560
BarelyPerformer_Start(_handle, performerId);
557561
}
@@ -922,6 +926,10 @@ private static extern void BarelyPerformer_SetLooping(IntPtr engine, UInt32 perf
922926
private static extern void BarelyPerformer_SetPosition(IntPtr engine, UInt32 performerId,
923927
double position);
924928

929+
[DllImport(_pluginName, EntryPoint = "BarelyPerformer_SetSpeed")]
930+
private static extern void BarelyPerformer_SetSpeed(IntPtr engine, UInt32 performerId,
931+
double speed);
932+
925933
[DllImport(_pluginName, EntryPoint = "BarelyPerformer_Start")]
926934
private static extern void BarelyPerformer_Start(IntPtr engine, UInt32 performerId);
927935

platforms/unity/Assets/BarelyMusician/Scripts/Performer.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@ public double LoopLength {
5555
[Min(0.0f)]
5656
private double _loopLength = 1.0;
5757

58+
/// Speed.
59+
public double Speed {
60+
get { return _speed; }
61+
set {
62+
if (_id == 0) {
63+
_speed = value;
64+
return;
65+
}
66+
Engine.Internal.Performer_SetSpeed(_id, value);
67+
_speed = value;
68+
}
69+
}
70+
[SerializeField]
71+
[Min(0.0f)]
72+
private double _speed = 1.0;
73+
5874
/// List of recurring tasks.
5975
public List<Task> Tasks = new List<Task>();
6076

@@ -112,6 +128,7 @@ private void Update() {
112128
Loop = _loop;
113129
LoopBeginPosition = _loopBeginPosition;
114130
LoopLength = _loopLength;
131+
Speed = _speed;
115132
for (int i = 0; i < Tasks.Count; ++i) {
116133
Tasks[i].Update(this);
117134
}

platforms/unity/unity_android.lds

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ VERS_1.0 {
2424
BarelyPerformer_SetLoopLength;
2525
BarelyPerformer_SetLooping;
2626
BarelyPerformer_SetPosition;
27+
BarelyPerformer_SetSpeed;
2728
BarelyPerformer_Start;
2829
BarelyPerformer_Stop;
2930
BarelyTask_Destroy;

platforms/unity/unity_windows.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ EXPORTS
2525
BarelyPerformer_SetLoopLength
2626
BarelyPerformer_SetLooping
2727
BarelyPerformer_SetPosition
28+
BarelyPerformer_SetSpeed
2829
BarelyPerformer_Start
2930
BarelyPerformer_Stop
3031
BarelyTask_Destroy

platforms/wasm/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ set(BARELY_EXPORTED_FUNCTIONS "['_malloc','_free',
2323
'_BarelyPerformer_SetLoopLength',
2424
'_BarelyPerformer_SetLooping',
2525
'_BarelyPerformer_SetPosition',
26+
'_BarelyPerformer_SetSpeed',
2627
'_BarelyPerformer_Start',
2728
'_BarelyPerformer_Stop',
2829
'_BarelyTask_Destroy',

platforms/wasm/src/command.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,17 @@ export const CommandType = Object.freeze({
2121
PERFORMER_SET_LOOP_LENGTH: 13,
2222
PERFORMER_SET_LOOPING: 14,
2323
PERFORMER_SET_POSITION: 15,
24-
PERFORMER_START: 16,
25-
PERFORMER_STOP: 17,
26-
PERFORMER_SYNC_TO: 18,
24+
PERFORMER_SET_SPEED: 16,
25+
PERFORMER_START: 17,
26+
PERFORMER_STOP: 18,
27+
PERFORMER_SYNC_TO: 19,
2728

28-
TASK_CREATE: 19,
29-
TASK_DESTROY: 20,
30-
TASK_SET_COMMANDS: 21,
31-
TASK_SET_DURATION: 22,
32-
TASK_SET_POSITION: 23,
33-
TASK_SET_PRIORITY: 24,
29+
TASK_CREATE: 20,
30+
TASK_DESTROY: 21,
31+
TASK_SET_COMMANDS: 22,
32+
TASK_SET_DURATION: 23,
33+
TASK_SET_POSITION: 24,
34+
TASK_SET_PRIORITY: 25,
3435
});
3536

3637
/**
@@ -87,6 +88,7 @@ class CommandFactory {
8788
({type: CommandType.PERFORMER_SET_LOOP_LENGTH, handle, loopLength}),
8889
setLooping: (isLooping) => ({type: CommandType.PERFORMER_SET_LOOPING, handle, isLooping}),
8990
setPosition: (position) => ({type: CommandType.PERFORMER_SET_POSITION, handle, position}),
91+
setSpeed: (speed) => ({type: CommandType.PERFORMER_SET_SPEED, handle, speed}),
9092
start: () => ({type: CommandType.PERFORMER_START, handle}),
9193
stop: () => ({type: CommandType.PERFORMER_STOP, handle}),
9294
syncTo: (otherHandle, offset = 0.0) =>

platforms/wasm/src/performer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ export class Performer {
5656
{type: CommandType.PERFORMER_SET_POSITION, handle: this._handle, position});
5757
}
5858

59+
/** @param {number} speed */
60+
setSpeed(speed) {
61+
this._engine._pushCommand({type: CommandType.PERFORMER_SET_SPEED, handle: this._handle, speed});
62+
}
63+
5964
/** Starts the playback. */
6065
start() {
6166
this._isPlaying = true;

0 commit comments

Comments
 (0)