~ubuntu-branches/ubuntu/trusty/jovie/trusty

« back to all changes in this revision

Viewing changes to debian/patches/kcmkttsd_permanent_settings_jobmgr_fixes.diff

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-05-07 16:55:09 UTC
  • mfrom: (1.1.21) (1.2.3 experimental)
  • Revision ID: package-import@ubuntu.com-20130507165509-mwv9z4nj2arslod5
Tags: 4:4.10.3-0ubuntu1
* New upstream release
* Merge with Debian

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
From: Modestas Vainius <modax@debian.org>
2
 
Subject: Properly support permanent storage of kttsd talker settings, jobmgr fixes.
3
 
Origin: vendor
4
 
Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=599825
5
 
Last-Update: 2010-12-04
6
 
Forwarded: no
7
 
 
8
 
This patch builds on top of the upstream jobmgr patch (commits 1072198,
9
 
1138400) and:
10
 
 
11
 
1) adds support for permanent storage (to config file) of talker settings in
12
 
both KTTS daemon and its configuration GUI. This includes saving and loading of
13
 
the settings;
14
 
2) brings job manager GUI to a usable state rather than half-ported and hardly
15
 
working bunch of GUI elements. Not entirely bug-free, but usable (i.e. should
16
 
be RC bug free).
17
 
 
18
 
--- a/kcmkttsmgr/kcmkttsmgr.cpp
19
 
+++ b/kcmkttsmgr/kcmkttsmgr.cpp
20
 
@@ -498,6 +498,10 @@ void KCMKttsMgr::load()
21
 
 
22
 
     m_changed = false;
23
 
     m_suppressConfigChanged = false;
24
 
+
25
 
+    // load the first talker into job manager
26
 
+    if (m_jobMgrWidget && m_talkerListModel.rowCount() > 0)
27
 
+        m_jobMgrWidget->load(m_talkerListModel.getRow(0));
28
 
 }
