Merge pull request #95862 from adamscott/fix-pitch-scale-before-play

Honor `pitch_scale` value before playing audio sample
This commit is contained in:
Rémi Verschelde 2024-08-25 22:24:17 +02:00
commit 1d3bdfcd06
No known key found for this signature in database
GPG key ID: C3336907360768E1
5 changed files with 11 additions and 4 deletions

View file

@ -294,6 +294,7 @@ void AudioDriverWeb::start_sample_playback(const Ref<AudioSamplePlayback> &p_pla
itos(p_playback->stream->get_instance_id()).utf8().get_data(), itos(p_playback->stream->get_instance_id()).utf8().get_data(),
AudioServer::get_singleton()->get_bus_index(p_playback->bus), AudioServer::get_singleton()->get_bus_index(p_playback->bus),
p_playback->offset, p_playback->offset,
p_playback->pitch_scale,
volume_ptrw); volume_ptrw);
} }

View file

@ -51,7 +51,7 @@ extern void godot_audio_input_stop();
extern int godot_audio_sample_stream_is_registered(const char *p_stream_object_id); extern int godot_audio_sample_stream_is_registered(const char *p_stream_object_id);
extern void godot_audio_sample_register_stream(const char *p_stream_object_id, float *p_frames_buf, int p_frames_total, const char *p_loop_mode, int p_loop_begin, int p_loop_end); extern void godot_audio_sample_register_stream(const char *p_stream_object_id, float *p_frames_buf, int p_frames_total, const char *p_loop_mode, int p_loop_begin, int p_loop_end);
extern void godot_audio_sample_unregister_stream(const char *p_stream_object_id); extern void godot_audio_sample_unregister_stream(const char *p_stream_object_id);
extern void godot_audio_sample_start(const char *p_playback_object_id, const char *p_stream_object_id, int p_bus_index, float p_offset, float *p_volume_ptr); extern void godot_audio_sample_start(const char *p_playback_object_id, const char *p_stream_object_id, int p_bus_index, float p_offset, float p_pitch_scale, float *p_volume_ptr);
extern void godot_audio_sample_stop(const char *p_playback_object_id); extern void godot_audio_sample_stop(const char *p_playback_object_id);
extern void godot_audio_sample_set_pause(const char *p_playback_object_id, bool p_pause); extern void godot_audio_sample_set_pause(const char *p_playback_object_id, bool p_pause);
extern int godot_audio_sample_is_active(const char *p_playback_object_id); extern int godot_audio_sample_is_active(const char *p_playback_object_id);

View file

@ -328,6 +328,7 @@ class SampleNodeBus {
* offset?: number * offset?: number
* playbackRate?: number * playbackRate?: number
* startTime?: number * startTime?: number
* pitchScale?: number
* loopMode?: LoopMode * loopMode?: LoopMode
* volume?: Float32Array * volume?: Float32Array
* start?: boolean * start?: boolean
@ -438,7 +439,7 @@ class SampleNode {
/** @type {LoopMode} */ /** @type {LoopMode} */
this.loopMode = options.loopMode ?? this.getSample().loopMode ?? 'disabled'; this.loopMode = options.loopMode ?? this.getSample().loopMode ?? 'disabled';
/** @type {number} */ /** @type {number} */
this._pitchScale = 1; this._pitchScale = options.pitchScale ?? 1;
/** @type {number} */ /** @type {number} */
this._sourceStartTime = 0; this._sourceStartTime = 0;
/** @type {Map<Bus, SampleNodeBus>} */ /** @type {Map<Bus, SampleNodeBus>} */
@ -1648,13 +1649,14 @@ const _GodotAudio = {
}, },
godot_audio_sample_start__proxy: 'sync', godot_audio_sample_start__proxy: 'sync',
godot_audio_sample_start__sig: 'viiiii', godot_audio_sample_start__sig: 'viiiifi',
/** /**
* Starts a sample. * Starts a sample.
* @param {number} playbackObjectIdStrPtr Playback object id pointer * @param {number} playbackObjectIdStrPtr Playback object id pointer
* @param {number} streamObjectIdStrPtr Stream object id pointer * @param {number} streamObjectIdStrPtr Stream object id pointer
* @param {number} busIndex Bus index * @param {number} busIndex Bus index
* @param {number} offset Sample offset * @param {number} offset Sample offset
* @param {number} pitchScale Pitch scale
* @param {number} volumePtr Volume pointer * @param {number} volumePtr Volume pointer
* @returns {void} * @returns {void}
*/ */
@ -1663,6 +1665,7 @@ const _GodotAudio = {
streamObjectIdStrPtr, streamObjectIdStrPtr,
busIndex, busIndex,
offset, offset,
pitchScale,
volumePtr volumePtr
) { ) {
/** @type {string} */ /** @type {string} */
@ -1671,11 +1674,12 @@ const _GodotAudio = {
const streamObjectId = GodotRuntime.parseString(streamObjectIdStrPtr); const streamObjectId = GodotRuntime.parseString(streamObjectIdStrPtr);
/** @type {Float32Array} */ /** @type {Float32Array} */
const volume = GodotRuntime.heapSub(HEAPF32, volumePtr, 8); const volume = GodotRuntime.heapSub(HEAPF32, volumePtr, 8);
/** @type {SampleNodeConstructorOptions} */ /** @type {SampleNodeOptions} */
const startOptions = { const startOptions = {
offset, offset,
volume, volume,
playbackRate: 1, playbackRate: 1,
pitchScale,
start: true, start: true,
}; };
GodotAudio.start_sample( GodotAudio.start_sample(

View file

@ -152,6 +152,7 @@ Ref<AudioStreamPlayback> AudioStreamPlayerInternal::play_basic() {
Ref<AudioSamplePlayback> sample_playback; Ref<AudioSamplePlayback> sample_playback;
sample_playback.instantiate(); sample_playback.instantiate();
sample_playback->stream = stream; sample_playback->stream = stream;
sample_playback->pitch_scale = pitch_scale;
stream_playback->set_sample_playback(sample_playback); stream_playback->set_sample_playback(sample_playback);
} }
} else if (!stream->is_meta_stream()) { } else if (!stream->is_meta_stream()) {

View file

@ -50,6 +50,7 @@ public:
Ref<AudioStream> stream; Ref<AudioStream> stream;
float offset = 0.0f; float offset = 0.0f;
float pitch_scale = 1.0;
Vector<AudioFrame> volume_vector; Vector<AudioFrame> volume_vector;
StringName bus; StringName bus;
}; };