Skip to content

Commit 98ff8c0

Browse files
committed
added soundcard detection change functionality. Sometimes IBMTTS was not able to detect those changes, E.G. when connecting a new sound device output.
some internal code changes. updated changelog.
1 parent ffa5363 commit 98ff8c0

File tree

5 files changed

+90
-80
lines changed

5 files changed

+90
-80
lines changed

IBMTTS.pot

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
#, fuzzy
77
msgid ""
88
msgstr ""
9-
"Project-Id-Version: 'IBMTTS' 'v22.07.1'\n"
9+
"Project-Id-Version: 'IBMTTS' 'v22.07.3'\n"
1010
"Report-Msgid-Bugs-To: 'nvda-translations@freelists.org'\n"
11-
"POT-Creation-Date: 2022-07-04 19:57-0600\n"
11+
"POT-Creation-Date: 2022-08-16 21:09-0600\n"
1212
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,111 +17,111 @@ msgstr ""
1717
"Content-Type: text/plain; charset=CHARSET\n"
1818
"Content-Transfer-Encoding: 8bit\n"
1919

20-
#: addon\synthDrivers\_ibmeci.py:59
20+
#: addon\synthDrivers\_ibmeci.py:61
2121
msgid "Castilian Spanish"
2222
msgstr ""
2323

24-
#: addon\synthDrivers\_ibmeci.py:60
24+
#: addon\synthDrivers\_ibmeci.py:62
2525
msgid "Latin American Spanish"
2626
msgstr ""
2727

28-
#: addon\synthDrivers\_ibmeci.py:61
28+
#: addon\synthDrivers\_ibmeci.py:63
2929
msgid "Brazilian Portuguese"
3030
msgstr ""
3131

32-
#: addon\synthDrivers\_ibmeci.py:62
32+
#: addon\synthDrivers\_ibmeci.py:64
3333
msgid "French"
3434
msgstr ""
3535

36-
#: addon\synthDrivers\_ibmeci.py:63
36+
#: addon\synthDrivers\_ibmeci.py:65
3737
msgid "French Canadian"
3838
msgstr ""
3939

40-
#: addon\synthDrivers\_ibmeci.py:64
40+
#: addon\synthDrivers\_ibmeci.py:66
4141
msgid "Finnish"
4242
msgstr ""
4343

44-
#: addon\synthDrivers\_ibmeci.py:65
44+
#: addon\synthDrivers\_ibmeci.py:67
4545
msgid "Chinese"
4646
msgstr ""
4747

48-
#: addon\synthDrivers\_ibmeci.py:66
48+
#: addon\synthDrivers\_ibmeci.py:68
4949
msgid "Japanese"
5050
msgstr ""
5151

52-
#: addon\synthDrivers\_ibmeci.py:67
52+
#: addon\synthDrivers\_ibmeci.py:69
5353
msgid "Korean"
5454
msgstr ""
5555

56-
#: addon\synthDrivers\_ibmeci.py:68
56+
#: addon\synthDrivers\_ibmeci.py:70
5757
msgid "German"
5858
msgstr ""
5959

60-
#: addon\synthDrivers\_ibmeci.py:69
60+
#: addon\synthDrivers\_ibmeci.py:71
6161
msgid "Italian"
6262
msgstr ""
6363

64-
#: addon\synthDrivers\_ibmeci.py:70
64+
#: addon\synthDrivers\_ibmeci.py:72
6565
msgid "American English"
6666
msgstr ""
6767

68-
#: addon\synthDrivers\_ibmeci.py:71
68+
#: addon\synthDrivers\_ibmeci.py:73
6969
msgid "British English"
7070
msgstr ""
7171

72-
#: addon\synthDrivers\_ibmeci.py:72
72+
#: addon\synthDrivers\_ibmeci.py:74
7373
msgid "Swedish"
7474
msgstr ""
7575

76-
#: addon\synthDrivers\_ibmeci.py:73
76+
#: addon\synthDrivers\_ibmeci.py:75
7777
msgid "Norwegian"
7878
msgstr ""
7979

80-
#: addon\synthDrivers\_ibmeci.py:74
80+
#: addon\synthDrivers\_ibmeci.py:76
8181
msgid "Danish"
8282
msgstr ""
8383

84-
#: addon\synthDrivers\_ibmeci.py:75
84+
#: addon\synthDrivers\_ibmeci.py:77
8585
msgid "Hong Kong Cantonese"
8686
msgstr ""
8787