29
 
 
30
 
 /**
31
 
@@ -592,12 +596,16 @@ void KCMKttsMgr::save()
32
 
 
33
 
     m_config->sync();
34
 
 
35
 
-    // apply changes in the jobs page if it exists
36
 
+    // schedule apply of the changes in the jobs page once kttsd restarts
37
 
     if (m_jobMgrWidget)
38
 
     {
39
 
-        m_jobMgrWidget->save();
40
 
+        m_jobMgrWidget->setSavePending(true);
41
 
+        //m_jobMgrWidget->save();
42
 
     }
43
 
     
44
 
+    // Restart kttsd in order to pick up talker changes from config file
45
 
+    m_kspeech->reinit();
46
 
+
47
 
     // If we automatically unchecked the Enable KTTSD checkbox, stop KTTSD.
48
 
     if (enableKttsdWasToggled)
49
 
         slotEnableKttsd_toggled(false);
50
 
@@ -1033,6 +1041,9 @@ void KCMKttsMgr::updateTalkerButtons(){
51
 
         configureTalkerButton->setEnabled(true);
52
 
         higherTalkerPriorityButton->setEnabled(modelIndex.row() != 0);
53
 
         lowerTalkerPriorityButton->setEnabled(modelIndex.row() < (m_talkerListModel.rowCount() - 1));
54
 
+        // Update output module and language in jobMgrWidget
55
 
+        if (m_jobMgrWidget)
56
 
+            m_jobMgrWidget->load(m_talkerListModel.getRow(modelIndex.row()));
57
 
     } else {
58
 
         removeTalkerButton->setEnabled(false);
59
 
         configureTalkerButton->setEnabled(false);
60
 
@@ -1140,6 +1151,13 @@ void KCMKttsMgr::kttsdStarted()
61
 
     // Check/Uncheck the Enable KTTSD check box.
62
 
     if (kttsdLoaded)
63
 
     {
64
 
+        bool reinit = false;
65
 
+        if (m_kspeech) { // already connected, reinit called
66
 
+            // disconnect first
67
 
+            disconnect( QDBusConnection::sessionBus().interface(), 0, this, 0 );
68
 
+            delete m_kspeech;
69
 
+            reinit = true;
70
 
+        }
71
 
         enableKttsdCheckBox->setChecked(true);
72
 
         m_kspeech = new OrgKdeKSpeechInterface("org.kde.kttsd", "/KSpeech", QDBusConnection::sessionBus());
73
 
         m_kspeech->setParent(this);
74
 
@@ -1157,6 +1175,8 @@ void KCMKttsMgr::kttsdStarted()
75
 
 
76
 
         kttsdVersion->setText(i18n("KTTSD Version: %1", m_kspeech->version()));
77
 
 
78
 
+         if (!reinit)
79
 
+            m_jobMgrWidget->load(TalkerCode());
80
 
     } else {
81
 
         enableKttsdCheckBox->setChecked(false);
82
 
         delete m_kspeech;
83
 
--- a/kcmkttsmgr/kttsjobmgr.cpp
84
 
+++ b/kcmkttsmgr/kttsjobmgr.cpp
85
 
@@ -56,7 +56,8 @@
86
 
 #include "selecttalkerdlg.h"
87
 
 
88
 
 KttsJobMgr::KttsJobMgr(QWidget *parent) :
89
 
-    QWidget(parent)
90
 
+    QWidget(parent),
91
 
+    m_savePending(false)
92
 
 {
93
 
     m_ui = new Ui::kttsjobmgr;
94
 
     m_ui->setupUi(this);
95
 
@@ -77,7 +78,7 @@ KttsJobMgr::KttsJobMgr(QWidget *parent)
96
 
     connect (m_ui->volumeSlider, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
97
 
     
98
 
     connect (m_ui->moduleComboBox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(slot_moduleChanged(const QString &)));
99
 
-    connect (m_ui->languageComboBox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(slot_languageChanged(const QString &)));
100
 
+    connect (m_ui->languageComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slot_languageChanged(int)));
101
 
     connect (m_ui->voiceComboBox, SIGNAL(currentIndexChanged(int)), this, SIGNAL(configChanged()));
102
 
 
103
 
     m_ui->stopButton->setIcon(KIcon("media-playback-stop"));
104
 
@@ -139,25 +140,104 @@ void KttsJobMgr::slot_resume()
105
 
 
106
 
 void KttsJobMgr::save()
107
 
 {
108
 
+    if (m_ui->moduleComboBox->currentIndex() > -1)
109
 
+        m_kspeech->setOutputModule(m_ui->moduleComboBox->currentText());
110
 
+    if (m_ui->languageComboBox->currentIndex() > -1)
111
 
+    {
112
 
+        int langIndex = m_ui->languageComboBox->currentIndex();
113
 
+        m_kspeech->setLanguage(m_ui->languageComboBox->itemData(langIndex).toString());
114
 
+    }
115
 
     m_kspeech->setSpeed(m_ui->speedSlider->value());
116
 
     m_kspeech->setPitch(m_ui->pitchSlider->value());
117
 
     m_kspeech->setVolume(m_ui->volumeSlider->value());
118
 
     m_kspeech->setVoiceType(m_ui->voiceComboBox->currentIndex() + 1);
119
 
+
120
 
+    m_savePending = false;
121
 
+}
122
 
+
123
 
+void KttsJobMgr::load(const TalkerCode & tc, bool complete)
124
 
+{
125
 
+    m_ui->moduleComboBox->clear();
126
 
+    bool wasSet = false;
127
 
+    QStringList modules = m_kspeech->outputModules();
128
 
+    int i = 0;
129
 
+
130
 
+    foreach (const QString module, modules)
131
 
+    {
132
 
+        m_ui->moduleComboBox->addItem(module);
133
 
+        if (module == tc.outputModule())
134
 
+        {
135
 
+            m_ui->moduleComboBox->setCurrentIndex(i);
136
 
+            wasSet = true;
137
 
+        }
138
 
+        i++;
139
 
+    }
140
 
+    if (wasSet)
141
 
+    {
142
 
+        if (complete) {
143
 
+            loadLanguages(tc.language());
144
 
+            m_ui->voiceComboBox->setCurrentIndex(tc.voiceType()-1);
145
 
+            m_ui->speedSlider->setValue(tc.rate());
146
 
+            m_ui->pitchSlider->setValue(tc.pitch());
147
 
+            m_ui->volumeSlider->setValue(tc.volume());
148
 
+        }
149
 
+    }
150
 
+    else
151
 
+    {
152
 
+        m_ui->moduleComboBox->setCurrentIndex(-1);
153
 
+    }
154
 
 }
155
 
 
156
 
-void KttsJobMgr::load()
157
 
+void KttsJobMgr::loadLanguages(const QString & selectedLanguage)
158
 
 {
159
 
+    QString module = m_ui->moduleComboBox->currentText();
160
 
+    m_ui->languageComboBox->clear();
161
 
+    if (!module.isEmpty())
162
 
+    {
163
 
+        int i = 0;
164
 
+        bool wasSet = false;
165
 
+        QStringList languages = m_kspeech->languagesByModule(module);
166
 
+        foreach (const QString language, languages)
167
 
+        {
168
 
+            QString langName = TalkerCode::languageCodeToLanguage(language);
169
 
+            QString langLabel = (langName.isEmpty()) ? language :
170
 
+               QString("%1 (%2)").arg(langName).arg(language);
171
 
+            m_ui->languageComboBox->addItem(langLabel, language);
172
 
+            if (language == selectedLanguage)
173
 
+            {
174
 
+                m_ui->languageComboBox->setCurrentIndex(i);
175
 
+                wasSet = true;
176
 
+            }
177
 
+            i++;
178
 
+        }
179
 
+        if (!wasSet) m_ui->languageComboBox->setCurrentIndex(-1);
180
 
+    }
181
 
 }
182
 
 
183
 
 void KttsJobMgr::slot_moduleChanged(const QString & module)
184
 
 {
185
 
+    if (module.isEmpty()) {
186
 
+        m_ui->languageComboBox->clear();
187
 
+        return;
188
 
+    }
189
 
+
190
 
     kDebug() << "changing the output module to " << module;
191
 
     m_kspeech->setOutputModule(module);
192
 
+
193
 
+    QString fullLanguageCode = KGlobal::locale()->defaultLanguage();
194
 
+    QString languageCode, countryCode;
195
 
+    TalkerCode::splitFullLanguageCode(fullLanguageCode, languageCode, countryCode);
196
 
+    loadLanguages(languageCode);
197
 
+
198
 
     emit configChanged();
199
 
 }
200
 
 
201
 
-void KttsJobMgr::slot_languageChanged(const QString & language)
202
 
+void KttsJobMgr::slot_languageChanged(int index)
203
 
 {
204
 
+    if (index < 0)
205
 
+        return;
206
 
+
207
 
+    QString language = m_ui->languageComboBox->itemData(index).toString();
208
 
     kDebug() << "changing the language to " << language;
209
 
     m_kspeech->setLanguage(language);
210
 
     emit configChanged();
211
 
@@ -261,6 +341,16 @@ QString KttsJobMgr::cachedTalkerCodeToTa
212
 
     }
213
 
 }
214
 
 
215
 
+void KttsJobMgr::setSavePending(bool value)
216
 
+{
217
 
+    m_savePending = value;
218
 
+}
219
 
+
220
 
+bool KttsJobMgr::isSavePending()
221
 
+{
222
 
+    return m_savePending;
223
 
+}
224
 
+
225
 
 /** Slots connected to DBUS Signals emitted by KTTSD. */
