From 13e9f96c2b2c2676ea91e7bd6e7b090e19a114ae Mon Sep 17 00:00:00 2001 From: eeeXun Date: Fri, 10 Mar 2023 21:02:06 +0800 Subject: [PATCH] refactor: defer `SoundLock.Release` function in PlayTTS SoundLock should release before leaving the PlayTTS function --- internal/translate/apertiumtranslate/tts.go | 3 ++- internal/translate/argostranslate/tts.go | 3 ++- internal/translate/googletranslate/tts.go | 8 ++------ internal/translate/reversotranslate/tts.go | 8 ++------ 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/internal/translate/apertiumtranslate/tts.go b/internal/translate/apertiumtranslate/tts.go index 206a08d..0ce8d16 100644 --- a/internal/translate/apertiumtranslate/tts.go +++ b/internal/translate/apertiumtranslate/tts.go @@ -17,6 +17,7 @@ func (t *ApertiumTranslate) StopTTS() { } func (t *ApertiumTranslate) PlayTTS(lang, message string) error { - t.SoundLock.Release() + defer t.SoundLock.Release() + return errors.New(t.EngineName + " does not support text to speech") } diff --git a/internal/translate/argostranslate/tts.go b/internal/translate/argostranslate/tts.go index ef53866..045a4af 100644 --- a/internal/translate/argostranslate/tts.go +++ b/internal/translate/argostranslate/tts.go @@ -17,6 +17,7 @@ func (t *ArgosTranslate) StopTTS() { } func (t *ArgosTranslate) PlayTTS(lang, message string) error { - t.SoundLock.Release() + defer t.SoundLock.Release() + return errors.New(t.EngineName + " does not support text to speech") } diff --git a/internal/translate/googletranslate/tts.go b/internal/translate/googletranslate/tts.go index e0ff87d..cdb41d8 100644 --- a/internal/translate/googletranslate/tts.go +++ b/internal/translate/googletranslate/tts.go @@ -27,6 +27,8 @@ func (t *GoogleTranslate) StopTTS() { } func (t *GoogleTranslate) PlayTTS(lang, message string) error { + defer t.SoundLock.Release() + urlStr := fmt.Sprintf( ttsURL, url.QueryEscape(message), @@ -34,17 +36,14 @@ func (t *GoogleTranslate) PlayTTS(lang, message string) error { ) res, err := http.Get(urlStr) if err != nil { - t.SoundLock.Release() return err } decoder, err := mp3.NewDecoder(res.Body) if err != nil { - t.SoundLock.Release() return err } otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2) if err != nil { - t.SoundLock.Release() return err } <-readyChan @@ -52,16 +51,13 @@ func (t *GoogleTranslate) PlayTTS(lang, message string) error { player.Play() for player.IsPlaying() { if t.SoundLock.Stop { - t.SoundLock.Release() return nil } time.Sleep(time.Millisecond) } if err = player.Close(); err != nil { - t.SoundLock.Release() return err } - t.SoundLock.Release() return nil } diff --git a/internal/translate/reversotranslate/tts.go b/internal/translate/reversotranslate/tts.go index 35b96de..b1fa754 100644 --- a/internal/translate/reversotranslate/tts.go +++ b/internal/translate/reversotranslate/tts.go @@ -28,6 +28,8 @@ func (t *ReversoTranslate) StopTTS() { } func (t *ReversoTranslate) PlayTTS(lang, message string) error { + defer t.SoundLock.Release() + name, ok := voiceName[lang] if !ok { return errors.New(t.EngineName + " does not support text to speech of " + lang) @@ -41,17 +43,14 @@ func (t *ReversoTranslate) PlayTTS(lang, message string) error { req.Header.Add("User-Agent", userAgent) res, err := http.DefaultClient.Do(req) if err != nil { - t.SoundLock.Release() return err } decoder, err := mp3.NewDecoder(res.Body) if err != nil { - t.SoundLock.Release() return err } otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2) if err != nil { - t.SoundLock.Release() return err } <-readyChan @@ -59,17 +58,14 @@ func (t *ReversoTranslate) PlayTTS(lang, message string) error { player.Play() for player.IsPlaying() { if t.SoundLock.Stop { - t.SoundLock.Release() return nil } else { time.Sleep(time.Millisecond) } } if err = player.Close(); err != nil { - t.SoundLock.Release() return err } - t.SoundLock.Release() return nil }