88-
#: addon\synthDrivers\ibmeci.py:148
88+
#: addon\synthDrivers\ibmeci.py:163
8989
msgid "Rate boos&t"
9090
msgstr ""
9191

92-
#: addon\synthDrivers\ibmeci.py:150
92+
#: addon\synthDrivers\ibmeci.py:165
9393
msgid "Hea&d size"
9494
msgstr ""
9595

96-
#: addon\synthDrivers\ibmeci.py:151
96+
#: addon\synthDrivers\ibmeci.py:166
9797
msgid "Rou&ghness"
9898
msgstr ""
9999

100-
#: addon\synthDrivers\ibmeci.py:152
100+
#: addon\synthDrivers\ibmeci.py:167
101101
msgid "Breathi&ness"
102102
msgstr ""
103103

104-
#: addon\synthDrivers\ibmeci.py:153
104+
#: addon\synthDrivers\ibmeci.py:168
105105
msgid "Enable backquote voice &tags"
106106
msgstr ""
107107

108-
#: addon\synthDrivers\ibmeci.py:154
108+
#: addon\synthDrivers\ibmeci.py:169
109109
msgid "Enable &abbreviation dictionary"
110110
msgstr ""
111111

112-
#: addon\synthDrivers\ibmeci.py:155
112+
#: addon\synthDrivers\ibmeci.py:170
113113
msgid "Enable phras&e prediction"
114114
msgstr ""
115115

116-
#: addon\synthDrivers\ibmeci.py:156
116+
#: addon\synthDrivers\ibmeci.py:171
117117
msgid "&Shorten pauses"
118118
msgstr ""
119119

120-
#: addon\synthDrivers\ibmeci.py:157
120+
#: addon\synthDrivers\ibmeci.py:172
121121
msgid "Al&ways Send Current Speech Settings"
122122
msgstr ""
123123

124-
#: addon\synthDrivers\ibmeci.py:158
124+
#: addon\synthDrivers\ibmeci.py:173
125125
msgid "Sa&mple Rate"
126126
msgstr ""
127127

addon/locale/es/LC_MESSAGES/nvda.po

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: IBMTTS for NVDA\n"
99
"Report-Msgid-Bugs-To: 'nvda-translations@freelists.org'\n"
10-
"POT-Creation-Date: 2022-07-04 19:57-0600\n"
11-
"PO-Revision-Date: 2022-07-04 20:24-0600\n"
10+
"POT-Creation-Date: 2022-08-16 21:09-0600\n"
11+
"PO-Revision-Date: 2022-08-16 21:11-0600\n"
1212
"Last-Translator: Rémy Ruiz <remyruiz@gmail.com>\n"
1313
"Language-Team: José Manuel Delicado <jmdaweb@hotmail.com>\n"
1414
"Language: es\n"
@@ -19,121 +19,121 @@ msgstr ""
1919
"X-Generator: Poedit 3.1\n"
2020
"X-Poedit-SourceCharset: iso-8859-1\n"
2121

22-
#: addon\synthDrivers\_ibmeci.py:59
22+
#: addon\synthDrivers\_ibmeci.py:61
2323
msgid "Castilian Spanish"
2424
msgstr "Español de España"
2525

26-
#: addon\synthDrivers\_ibmeci.py:60
26+
#: addon\synthDrivers\_ibmeci.py:62
2727
msgid "Latin American Spanish"
2828
msgstr "Español latinoamericano"
2929

30-
#: addon\synthDrivers\_ibmeci.py:61
30+
#: addon\synthDrivers\_ibmeci.py:63
3131
msgid "Brazilian Portuguese"
3232
msgstr "Portugués de Brasil"
3333

34-
#: addon\synthDrivers\_ibmeci.py:62
34+
#: addon\synthDrivers\_ibmeci.py:64
3535
msgid "French"
3636
msgstr "Francés"
3737

38-
#: addon\synthDrivers\_ibmeci.py:63
38+
#: addon\synthDrivers\_ibmeci.py:65
3939
msgid "French Canadian"
4040
msgstr "Francés de Canadá"
4141

42-
#: addon\synthDrivers\_ibmeci.py:64
42+
#: addon\synthDrivers\_ibmeci.py:66
4343
msgid "Finnish"
4444
msgstr "Finés"
4545

46-
#: addon\synthDrivers\_ibmeci.py:65
46+
#: addon\synthDrivers\_ibmeci.py:67
4747
msgid "Chinese"
4848
msgstr "Chino"
4949

