#AudioStreamGenerator / AudioStreamGeneratorPlayback

4 messages · Page 1 of 1 (latest)

pine obsidian
#

I followed a guide for a 3.x project that uses this, but when I try this in Godot 4, it doesn't work.

extends Node


var sample_hz = 22050.0 # Keep the number of samples to mix low, GDScript is not super fast.
var pulse_hz = 440.0
var phase = 0.0

var playback: AudioStreamPlayback = null # Actual playback stream, assigned in _ready().


func _process(_delta):
    _fill_buffer()


func _fill_buffer():
    var increment = pulse_hz / sample_hz

    var to_fill = playback.get_frames_available()
    while to_fill > 0:
        playback.push_frame(Vector2.ONE * sin(phase * TAU)) # Audio frames are stereo.
        phase = fmod(phase + increment, 1.0)
        to_fill -= 1


func _ready():
    $Player.stream.mix_rate = sample_hz # Setting mix rate is only possible before play().
    playback = $Player.get_stream_playback()
    _fill_buffer() # Prefill, do before play() to avoid delay.
    $Player.play()

#

if anyone knows how to properly construct the stream using AudioStreamGeneratorPlayback and create a simple sine or something, an example would be hugely appreciated!!!

pine obsidian
#
extends Node
var sample_rate = 44100.0
var frequency = 440.0
var phase = 0.0
var buffer_length = 0.1

@onready var audio_stream_player = AudioStreamPlayer.new()
@onready var audio_stream_generator_playback = null
@onready var audio_stream_generator = AudioStreamGenerator.new()

func _ready():
    audio_stream_generator.mix_rate = sample_rate
    audio_stream_generator.buffer_length = buffer_length
    
    audio_stream_player.stream = audio_stream_generator
    add_child(audio_stream_player)
    
    audio_stream_player.play()
    audio_stream_generator_playback = audio_stream_player.get_stream_playback()

func _process(_delta):
    var frames_available = audio_stream_generator_playback.get_frames_available()
    if frames_available > 0:
        var buffer = PackedVector2Array()
        buffer.resize(frames_available)
        for buffer_index in range(frames_available):
            var value = sin(phase * 2.0 * PI * frequency / sample_rate)
            buffer[buffer_index] = Vector2(value, value)
            phase += 1
        audio_stream_generator_playback.push_buffer(buffer)

OK, I managed to make a sine wave in godot 4, noice!