diff --git a/app/common/audio/audio.go b/app/common/audio/audio.go index cffc24a..af9d663 100644 --- a/app/common/audio/audio.go +++ b/app/common/audio/audio.go @@ -39,74 +39,80 @@ func CombineWAVFiles(dirPath, outputFilename string, pauseDuration time.Duration } for index, wavPath := range wavFiles { - file, err := os.Open(wavPath) - defer file.Close() - if err != nil { - return err - } - - decoder := wav.NewDecoder(file) - if !decoder.IsValidFile() { - return response.Err(fmt.Errorf("Invalid WAV file: " + wavPath)) - } + if err := func() error { + file, err := os.Open(wavPath) + if err != nil { + return err + } + defer file.Close() - pcmBuffer, err := decoder.FullPCMBuffer() - if err != nil { - return response.Err(err) - } + decoder := wav.NewDecoder(file) + if !decoder.IsValidFile() { + return response.Err(fmt.Errorf("Invalid WAV file: " + wavPath)) + } - if pcmBuffer.Format.SampleRate != sampleRate { - pcmBuffer, err = ResampleBuffer(pcmBuffer, sampleRate) + pcmBuffer, err := decoder.FullPCMBuffer() if err != nil { - response.Err(err) + return response.Err(err) } - } - if pcmBuffer.Format.NumChannels != channelCount { - pcmBuffer, err = ChangeChannelCount(pcmBuffer, channelCount) - if err != nil { - response.Err(err) + if pcmBuffer.Format.SampleRate != sampleRate { + pcmBuffer, err = ResampleBuffer(pcmBuffer, sampleRate) + if err != nil { + return response.Err(err) + } } - } - if pcmBuffer.SourceBitDepth != bitDepth { - pcmBuffer, err = ChangeBitDepth(pcmBuffer, bitDepth) - if err != nil { - response.Err(err) + if pcmBuffer.Format.NumChannels != channelCount { + pcmBuffer, err = ChangeChannelCount(pcmBuffer, channelCount) + if err != nil { + return response.Err(err) + } } - } - if index == 0 { - combinedBuffer = &audio.IntBuffer{ - Data: []int{}, - Format: pcmBuffer.Format, - SourceBitDepth: pcmBuffer.SourceBitDepth, + if pcmBuffer.SourceBitDepth != bitDepth { + pcmBuffer, err = ChangeBitDepth(pcmBuffer, bitDepth) + if err != nil { + return response.Err(err) + } } - } - combinedBuffer.Data = append(combinedBuffer.Data, pcmBuffer.Data...) + if index == 0 { + combinedBuffer = &audio.IntBuffer{ + Data: []int{}, + Format: pcmBuffer.Format, + SourceBitDepth: pcmBuffer.SourceBitDepth, + } + } - if index < len(wavFiles)-1 { - combinedBuffer.Data = append(combinedBuffer.Data, silenceBuffer.Data...) + combinedBuffer.Data = append(combinedBuffer.Data, pcmBuffer.Data...) + + if index < len(wavFiles)-1 { + combinedBuffer.Data = append(combinedBuffer.Data, silenceBuffer.Data...) + } + + return nil + }(); err != nil { + return err } } outputPath := filepath.Join(dirPath, outputFilename) combinedFile, err := os.Create(outputPath) if err != nil { - response.Err(err) + return response.Err(err) } defer combinedFile.Close() encoder := wav.NewEncoder(combinedFile, sampleRate, bitDepth, channelCount, 1) err = encoder.Write(combinedBuffer) if err != nil { - response.Err(err) + return response.Err(err) } err = encoder.Close() if err != nil { - response.Err(err) + return response.Err(err) } return nil diff --git a/app/common/audio/player/player.go b/app/common/audio/player/player.go index 97a5344..a2dddf7 100644 --- a/app/common/audio/player/player.go +++ b/app/common/audio/player/player.go @@ -5,6 +5,7 @@ import ( "os" "path/filepath" "strings" + "sync" "time" "github.com/gopxl/beep" @@ -15,6 +16,10 @@ import ( "github.com/gopxl/beep/wav" ) +const targetRate = beep.SampleRate(48000) + +var speakerInitOnce sync.Once + func PlayAudioFile(filePath string) error { if _, err := os.Stat(filePath); os.IsNotExist(err) { return fmt.Errorf("file not found: %s", filePath) @@ -48,8 +53,9 @@ func PlayAudioFile(filePath string) error { } defer streamer.Close() - targetRate := beep.SampleRate(48000) - speaker.Init(targetRate, targetRate.N(time.Second/10)) + speakerInitOnce.Do(func() { + speaker.Init(targetRate, targetRate.N(time.Second/10)) + }) var finalStreamer beep.Streamer = streamer if format.SampleRate != targetRate {