50-
#: addon\synthDrivers\_ibmeci.py:66
50+
#: addon\synthDrivers\_ibmeci.py:68
5151
msgid "Japanese"
5252
msgstr "Japonés"
5353

54-
#: addon\synthDrivers\_ibmeci.py:67
54+
#: addon\synthDrivers\_ibmeci.py:69
5555
msgid "Korean"
5656
msgstr "Coreano"
5757

58-
#: addon\synthDrivers\_ibmeci.py:68
58+
#: addon\synthDrivers\_ibmeci.py:70
5959
msgid "German"
6060
msgstr "Alemán"
6161

62-
#: addon\synthDrivers\_ibmeci.py:69
62+
#: addon\synthDrivers\_ibmeci.py:71
6363
msgid "Italian"
6464
msgstr "Italiano"
6565

66-
#: addon\synthDrivers\_ibmeci.py:70
66+
#: addon\synthDrivers\_ibmeci.py:72
6767
msgid "American English"
6868
msgstr "Inglés americano"
6969

70-
#: addon\synthDrivers\_ibmeci.py:71
70+
#: addon\synthDrivers\_ibmeci.py:73
7171
msgid "British English"
7272
msgstr "Inglés británico"
7373

74-
#: addon\synthDrivers\_ibmeci.py:72
74+
#: addon\synthDrivers\_ibmeci.py:74
7575
msgid "Swedish"
7676
msgstr "Sueco"
7777

78-
#: addon\synthDrivers\_ibmeci.py:73
78+
#: addon\synthDrivers\_ibmeci.py:75
7979
msgid "Norwegian"
8080
msgstr "Noruego"
8181

82-
#: addon\synthDrivers\_ibmeci.py:74
82+
#: addon\synthDrivers\_ibmeci.py:76
8383
msgid "Danish"
8484
msgstr "Danés"
8585

86-
#: addon\synthDrivers\_ibmeci.py:75
86+
#: addon\synthDrivers\_ibmeci.py:77
8787
msgid "Hong Kong Cantonese"
8888
msgstr "Cantonés de Hong Kong"
8989

90-
#: addon\synthDrivers\ibmeci.py:148
90+
#: addon\synthDrivers\ibmeci.py:163
9191
msgid "Rate boos&t"
9292
msgstr "&Turbo de voz"
9393

94-
#: addon\synthDrivers\ibmeci.py:150
94+
#: addon\synthDrivers\ibmeci.py:165
9595
#, fuzzy
9696
#| msgid "Head size"
9797
msgid "Hea&d size"
9898
msgstr "Tamaño de la cabeza"
9999

100-
#: addon\synthDrivers\ibmeci.py:151
100+
#: addon\synthDrivers\ibmeci.py:166
101101
#, fuzzy
102102
#| msgid "Roughness"
103103
msgid "Rou&ghness"
104104
msgstr "Carraspeo"
105105

106-
#: addon\synthDrivers\ibmeci.py:152
106+
#: addon\synthDrivers\ibmeci.py:167
107107
#, fuzzy
108108
#| msgid "Breathiness"
109109
msgid "Breathi&ness"
110110
msgstr "Respiración"
111111

112-
#: addon\synthDrivers\ibmeci.py:153
112+
#: addon\synthDrivers\ibmeci.py:168
113113
msgid "Enable backquote voice &tags"
114114
msgstr "Activar &etiquetas de cambio de voz"
115115

116-
#: addon\synthDrivers\ibmeci.py:154
116+
#: addon\synthDrivers\ibmeci.py:169
117117
msgid "Enable &abbreviation dictionary"
118118
msgstr "Habilitar diccionario de abreviaturas"
119119

120-
#: addon\synthDrivers\ibmeci.py:155
120+
#: addon\synthDrivers\ibmeci.py:170
121121
#, fuzzy
122122
#| msgid "Enable phrase prediction"
123123
msgid "Enable phras&e prediction"
124124
msgstr "habilitar predicción de frases"
125125

126-
#: addon\synthDrivers\ibmeci.py:156
126+
#: addon\synthDrivers\ibmeci.py:171
127127
msgid "&Shorten pauses"
128128
msgstr "Acortar las pausas"
129129

130-
#: addon\synthDrivers\ibmeci.py:157
130+
#: addon\synthDrivers\ibmeci.py:172
131131
#, fuzzy
132132
#| msgid "Always Send Current Speech Settings"
133133
msgid "Al&ways Send Current Speech Settings"
134134
msgstr "Siempre enviar las configuraciones de voz actuales"
135135

