Skip to content

Commit 321f239

Browse files
committed
Merge pull request #108384 from adamscott/fix-sample-deletion
[Web] Fix sample playback deletion and `AudioStreamPolyphonic` issue
2 parents c2202d3 + 1328921 commit 321f239

File tree

3 files changed

+26
-15
lines changed

3 files changed

+26
-15
lines changed

platform/web/js/libs/library_godot_audio.js

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ class SampleNode {
408408
* @returns {void}
409409
*/
410410
static delete(id) {
411-
GodotAudio.sampleNodes.delete(id);
411+
GodotAudio.deleteSampleNode(id);
412412
}
413413

414414
/**
@@ -776,15 +776,9 @@ class SampleNode {
776776
}
777777

778778
switch (self.getSample().loopMode) {
779-
case 'disabled': {
780-
const id = this.id;
779+
case 'disabled':
781780
self.stop();
782-
if (GodotAudio.sampleFinishedCallback != null) {
783-
const idCharPtr = GodotRuntime.allocString(id);
784-
GodotAudio.sampleFinishedCallback(idCharPtr);
785-
GodotRuntime.free(idCharPtr);
786-
}
787-
} break;
781+
break;
788782
case 'forward':
789783
case 'backward':
790784
self.restart();
@@ -1175,6 +1169,15 @@ const _GodotAudio = {
11751169
*/
11761170
sampleNodes: null,
11771171
SampleNode,
1172+
deleteSampleNode: (pSampleNodeId) => {
1173+
GodotAudio.sampleNodes.delete(pSampleNodeId);
1174+
if (GodotAudio.sampleFinishedCallback == null) {
1175+
return;
1176+
}
1177+
const sampleNodeIdPtr = GodotRuntime.allocString(pSampleNodeId);
1178+
GodotAudio.sampleFinishedCallback(sampleNodeIdPtr);
1179+
GodotRuntime.free(sampleNodeIdPtr);
1180+
},
11781181

11791182
// `Bus` class
11801183
/**

scene/resources/audio_stream_polyphonic.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,13 @@ AudioStreamPlaybackPolyphonic::ID AudioStreamPlaybackPolyphonic::play_stream(con
216216
: p_playback_type;
217217

218218
for (uint32_t i = 0; i < streams.size(); i++) {
219+
if (streams[i].active.is_set() && streams[i].stream_playback->get_is_sample()) {
220+
Ref<AudioSamplePlayback> active_sample_playback = streams[i].stream_playback->get_sample_playback();
221+
if (active_sample_playback.is_null() || !AudioServer::get_singleton()->is_sample_playback_active(active_sample_playback)) {
222+
streams[i].active.clear();
223+
}
224+
}
225+
219226
if (!streams[i].active.is_set()) {
220227
// Can use this stream, as it's not active.
221228
streams[i].stream = p_stream;

servers/audio_server.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,12 +1918,13 @@ void AudioServer::start_sample_playback(const Ref<AudioSamplePlayback> &p_playba
19181918

19191919
void AudioServer::stop_sample_playback(const Ref<AudioSamplePlayback> &p_playback) {
19201920
ERR_FAIL_COND_MSG(p_playback.is_null(), "Parameter p_playback is null.");
1921-
if (sample_playback_list.has(p_playback)) {
1922-
sample_playback_list.erase(p_playback);
1923-
AudioDriver::get_singleton()->stop_sample_playback(p_playback);
1924-
p_playback->stream_playback->set_sample_playback(nullptr);
1925-
stop_playback_stream(p_playback->stream_playback);
1921+
if (!sample_playback_list.has(p_playback)) {
1922+
return;
19261923
}
1924+
sample_playback_list.erase(p_playback);
1925+
AudioDriver::get_singleton()->stop_sample_playback(p_playback);
1926+
p_playback->stream_playback->set_sample_playback(nullptr);
1927+
stop_playback_stream(p_playback->stream_playback);
19271928
}
19281929

19291930
void AudioServer::set_sample_playback_pause(const Ref<AudioSamplePlayback> &p_playback, bool p_paused) {
@@ -1933,7 +1934,7 @@ void AudioServer::set_sample_playback_pause(const Ref<AudioSamplePlayback> &p_pl
19331934

19341935
bool AudioServer::is_sample_playback_active(const Ref<AudioSamplePlayback> &p_playback) {
19351936
ERR_FAIL_COND_V_MSG(p_playback.is_null(), false, "Parameter p_playback is null.");
1936-
return AudioDriver::get_singleton()->is_sample_playback_active(p_playback);
1937+
return sample_playback_list.has(p_playback);
19371938
}
19381939

19391940
double AudioServer::get_sample_playback_position(const Ref<AudioSamplePlayback> &p_playback) {

0 commit comments

Comments
 (0)