mirror of
https://github.com/vsariola/sointu.git
synced 2025-06-04 01:28:45 -04:00
refactor: rename sointu.Render as AudioBuffer.Fill
The Render name misleading as it did not do the same thing as normal Synth.Render, because it disregarded time limits. Conceptually, as the function modifies the state of the synth, it would be better to be synth.Fill(audioBuffer), but we cannot define methods on interfaces; therefore, it is audioBuffer.Fill(synth) now.
This commit is contained in:
parent
ff4155a08e
commit
5bbec75120
14
audio.go
14
audio.go
@ -3,6 +3,7 @@ package sointu
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
)
|
)
|
||||||
@ -31,6 +32,19 @@ type (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Fill fills the AudioBuffer using a Synth, disregarding all syncs and time
|
||||||
|
// limits. Note that this will change the state of the Synth.
|
||||||
|
func (buffer AudioBuffer) Fill(synth Synth) error {
|
||||||
|
s, _, err := synth.Render(buffer, math.MaxInt32)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("synth.Render failed: %v", err)
|
||||||
|
}
|
||||||
|
if s != len(buffer) {
|
||||||
|
return errors.New("in AudioBuffer.Fill, synth.Render should have filled the whole buffer but did not")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Wav converts an AudioBuffer into a valid WAV-file, returned as a []byte
|
// Wav converts an AudioBuffer into a valid WAV-file, returned as a []byte
|
||||||
// array.
|
// array.
|
||||||
//
|
//
|
||||||
|
15
synth.go
15
synth.go
@ -1,9 +1,7 @@
|
|||||||
package sointu
|
package sointu
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@ -40,19 +38,6 @@ type (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Render fills an stereo audio buffer using a Synth, disregarding all syncs and
|
|
||||||
// time limits.
|
|
||||||
func Render(synth Synth, buffer AudioBuffer) error {
|
|
||||||
s, _, err := synth.Render(buffer, math.MaxInt32)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("sointu.Render failed: %v", err)
|
|
||||||
}
|
|
||||||
if s != len(buffer) {
|
|
||||||
return errors.New("in sointu.Render, synth.Render should have filled the whole buffer but did not")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Play plays the Song by first compiling the patch with the given Synther,
|
// Play plays the Song by first compiling the patch with the given Synther,
|
||||||
// returning the stereo audio buffer as a result (and possible errors).
|
// returning the stereo audio buffer as a result (and possible errors).
|
||||||
func Play(synther Synther, song Song) (AudioBuffer, error) {
|
func Play(synther Synther, song Song) (AudioBuffer, error) {
|
||||||
|
@ -60,12 +60,12 @@ func TestRenderSamples(t *testing.T) {
|
|||||||
}
|
}
|
||||||
synth.Trigger(0, 64)
|
synth.Trigger(0, 64)
|
||||||
buffer := make(sointu.AudioBuffer, su_max_samples)
|
buffer := make(sointu.AudioBuffer, su_max_samples)
|
||||||
err = sointu.Render(synth, buffer[:len(buffer)/2])
|
err = buffer[:len(buffer)/2].Fill(synth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("first render gave an error")
|
t.Fatalf("first render gave an error")
|
||||||
}
|
}
|
||||||
synth.Release(0)
|
synth.Release(0)
|
||||||
err = sointu.Render(synth, buffer[len(buffer)/2:])
|
err = buffer[len(buffer)/2:].Fill(synth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("first render gave an error")
|
t.Fatalf("first render gave an error")
|
||||||
}
|
}
|
||||||
@ -135,7 +135,7 @@ func TestStackUnderflow(t *testing.T) {
|
|||||||
t.Fatalf("bridge compile error: %v", err)
|
t.Fatalf("bridge compile error: %v", err)
|
||||||
}
|
}
|
||||||
buffer := make(sointu.AudioBuffer, 1)
|
buffer := make(sointu.AudioBuffer, 1)
|
||||||
err = sointu.Render(synth, buffer)
|
err = buffer.Fill(synth)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("rendering should have failed due to stack underflow")
|
t.Fatalf("rendering should have failed due to stack underflow")
|
||||||
}
|
}
|
||||||
@ -151,7 +151,7 @@ func TestStackBalancing(t *testing.T) {
|
|||||||
t.Fatalf("bridge compile error: %v", err)
|
t.Fatalf("bridge compile error: %v", err)
|
||||||
}
|
}
|
||||||
buffer := make(sointu.AudioBuffer, 1)
|
buffer := make(sointu.AudioBuffer, 1)
|
||||||
err = sointu.Render(synth, buffer)
|
err = buffer.Fill(synth)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("rendering should have failed due to unbalanced stack push/pop")
|
t.Fatalf("rendering should have failed due to unbalanced stack push/pop")
|
||||||
}
|
}
|
||||||
@ -184,7 +184,7 @@ func TestStackOverflow(t *testing.T) {
|
|||||||
t.Fatalf("bridge compile error: %v", err)
|
t.Fatalf("bridge compile error: %v", err)
|
||||||
}
|
}
|
||||||
buffer := make(sointu.AudioBuffer, 1)
|
buffer := make(sointu.AudioBuffer, 1)
|
||||||
err = sointu.Render(synth, buffer)
|
err = buffer.Fill(synth)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("rendering should have failed due to stack overflow, despite balanced push/pops")
|
t.Fatalf("rendering should have failed due to stack overflow, despite balanced push/pops")
|
||||||
}
|
}
|
||||||
@ -201,7 +201,7 @@ func TestDivideByZero(t *testing.T) {
|
|||||||
t.Fatalf("bridge compile error: %v", err)
|
t.Fatalf("bridge compile error: %v", err)
|
||||||
}
|
}
|
||||||
buffer := make(sointu.AudioBuffer, 1)
|
buffer := make(sointu.AudioBuffer, 1)
|
||||||
err = sointu.Render(synth, buffer)
|
err = buffer.Fill(synth)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("rendering should have failed due to divide by zero")
|
t.Fatalf("rendering should have failed due to divide by zero")
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,7 @@ func TestStackUnderflow(t *testing.T) {
|
|||||||
t.Fatalf("bridge compile error: %v", err)
|
t.Fatalf("bridge compile error: %v", err)
|
||||||
}
|
}
|
||||||
buffer := make(sointu.AudioBuffer, 1)
|
buffer := make(sointu.AudioBuffer, 1)
|
||||||
err = sointu.Render(synth, buffer)
|
err = buffer.Fill(synth)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("rendering should have failed due to stack underflow")
|
t.Fatalf("rendering should have failed due to stack underflow")
|
||||||
}
|
}
|
||||||
@ -99,7 +99,7 @@ func TestStackBalancing(t *testing.T) {
|
|||||||
t.Fatalf("bridge compile error: %v", err)
|
t.Fatalf("bridge compile error: %v", err)
|
||||||
}
|
}
|
||||||
buffer := make(sointu.AudioBuffer, 1)
|
buffer := make(sointu.AudioBuffer, 1)
|
||||||
err = sointu.Render(synth, buffer)
|
err = buffer.Fill(synth)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf("rendering should have failed due to unbalanced stack push/pop")
|
t.Fatalf("rendering should have failed due to unbalanced stack push/pop")
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user