136-
#: addon\synthDrivers\ibmeci.py:158
136+
#: addon\synthDrivers\ibmeci.py:173
137137
msgid "Sa&mple Rate"
138138
msgstr "&Frecuencia de muestreo"
139139

addon/synthDrivers/_ibmeci.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
addonHandler.initTranslation()
1717

1818
player = None
19+
currentSoundcardOutput = None
20+
currentSampleRate = None
1921

2022
class ECIParam:
2123
eciSynthMode=0
@@ -235,7 +237,7 @@ def setLast(lp):
235237
onIndexReached(lp)
236238

237239
def bgPlay(stri):
238-
global player
240+
global player, currentSampleRate
239241
if not player or len(stri) == 0: return
240242
# Sometimes player.feed() tries to open the device when it's already open,
241243
# causing a WindowsError. This code catches and works around this.
@@ -250,7 +252,7 @@ def bgPlay(stri):
250252
except FileNotFoundError:
251253
# reset the player if the used soundcard is not present. E.G. the total number of sound devices has changed.
252254
player.close()
253-
player = create_player(sample_rate)
255+
player = createPlayer(currentSampleRate)
254256
except:
255257
player.idle()
256258
time.sleep(0.02)
@@ -315,7 +317,7 @@ def initialize(indexCallback, doneCallback):
315317
onIndexReached = indexCallback
316318
onDoneSpeaking = doneCallback
317319
idleTimer = threading.Timer(0.3, time.sleep) # fake timer because this can't be None.
318-
# player = create_player(1)
320+
# player = createPlayer(1)
319321
if not eciCheck():
320322
raise RuntimeError("No IBMTTS synthesizer available")
321323
eciQueue = queue.Queue()
@@ -326,6 +328,7 @@ def initialize(indexCallback, doneCallback):
326328
callbackQueue = queue.Queue()
327329
callbackThread = CallbackThread()
328330
callbackThread.start()
331+
config.post_configProfileSwitch.register(handleSoundcardChange)
329332

330333
def speak(text):
331334
# deleted the following fix because is incompatible with NVDA's speech change command. Now send it from speak in ibmeci.py
@@ -366,6 +369,7 @@ def terminate():
366369
eciThread.join()
367370
callbackThread.join()
368371
idleTimer.cancel()
372+
config.post_configProfileSwitch.unregister(handleSoundcardChange)
369373
player.close()
370374
callbackQueue= callbackThread= dll= eciQueue=eciThread= handle= idleTimer= onDoneSpeaking= onIndexReached= player = None
371375

@@ -461,13 +465,22 @@ def idlePlayer():
461465
player.idle()
462466
onDoneSpeaking()
463467

464-
def create_player(sample_rate):
465-
if sample_rate == 0:
466-
player = nvwave.WavePlayer(1, 8000, 16, outputDevice=config.conf["speech"]["outputDevice"])
467-
elif sample_rate == 1:
468-
player = nvwave.WavePlayer(1, 11025, 16, outputDevice=config.conf["speech"]["outputDevice"])
469-
elif sample_rate == 2:
470-
player = nvwave.WavePlayer(1, 22050, 16, outputDevice=config.conf["speech"]["outputDevice"])
468+
def createPlayer(sampleRate):
469+
global currentSoundcardOutput, currentSampleRate
470+
currentSoundcardOutput = config.conf["speech"]["outputDevice"]
471+
currentSampleRate = sampleRate
472+
if sampleRate == 0:
473+
player = nvwave.WavePlayer(1, 8000, 16, outputDevice=currentSoundcardOutput)
474+
elif sampleRate == 1:
475+
player = nvwave.WavePlayer(1, 11025, 16, outputDevice=currentSoundcardOutput)
476+
elif sampleRate == 2:
477+
player = nvwave.WavePlayer(1, 22050, 16, outputDevice=currentSoundcardOutput)
471478
else:
472-
player = nvwave.WavePlayer(1, 11025, 16, outputDevice=config.conf["speech"]["outputDevice"])
479+
player = nvwave.WavePlayer(1, 11025, 16, outputDevice=currentSoundcardOutput)
473480
return player
481+
482+
def handleSoundcardChange():
483+
global currentSoundcardOutput, currentSampleRate, player
484+
if currentSoundcardOutput != config.conf["speech"]["outputDevice"]:
485+
player.close()
486+
player = createPlayer(currentSampleRate)

0 commit comments

Comments
 (0)