v/GTT
1
0
mirror of https://github.com/eeeXun/GTT.git synced 2025-05-19 09:10:42 -07:00

refactor: defer SoundLock.Release function in PlayTTS

SoundLock should release before leaving the PlayTTS function
This commit is contained in:
eeeXun 2023-03-10 21:02:06 +08:00
parent ea1e23172c
commit 13e9f96c2b
4 changed files with 8 additions and 14 deletions

View File

@ -17,6 +17,7 @@ func (t *ApertiumTranslate) StopTTS() {
} }
func (t *ApertiumTranslate) PlayTTS(lang, message string) error { 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") return errors.New(t.EngineName + " does not support text to speech")
} }

View File

@ -17,6 +17,7 @@ func (t *ArgosTranslate) StopTTS() {
} }
func (t *ArgosTranslate) PlayTTS(lang, message string) error { 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") return errors.New(t.EngineName + " does not support text to speech")
} }

View File

@ -27,6 +27,8 @@ func (t *GoogleTranslate) StopTTS() {
} }
func (t *GoogleTranslate) PlayTTS(lang, message string) error { func (t *GoogleTranslate) PlayTTS(lang, message string) error {
defer t.SoundLock.Release()
urlStr := fmt.Sprintf( urlStr := fmt.Sprintf(
ttsURL, ttsURL,
url.QueryEscape(message), url.QueryEscape(message),
@ -34,17 +36,14 @@ func (t *GoogleTranslate) PlayTTS(lang, message string) error {
) )
res, err := http.Get(urlStr) res, err := http.Get(urlStr)
if err != nil { if err != nil {
t.SoundLock.Release()
return err return err
} }
decoder, err := mp3.NewDecoder(res.Body) decoder, err := mp3.NewDecoder(res.Body)
if err != nil { if err != nil {
t.SoundLock.Release()
return err return err
} }
otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2) otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2)
if err != nil { if err != nil {
t.SoundLock.Release()
return err return err
} }
<-readyChan <-readyChan
@ -52,16 +51,13 @@ func (t *GoogleTranslate) PlayTTS(lang, message string) error {
player.Play() player.Play()
for player.IsPlaying() { for player.IsPlaying() {
if t.SoundLock.Stop { if t.SoundLock.Stop {
t.SoundLock.Release()
return nil return nil
} }
time.Sleep(time.Millisecond) time.Sleep(time.Millisecond)
} }
if err = player.Close(); err != nil { if err = player.Close(); err != nil {
t.SoundLock.Release()
return err return err
} }
t.SoundLock.Release()
return nil return nil
} }

View File

@ -28,6 +28,8 @@ func (t *ReversoTranslate) StopTTS() {
} }
func (t *ReversoTranslate) PlayTTS(lang, message string) error { func (t *ReversoTranslate) PlayTTS(lang, message string) error {
defer t.SoundLock.Release()
name, ok := voiceName[lang] name, ok := voiceName[lang]
if !ok { if !ok {
return errors.New(t.EngineName + " does not support text to speech of " + lang) 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) req.Header.Add("User-Agent", userAgent)
res, err := http.DefaultClient.Do(req) res, err := http.DefaultClient.Do(req)
if err != nil { if err != nil {
t.SoundLock.Release()
return err return err
} }
decoder, err := mp3.NewDecoder(res.Body) decoder, err := mp3.NewDecoder(res.Body)
if err != nil { if err != nil {
t.SoundLock.Release()
return err return err
} }
otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2) otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2)
if err != nil { if err != nil {
t.SoundLock.Release()
return err return err
} }
<-readyChan <-readyChan
@ -59,17 +58,14 @@ func (t *ReversoTranslate) PlayTTS(lang, message string) error {
player.Play() player.Play()
for player.IsPlaying() { for player.IsPlaying() {
if t.SoundLock.Stop { if t.SoundLock.Stop {
t.SoundLock.Release()
return nil return nil
} else { } else {
time.Sleep(time.Millisecond) time.Sleep(time.Millisecond)
} }
} }
if err = player.Close(); err != nil { if err = player.Close(); err != nil {
t.SoundLock.Release()
return err return err
} }
t.SoundLock.Release()
return nil return nil
} }