226
 
 
227
 
 /**
228
 
@@ -268,4 +358,6 @@ QString KttsJobMgr::cachedTalkerCodeToTa
229
 
 */
230
 
 Q_SCRIPTABLE void KttsJobMgr::kttsdStarted()
231
 
 {
232
 
+    if (isSavePending())
233
 
+        save();
234
 
 }
235
 
--- a/kcmkttsmgr/kttsjobmgr.h
236
 
+++ b/kcmkttsmgr/kttsjobmgr.h
237
 
@@ -37,6 +37,7 @@ class KPushButton;
238
 
 class KttsJobMgrBrowserExtension;
239
 
 class JobInfo;
240
 
 class JobInfoListModel;
241
 
+class TalkerCode;
242
 
 
243
 
 namespace Ui
244
 
 {
245
 
@@ -54,7 +55,10 @@ public:
246
 
     /** apply current settings, i.e. speech-dispatcher what to do */
247
 
     void save();
248
 
     /** get the current settings from speech-dispatcher */
249
 
-    void load();
250
 
+    void load(const TalkerCode & tc, bool complete = true);
251
 
+
252
 
+    void setSavePending(bool value);
253
 
+    bool isSavePending();
254
 
     
255
 
 signals:
256
 
     void configChanged();
257
 
@@ -83,7 +87,7 @@ private slots:
258
 
     */
259
 
     
260
 
     void slot_moduleChanged(const QString & module);
261
 
-    void slot_languageChanged(const QString & language);
262
 
+    void slot_languageChanged(int index);
263
 
    
264
 
 private:
265
 
     /**
266
 
@@ -98,6 +102,8 @@ private:
267
 
     */
268
 
     QString cachedTalkerCodeToTalkerID(const QString& talkerCode);
269
 
 
270
 
+    void loadLanguages(const QString & selectedLanguage);
271
 
+
272
 
     /**
273
 
     * Job ListView.
274
 
     */
275
 
@@ -107,6 +113,8 @@ private:
276
 
     * Cache mapping Talker Codes to Talker IDs.
277
 
     */
278
 
     QMap<QString,QString> m_talkerCodesToTalkerIDs;
279
 
+
280
 
+    bool m_savePending;
281
 
 };
