From 4a5270129ac2cb47c722357f6dffd4eb411ec8c2 Mon Sep 17 00:00:00 2001 From: bloeys Date: Sun, 26 Jun 2022 02:33:48 +0400 Subject: [PATCH] Wav file loading --- go.mod | 7 ++- go.sum | 6 +++ sound_enums.go | 1 + test_audio_files/camera.wav | Bin 0 -> 69198 bytes test_audio_files/license.txt | 11 +++++ wavy.go | 87 +++++++++++++++++++++-------------- wavy_test.go | 17 +++++-- 7 files changed, 89 insertions(+), 40 deletions(-) create mode 100755 test_audio_files/camera.wav create mode 100755 test_audio_files/license.txt diff --git a/go.mod b/go.mod index f5d8c34..c2f9ac9 100755 --- a/go.mod +++ b/go.mod @@ -7,4 +7,9 @@ require ( github.com/hajimehoshi/oto/v2 v2.1.0 ) -require golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f // indirect +require ( + github.com/go-audio/audio v1.0.0 // indirect + github.com/go-audio/riff v1.0.0 // indirect + github.com/go-audio/wav v1.1.0 // indirect + golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f // indirect +) diff --git a/go.sum b/go.sum index f8e07e5..ec8ba10 100755 --- a/go.sum +++ b/go.sum @@ -1,3 +1,9 @@ +github.com/go-audio/audio v1.0.0 h1:zS9vebldgbQqktK4H0lUqWrG8P0NxCJVqcj7ZpNnwd4= +github.com/go-audio/audio v1.0.0/go.mod h1:6uAu0+H2lHkwdGsAY+j2wHPNPpPoeg5AaEFh9FlA+Zs= +github.com/go-audio/riff v1.0.0 h1:d8iCGbDvox9BfLagY94fBynxSPHO80LmZCaOsmKxokA= +github.com/go-audio/riff v1.0.0/go.mod h1:l3cQwc85y79NQFCRB7TiPoNiaijp6q8Z0Uv38rVG498= +github.com/go-audio/wav v1.1.0 h1:jQgLtbqBzY7G+BM8fXF7AHUk1uHUviWS4X39d5rsL2g= +github.com/go-audio/wav v1.1.0/go.mod h1:mpe9qfwbScEbkd8uybLuIpTgHyrISw/OTuvjUW2iGtE= github.com/hajimehoshi/go-mp3 v0.3.3 h1:cWnfRdpye2m9ElSoVqneYRcpt/l3ijttgjMeQh+r+FE= github.com/hajimehoshi/go-mp3 v0.3.3/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM= github.com/hajimehoshi/oto v0.6.1/go.mod h1:0QXGEkbuJRohbJaxr7ZQSxnju7hEhseiPx2hrh6raOI= diff --git a/sound_enums.go b/sound_enums.go index b21251d..ed407c5 100755 --- a/sound_enums.go +++ b/sound_enums.go @@ -5,6 +5,7 @@ type SoundType int const ( SoundType_Unknown SoundType = iota SoundType_MP3 + SoundType_WAV ) type SampleRate int diff --git a/test_audio_files/camera.wav b/test_audio_files/camera.wav new file mode 100755 index 0000000000000000000000000000000000000000..2b8bc26b671f65320ab274cd56491612793a127e GIT binary patch literal 69198 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 literal 0 HcmV?d00001 diff --git a/test_audio_files/license.txt b/test_audio_files/license.txt new file mode 100755 index 0000000..2c43e82 --- /dev/null +++ b/test_audio_files/license.txt @@ -0,0 +1,11 @@ + +"Free Sounds Library" + + +Free Sound Effects Site. + + +Licence: License: Attribution 4.0 International (CC BY 4.0). You are allowed to use sound effects free of charge and royalty free in your multimedia projects for commercial or non-commercial purposes. + + +http://www.freesoundslibrary.com \ No newline at end of file diff --git a/wavy.go b/wavy.go index d124f0c..ec67dfe 100644 --- a/wavy.go +++ b/wavy.go @@ -7,9 +7,9 @@ import ( "io" "os" "path" - "strings" "time" + "github.com/go-audio/wav" "github.com/hajimehoshi/go-mp3" "github.com/hajimehoshi/oto/v2" ) @@ -52,7 +52,7 @@ var ( //Pre-defined errors var ( - ErrunknownSoundType = errors.New("unknown sound type. Sound file extension must be one of: .mp3") + errUnknownSoundType = errors.New("unknown sound type. Sound file extension must be one of: .mp3") ) //Init prepares the default audio device and does any required setup. @@ -354,14 +354,9 @@ func ResumeAllSounds() { //Good for large sound files func NewSoundStreaming(fpath string) (s *Sound, err error) { - //Error checking filetype - soundType := SoundType_Unknown - if strings.HasSuffix(fpath, ".mp3") { - soundType = SoundType_MP3 - } - + soundType := GetSoundFileType(fpath) if soundType == SoundType_Unknown { - return nil, ErrunknownSoundType + return nil, errUnknownSoundType } //We read file but don't close so the player can stream the file any time later @@ -378,17 +373,9 @@ func NewSoundStreaming(fpath string) (s *Sound, err error) { }, } - //Load file depending on type - if soundType == SoundType_MP3 { - - dec, err := mp3.NewDecoder(file) - if err != nil { - return nil, err - } - - s.Info.Size = dec.Length() - s.Player = Ctx.NewPlayer(dec) - s.Data = dec + err = soundFromReaderSeeker(file, s) + if err != nil { + return nil, getLoadingErr(fpath, err) } return s, nil @@ -397,19 +384,14 @@ func NewSoundStreaming(fpath string) (s *Sound, err error) { //NewSoundMem loads the entire sound file into memory func NewSoundMem(fpath string) (s *Sound, err error) { - //Error checking filetype - soundType := SoundType_Unknown - if strings.HasSuffix(fpath, ".mp3") { - soundType = SoundType_MP3 - } - + soundType := GetSoundFileType(fpath) if soundType == SoundType_Unknown { - return nil, ErrunknownSoundType + return nil, getLoadingErr(fpath, errUnknownSoundType) } fileBytes, err := os.ReadFile(fpath) if err != nil { - return nil, err + return nil, getLoadingErr(fpath, err) } bytesReader := bytes.NewReader(fileBytes) @@ -420,34 +402,69 @@ func NewSoundMem(fpath string) (s *Sound, err error) { }, } - //Load file depending on type - if soundType == SoundType_MP3 { + err = soundFromReaderSeeker(bytesReader, s) + if err != nil { + return nil, getLoadingErr(fpath, err) + } - dec, err := mp3.NewDecoder(bytesReader) + return s, nil +} + +func getLoadingErr(fpath string, err error) error { + return fmt.Errorf("failed to load '%s' with err '%s'", fpath, err.Error()) +} + +func soundFromReaderSeeker(r io.ReadSeeker, s *Sound) error { + + if s.Info.Type == SoundType_MP3 { + + dec, err := mp3.NewDecoder(r) if err != nil { - return nil, err + return err } finalBuf, err := ReadAllFromReader(dec, 0, uint64(dec.Length())) if err != nil { - return nil, err + return err } sb := &SoundBuffer{Data: finalBuf} s.Data = sb s.Player = Ctx.NewPlayer(sb) s.Info.Size = int64(len(sb.Data)) + return nil + + } else if s.Info.Type == SoundType_WAV { + + wavDec := wav.NewDecoder(r) + err := wavDec.FwdToPCM() + if err != nil { + return err + } + + finalBuf, err := ReadAllFromReader(wavDec.PCMChunk, 0, uint64(wavDec.PCMSize)) + if err != nil { + return err + } + + sb := &SoundBuffer{Data: finalBuf} + s.Data = sb + s.Player = Ctx.NewPlayer(sb) + s.Info.Size = int64(len(sb.Data)) + return nil } - return s, nil + panic("invalid sound type") } func GetSoundFileType(fpath string) SoundType { ext := path.Ext(fpath) switch ext { - case "mp3": + case ".mp3": return SoundType_MP3 + case ".wav", ".wave": + return SoundType_WAV default: return SoundType_Unknown } diff --git a/wavy_test.go b/wavy_test.go index 1333d5e..fb43839 100755 --- a/wavy_test.go +++ b/wavy_test.go @@ -9,16 +9,16 @@ import ( func TestSound(t *testing.T) { - fatihaFilepath := "./test_audio_files/Fatiha.mp3" - tadaFilepath := "./test_audio_files/tada.mp3" - const fatihaLenMS = 55484 - err := wavy.Init(wavy.SampleRate_44100, wavy.SoundChannelCount_2, wavy.SoundBitDepth_2) if err != nil { t.Errorf("Failed to init wavy. Err: %s\n", err) return } + const fatihaFilepath = "./test_audio_files/Fatiha.mp3" + const tadaFilepath = "./test_audio_files/tada.mp3" + const fatihaLenMS = 55484 + //Streaming s, err := wavy.NewSoundStreaming(fatihaFilepath) if err != nil { @@ -103,6 +103,15 @@ func TestSound(t *testing.T) { s3 := wavy.ClipInMemSoundPercent(s2, 0, 0.25) s3.LoopAsync(3) s3.WaitLoop() + + //Wav + const wavFPath = "./test_audio_files/camera.wav" + s, err = wavy.NewSoundMem(wavFPath) + if err != nil { + t.Errorf("Failed to load memory sound with path '%s'. Err: %s\n", wavFPath, err) + return + } + s.PlaySync() } func TestByteCountFromPlayTime(t *testing.T) {