282
 
 
283
 
 #endif    // KTTSJOBMGR_H
284
 
--- a/kttsd/kspeech.cpp
285
 
+++ b/kttsd/kspeech.cpp
286
 
@@ -436,6 +436,7 @@ void KSpeech::init()
287
 
     new KSpeechAdaptor(this);
288
 
     if (ready()) {
289
 
         QDBusConnection::sessionBus().registerObject("/KSpeech", this, QDBusConnection::ExportAdaptors);
290
 
+        emit kttsdStarted();
291
 
     }
292
 
 }
293
 
 
294
 
@@ -450,6 +451,7 @@ void KSpeech::reinit()
295
 
     QDBusConnection::sessionBus().unregisterObject("/KSpeech");
296
 
     if (ready()) {
297
 
         QDBusConnection::sessionBus().registerObject("/KSpeech", this, QDBusConnection::ExportAdaptors);
298
 
+        emit kttsdStarted();
299
 
     }
300
 
 }
301
 
 
302
 
@@ -477,7 +479,6 @@ bool KSpeech::ready()
303
 
     if (!initializeSpeaker())
304
 
         return false;
305
 
     announceEvent("ready", "kttsdStarted");
306
 
-    emit kttsdStarted();
307
 
     return true;
308
 
 }
309
 
 
310
 
--- a/kttsd/speaker.cpp
311
 
+++ b/kttsd/speaker.cpp
312
 
@@ -53,7 +53,7 @@
313
 
 #include "talkercode.h"
314
 
 
315
 
 // KTTSD includes.
316
 
-//#include "talkermgr.h"
317
 
+#include "talkermgr.h"
318
 
 #include "ssmlconvert.h"
319
 
 
320
 
 
321
 
@@ -103,7 +103,8 @@ class SpeakerPrivate
322
 
     SpeakerPrivate() :
323
 
         connection(NULL),
324
 
         filterMgr(NULL),
325
 
-        config(NULL)
326
 
+        config(NULL),
327
 
+        currentTalker(QString())
328
 
     {
329
 
         if (!ConnectToSpeechd())
330
 
             kError() << "could not get a connection to speech-dispatcher"<< endl;
331
 
@@ -112,6 +113,8 @@ class SpeakerPrivate
332
 
         filterMgr->init();
333
 
         
334
 
         config = new KConfig("kttsdrc");
335
 
+
336
 
+        TalkerMgr::Instance()->loadTalkers(config);
337
 
     }
338
 
     
339
 
     ~SpeakerPrivate()
340
 
@@ -195,6 +198,8 @@ protected:
341
 
     */
342
 
     KConfig *config;
343
 
 
344
 
+    QString currentTalker;
345
 
+
346
 
 };
347
 
 
348
 
 /* Public Methods ==========================================================*/
349
 
@@ -256,6 +261,14 @@ void Speaker::init()
350
 
     delete d->filterMgr;
351
 
     d->filterMgr = new FilterMgr();
352
 
     d->filterMgr->init();
353
 
+
354
 
+    if (d->config) delete d->config;
355
 
+    d->config = new KConfig("kttsdrc");
356
 
+    TalkerMgr::Instance()->loadTalkers(d->config);
357
 
+
358
 
+    QString defTalker = TalkerMgr::Instance()->userDefaultTalker();
359
 
+    if (!defTalker.isEmpty())
360
 
+        activateTalker(defTalker);
361
 
 }
362
 
 
363
 
 AppData* Speaker::getAppData(const QString& appId) const
364
 
@@ -330,6 +343,13 @@ int Speaker::say(const QString& appId, c
365
 
     //kDebug() << "Running: Speaker::say appId = " << appId << " text = " << text;
366
 
     //QString talker = appData->defaultTalker();
367
 
 
368
 
+    // Activate another talker if requested
369
 
+    if (!appData->defaultTalker().isEmpty() &&
370
 
+        appData->defaultTalker() != d->currentTalker)
371
 
+    {
372
 
+        activateTalker(appData->defaultTalker());
373
 
+    }
374
 
+
375
 
     SPDPriority spdpriority = SPD_PROGRESS; // default to least priority
376
 
     switch (priority)
377
 
     {
378
 
@@ -406,7 +426,7 @@ int Speaker::say(const QString& appId, c
379
 
     }
380
 
 
381
 
     //// Note: Set state last so job is fully populated when jobStateChanged signal is emitted.
382
 
-    appData->jobList()->append(jobNum);
383
 
+    //appData->jobList()->append(jobNum);
384
 
     return jobNum;
385
 
 }
386
 
 
387
 
@@ -449,6 +469,19 @@ bool Speaker::isSpeaking()
388
 
     return true; // TODO: ask speech-dispatcher somehow?
389
 
 }
390
 
 
391
 
+void Speaker::activateTalker(const QString & talker)
392
 
+{
393
 
+    TalkerCode tc(talker);
394
 
+    setOutputModule(tc.outputModule());
395
 
+    setLanguage(tc.language());
396
 
+    setVoiceType(tc.voiceType());
397
 
+    setSpeed(tc.rate());
398
 
+    setPitch(tc.pitch());
399
 
+    setVolume(tc.volume());
400
 
+
401
 
+    d->currentTalker = talker;
402
 
+}
403
 
+
404
 
 int Speaker::getCurrentJobNum()
405
 
 { 
406
 
     return 0;// TODO: ask speech dispatcher if it's needed...
407
 
@@ -819,6 +852,9 @@ QStringList Speaker::outputModules()
408
 
 
409
 
 QStringList Speaker::languagesByModule(const QString & module)
410
 
 {
411
 
+    if (module.isEmpty())
412
 
+        return QStringList();
413
 
+
414
 
     QStringList languages;
415
 
     if (spd_set_output_module(d->connection, module.toUtf8().data()) == 0)
416
 
     {
417
 
@@ -850,12 +886,18 @@ void Speaker::setVolume(int volume)
418
 
 
419
 
 void Speaker::setOutputModule(const QString & module)
420
 
 {
421
 
+    if (module.isEmpty())
422
 
+        return;
423
 
+
424
 
     int result = spd_set_output_module(d->connection, module.toUtf8().data());
425
 
     // discard result for now, TODO: add error reporting
426
 
 }
427
 
 
428
 
 void Speaker::setLanguage(const QString & language)
429
 
 {
430
 
+    if (language.isEmpty())
431
 
+        return;
432
 
+
433
 
     int result = spd_set_language(d->connection, language.toUtf8().data());
434
 
     // discard result for now, TODO: add error reporting
435
 
 }
436
 
--- a/kttsd/speaker.h
437
 
+++ b/kttsd/speaker.h
438
 
@@ -380,6 +380,8 @@ public:
439
 
     void setLanguage(const QString & language);
440
 
     void setVoiceType(int voiceType);
441
 
 
442
 
+    void activateTalker(const QString & talker);
443
 
+
444
 
 signals:
445
 
     /**
446
 
     * Emitted when a marker is processed.
447
 
--- a/kttsd/talkermgr.cpp
448
 
+++ b/kttsd/talkermgr.cpp
449
 
@@ -239,12 +239,7 @@ void TalkerMgr::loadTalkers(KConfig* c)
450
 
  */
451
 
 QStringList TalkerMgr::getTalkers()
452
 
 {
453
 
-    QStringList talkerList;
454
 
-    //for (int ndx = 0; ndx < int(m_loadedPlugIns.count()); ++ndx)
455
 
-    //{
456
 
-    //    talkerList.append(m_loadedTalkerCodes[ndx].getTalkerCode());
457
 
-    //}
458
 
-    return talkerList;
459
 
+    return m_loadedTalkerIds;
460
 
 }
461
 
 
462
 
 /**
463
 
@@ -340,7 +335,8 @@ QString TalkerMgr::talkerCodeToTalkerId(
464
 
  */
465
 
 QString TalkerMgr::userDefaultTalker() const
466
 
 {
467
 
-    return m_loadedTalkerCodes[0].getTalkerCode();
468
 
+    return (m_loadedTalkerCodes.isEmpty()) ? QString() :
469
 
+        m_loadedTalkerCodes[0].getTalkerCode();
470
 
 }
471
 
 
472
 
 /**