summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2020-12-05 13:14:43 +0100
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2020-12-05 13:44:37 +0100
commit0e315e848ae7ea5b226af4ab16c215119cbd3fb3 (patch)
treeeed592e48bbd636ecdc02d65f7befbf213584faf
parentac5fc26085e390cb55a3a5fd186a8091adcae2d4 (diff)
downloadrockbox-0e315e848ae7ea5b226af4ab16c215119cbd3fb3.tar.gz
rockbox-0e315e848ae7ea5b226af4ab16c215119cbd3fb3.zip
rbutil: Rework handling of available voice languages.
- Move Rockbox voice language names handling to PlayerBuildInfo, and handle it similarly to the rest of the device specific values. Rework internal handling to simplify things. - Enable language list from build server for installing prerendered voice files other than english. - Extend unit tests. Change-Id: I1a1a717fa4409fa965dabc86f52d52a4fc516315
-rw-r--r--rbutil/rbutilqt/base/playerbuildinfo.cpp25
-rw-r--r--rbutil/rbutilqt/base/playerbuildinfo.h2
-rw-r--r--rbutil/rbutilqt/base/systeminfo.cpp20
-rw-r--r--rbutil/rbutilqt/base/systeminfo.h3
-rw-r--r--rbutil/rbutilqt/base/ttssapi.cpp11
-rw-r--r--rbutil/rbutilqt/createvoicewindow.cpp32
-rw-r--r--rbutil/rbutilqt/gui/selectiveinstallwidget.cpp29
-rw-r--r--rbutil/rbutilqt/gui/selectiveinstallwidget.h1
-rw-r--r--rbutil/rbutilqt/test/test-playerbuildinfo.cpp37
9 files changed, 86 insertions, 74 deletions
diff --git a/rbutil/rbutilqt/base/playerbuildinfo.cpp b/rbutil/rbutilqt/base/playerbuildinfo.cpp
index f49917cfef..4310991f40 100644
--- a/rbutil/rbutilqt/base/playerbuildinfo.cpp
+++ b/rbutil/rbutilqt/base/playerbuildinfo.cpp
@@ -66,8 +66,10 @@ const static struct {
66 { PlayerBuildInfo::Encoder, ":target:/encoder" }, 66 { PlayerBuildInfo::Encoder, ":target:/encoder" },
67 { PlayerBuildInfo::Brand, ":target:/brand" }, 67 { PlayerBuildInfo::Brand, ":target:/brand" },
68 { PlayerBuildInfo::PlayerPicture, ":target:/playerpic" }, 68 { PlayerBuildInfo::PlayerPicture, ":target:/playerpic" },
69 { PlayerBuildInfo::TargetNamesAll, "" }, 69 { PlayerBuildInfo::TargetNamesAll, "_targets/all" },
70 { PlayerBuildInfo::TargetNamesEnabled, "" }, 70 { PlayerBuildInfo::TargetNamesEnabled, "_targets/enabled" },
71 { PlayerBuildInfo::LanguageInfo, "languages/:target:" },
72 { PlayerBuildInfo::LanguageList, "_languages/list" },
71}; 73};
72 74
73const static struct { 75const static struct {
@@ -227,6 +229,25 @@ QVariant PlayerBuildInfo::value(DeviceInfo item, QString target)
227 result = targetNames(false); 229 result = targetNames(false);
228 break; 230 break;
229 231
232 case LanguageList:
233 // Return a map (language, display string).
234 {
235 // need to use (QString, QVariant) here, so we can put the map into
236 // a QVariant by itself.
237 QMap<QString, QVariant> m;
238
239 playerInfo.beginGroup("languages");
240 QStringList a = playerInfo.childKeys();
241
242 for(int i = 0; i < a.size(); i++) {
243 QStringList v = playerInfo.value(a.at(i)).toStringList();
244 m[v.at(0)] = v.at(1);
245 }
246 playerInfo.endGroup();
247 result = m;
248 }
249 break;
250
230 default: 251 default:
231 result = playerInfo.value(s); 252 result = playerInfo.value(s);
232 break; 253 break;
diff --git a/rbutil/rbutilqt/base/playerbuildinfo.h b/rbutil/rbutilqt/base/playerbuildinfo.h
index 5307148ff5..52654312a0 100644
--- a/rbutil/rbutilqt/base/playerbuildinfo.h
+++ b/rbutil/rbutilqt/base/playerbuildinfo.h
@@ -69,6 +69,8 @@ public:
69 69
70 TargetNamesAll, 70 TargetNamesAll,
71 TargetNamesEnabled, 71 TargetNamesEnabled,
72 LanguageInfo,
73 LanguageList,
72 }; 74 };
73 75
74 enum SystemUrl { 76 enum SystemUrl {
diff --git a/rbutil/rbutilqt/base/systeminfo.cpp b/rbutil/rbutilqt/base/systeminfo.cpp
index 6717b120cc..2b39300930 100644
--- a/rbutil/rbutilqt/base/systeminfo.cpp
+++ b/rbutil/rbutilqt/base/systeminfo.cpp
@@ -38,26 +38,6 @@ void SystemInfo::ensureSystemInfoExists()
38} 38}
39 39
40 40
41QMap<QString, QStringList> SystemInfo::languages(bool namesOnly)
42{
43 ensureSystemInfoExists();
44
45 QMap<QString, QStringList> result;
46 systemInfos->beginGroup("languages");
47 QStringList a = systemInfos->childKeys();
48 for(int i = 0; i < a.size(); i++)
49 {
50 QStringList data = systemInfos->value(a.at(i), "null").toStringList();
51 if(namesOnly)
52 result.insert(data.at(0), QStringList(data.at(1)));
53 else
54 result.insert(a.at(i), data);
55 }
56 systemInfos->endGroup();
57 return result;
58}
59
60
61QMap<int, QStringList> SystemInfo::usbIdMap(enum MapType type) 41QMap<int, QStringList> SystemInfo::usbIdMap(enum MapType type)
62{ 42{
63 ensureSystemInfoExists(); 43 ensureSystemInfoExists();
diff --git a/rbutil/rbutilqt/base/systeminfo.h b/rbutil/rbutilqt/base/systeminfo.h
index d5a99082aa..5ca5b35885 100644
--- a/rbutil/rbutilqt/base/systeminfo.h
+++ b/rbutil/rbutilqt/base/systeminfo.h
@@ -34,9 +34,6 @@ class SystemInfo : public QObject
34 MapIncompatible, 34 MapIncompatible,
35 }; 35 };
36 36
37 //! returns a map of all languages.
38 //! Maps <language code> to (<language name>, <display name>)
39 static QMap<QString, QStringList> languages(bool namesOnly = false);
40 //! returns a map of usb-ids and their targets 37 //! returns a map of usb-ids and their targets
41 static QMap<int, QStringList> usbIdMap(enum MapType type); 38 static QMap<int, QStringList> usbIdMap(enum MapType type);
42 //! get a value from system settings 39 //! get a value from system settings
diff --git a/rbutil/rbutilqt/base/ttssapi.cpp b/rbutil/rbutilqt/base/ttssapi.cpp
index f754f1a19b..ab972445f3 100644
--- a/rbutil/rbutilqt/base/ttssapi.cpp
+++ b/rbutil/rbutilqt/base/ttssapi.cpp
@@ -19,7 +19,7 @@
19#include "ttssapi.h" 19#include "ttssapi.h"
20#include "utils.h" 20#include "utils.h"
21#include "rbsettings.h" 21#include "rbsettings.h"
22#include "systeminfo.h" 22#include "playerbuildinfo.h"
23#include "Logger.h" 23#include "Logger.h"
24 24
25TTSSapi::TTSSapi(QObject* parent) : TTSBase(parent) 25TTSSapi::TTSSapi(QObject* parent) : TTSBase(parent)
@@ -40,15 +40,12 @@ TTSBase::Capabilities TTSSapi::capabilities()
40void TTSSapi::generateSettings() 40void TTSSapi::generateSettings()
41{ 41{
42 // language 42 // language
43 QMap<QString, QStringList> languages = SystemInfo::languages(); 43 QMap<QString, QVariant> langmap = PlayerBuildInfo::instance()->value(
44 QStringList langs; 44 PlayerBuildInfo::LanguageList).toMap();
45 for(int i = 0; i < languages.size(); ++i) {
46 langs.append(languages.values().at(i).at(0));
47 }
48 EncTtsSetting* setting = new EncTtsSetting(this, 45 EncTtsSetting* setting = new EncTtsSetting(this,
49 EncTtsSetting::eSTRINGLIST, tr("Language:"), 46 EncTtsSetting::eSTRINGLIST, tr("Language:"),
50 RbSettings::subValue(m_TTSType, RbSettings::TtsLanguage), 47 RbSettings::subValue(m_TTSType, RbSettings::TtsLanguage),
51 langs); 48 langmap.keys());
52 connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList())); 49 connect(setting,SIGNAL(dataChanged()),this,SLOT(updateVoiceList()));
53 insertSetting(eLANGUAGE,setting); 50 insertSetting(eLANGUAGE,setting);
54 // voice 51 // voice
diff --git a/rbutil/rbutilqt/createvoicewindow.cpp b/rbutil/rbutilqt/createvoicewindow.cpp
index b56ffdb2c7..158c1201ce 100644
--- a/rbutil/rbutilqt/createvoicewindow.cpp
+++ b/rbutil/rbutilqt/createvoicewindow.cpp
@@ -22,7 +22,7 @@
22 22
23#include "configure.h" 23#include "configure.h"
24#include "rbsettings.h" 24#include "rbsettings.h"
25#include "systeminfo.h" 25#include "playerbuildinfo.h"
26#include "Logger.h" 26#include "Logger.h"
27 27
28CreateVoiceWindow::CreateVoiceWindow(QWidget *parent) : QDialog(parent) 28CreateVoiceWindow::CreateVoiceWindow(QWidget *parent) : QDialog(parent)
@@ -70,26 +70,32 @@ void CreateVoiceWindow::accept()
70 */ 70 */
71void CreateVoiceWindow::updateSettings(void) 71void CreateVoiceWindow::updateSettings(void)
72{ 72{
73 // fill in language combobox 73 // fill in language combobox. Map has QString as value, but is stored as QVariant.
74 QMap<QString, QStringList> languages = SystemInfo::languages(); 74 QMap<QString, QVariant> langs
75 75 = PlayerBuildInfo::instance()->value(PlayerBuildInfo::LanguageList).toMap();
76 for(int i = 0; i < languages.keys().size(); i++) { 76 for(auto it = langs.begin(); it != langs.end(); it++) {
77 QString key = languages.keys().at(i); 77 ui.comboLanguage->addItem(it.value().toString(), it.key());
78 ui.comboLanguage->addItem(languages.value(key).at(1), languages.value(key).at(0));
79 } 78 }
80 // set saved lang 79 // set saved lang
81 int sel = ui.comboLanguage->findData( 80 int sel = ui.comboLanguage->findData(
82 RbSettings::value(RbSettings::VoiceLanguage).toString()); 81 RbSettings::value(RbSettings::VoiceLanguage).toString());
83 // if no saved language is found try to figure the language from the UI lang 82 // if no saved language is found try to figure the language from the UI lang
84 if(sel == -1) { 83 if(sel == -1) {
84 // the UI language is stored as ISO 631-1 code. Try to resolve it to the
85 // Rockbox language string.
85 QString uilang = RbSettings::value(RbSettings::Language).toString(); 86 QString uilang = RbSettings::value(RbSettings::Language).toString();
86 // if no language is set default to english. Make sure not to check an empty string. 87 // default to english if no language is set.
87 QString f = "english"; 88 if(uilang.isEmpty()) {
88 if(!uilang.isEmpty() && languages.contains(uilang)) { 89 // FIXME: we try to set the UI language from the environment, but
89 f = languages.value(uilang).at(0); 90 // don't store it unless changed. Falling back to en is only valid
91 // if the system is actually english.
92 uilang = "en";
93 }
94 QString l = PlayerBuildInfo::instance()->value(
95 PlayerBuildInfo::LanguageInfo, uilang).toStringList().at(0);
96 if(!l.isEmpty()) {
97 sel = ui.comboLanguage->findData(l);
90 } 98 }
91 sel = ui.comboLanguage->findData(f);
92 LOG_INFO() << "Selected language index:" << sel;
93 } 99 }
94 ui.comboLanguage->setCurrentIndex(sel); 100 ui.comboLanguage->setCurrentIndex(sel);
95 101
diff --git a/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp b/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
index 3f8d02a554..dcf3c6558f 100644
--- a/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
+++ b/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
@@ -24,7 +24,6 @@
24#include "playerbuildinfo.h" 24#include "playerbuildinfo.h"
25#include "rbsettings.h" 25#include "rbsettings.h"
26#include "rockboxinfo.h" 26#include "rockboxinfo.h"
27#include "systeminfo.h"
28#include "progressloggergui.h" 27#include "progressloggergui.h"
29#include "bootloaderinstallbase.h" 28#include "bootloaderinstallbase.h"
30#include "bootloaderinstallhelper.h" 29#include "bootloaderinstallhelper.h"
@@ -100,6 +99,8 @@ void SelectiveInstallWidget::selectedVersionChanged(int index)
100 ui.voiceCheckbox->setEnabled(voice); 99 ui.voiceCheckbox->setEnabled(voice);
101 ui.voiceCombobox->setEnabled(voice); 100 ui.voiceCombobox->setEnabled(voice);
102 ui.voiceLabel->setEnabled(voice); 101 ui.voiceLabel->setEnabled(voice);
102
103 updateVoiceLangs();
103} 104}
104 105
105 106
@@ -162,21 +163,25 @@ void SelectiveInstallWidget::updateVersion(void)
162 RockboxInfo info(m_mountpoint); 163 RockboxInfo info(m_mountpoint);
163 ui.bootloaderCheckbox->setChecked(!info.success()); 164 ui.bootloaderCheckbox->setChecked(!info.success());
164 } 165 }
166
167 updateVoiceLangs();
168}
169
170void SelectiveInstallWidget::updateVoiceLangs()
171{
165 // populate languages for voice file. 172 // populate languages for voice file.
166 // FIXME: currently only english. Need to get the available languages from
167 // build-info later.
168 QVariant current = ui.voiceCombobox->currentData(); 173 QVariant current = ui.voiceCombobox->currentData();
169 QMap<QString, QStringList> languages = SystemInfo::languages(true); 174 QMap<QString, QVariant> langs = PlayerBuildInfo::instance()->value(
170 QStringList voicelangs; 175 PlayerBuildInfo::LanguageList).toMap();
171 voicelangs << "english"; 176 QStringList voicelangs = PlayerBuildInfo::instance()->value(
177 PlayerBuildInfo::BuildVoiceLangs, m_buildtype).toStringList();
172 ui.voiceCombobox->clear(); 178 ui.voiceCombobox->clear();
173 for(int i = 0; i < voicelangs.size(); i++) { 179 for(auto it = langs.begin(); it != langs.end(); it++) {
174 QString key = voicelangs.at(i); 180 if(voicelangs.contains(it.key())) {
175 if(!languages.contains(key)) { 181 ui.voiceCombobox->addItem(it.value().toString(), it.key());
176 LOG_WARNING() << "trying to add unknown language" << key; 182 LOG_INFO() << "available voices: adding" << it.key();
177 continue;
178 } 183 }
179 ui.voiceCombobox->addItem(languages.value(key).at(0), key); 184
180 } 185 }
181 // try to select the previously selected one again (if still present) 186 // try to select the previously selected one again (if still present)
182 // TODO: Fall back to system language if not found, or english. 187 // TODO: Fall back to system language if not found, or english.
diff --git a/rbutil/rbutilqt/gui/selectiveinstallwidget.h b/rbutil/rbutilqt/gui/selectiveinstallwidget.h
index 946aa93429..40e904ea37 100644
--- a/rbutil/rbutilqt/gui/selectiveinstallwidget.h
+++ b/rbutil/rbutilqt/gui/selectiveinstallwidget.h
@@ -42,6 +42,7 @@ class SelectiveInstallWidget : public QWidget
42 void continueInstall(bool); 42 void continueInstall(bool);
43 void customizeThemes(void); 43 void customizeThemes(void);
44 void selectedVersionChanged(int); 44 void selectedVersionChanged(int);
45 void updateVoiceLangs();
45 46
46 private: 47 private:
47 void installBootloader(void); 48 void installBootloader(void);
diff --git a/rbutil/rbutilqt/test/test-playerbuildinfo.cpp b/rbutil/rbutilqt/test/test-playerbuildinfo.cpp
index fe07ba8348..a250e37979 100644
--- a/rbutil/rbutilqt/test/test-playerbuildinfo.cpp
+++ b/rbutil/rbutilqt/test/test-playerbuildinfo.cpp
@@ -137,23 +137,26 @@ struct {
137 QString expected; 137 QString expected;
138} testdataPlayer[] = 138} testdataPlayer[] =
139{ 139{
140 {"archosfmrecorder", PlayerBuildInfo::BuildStatus, "3"}, 140 { "archosfmrecorder", PlayerBuildInfo::BuildStatus, "3" },
141 { "iriverh10", PlayerBuildInfo::BuildStatus, "0" }, 141 { "iriverh10", PlayerBuildInfo::BuildStatus, "0" },
142 { "iriverh100", PlayerBuildInfo::BuildStatus, "2" }, 142 { "iriverh100", PlayerBuildInfo::BuildStatus, "2" },
143 { "iriverh300", PlayerBuildInfo::BuildStatus, "1" }, 143 { "iriverh300", PlayerBuildInfo::BuildStatus, "1" },
144 { "archosfmrecorder", PlayerBuildInfo::BuildStatus, "3" }, 144 { "archosfmrecorder", PlayerBuildInfo::BuildStatus, "3" },
145 {"archosfmrecorder", PlayerBuildInfo::DisplayName, "Jukebox Recorder FM"}, 145 { "archosfmrecorder", PlayerBuildInfo::DisplayName, "Jukebox Recorder FM"},
146 {"archosfmrecorder", PlayerBuildInfo::BootloaderMethod, "none"}, 146 { "archosfmrecorder", PlayerBuildInfo::BootloaderMethod, "none" },
147 {"archosfmrecorder", PlayerBuildInfo::BootloaderName, ""}, 147 { "archosfmrecorder", PlayerBuildInfo::BootloaderName, "" },
148 {"archosfmrecorder", PlayerBuildInfo::BootloaderFile, ""}, 148 { "archosfmrecorder", PlayerBuildInfo::BootloaderFile, "" },
149 {"archosfmrecorder", PlayerBuildInfo::BootloaderFilter, ""}, 149 { "archosfmrecorder", PlayerBuildInfo::BootloaderFilter, "" },
150 {"archosfmrecorder", PlayerBuildInfo::Encoder, "lame"}, 150 { "archosfmrecorder", PlayerBuildInfo::Encoder, "lame" },
151 {"archosfmrecorder", PlayerBuildInfo::Brand, "Archos"}, 151 { "archosfmrecorder", PlayerBuildInfo::Brand, "Archos" },
152 {"archosfmrecorder", PlayerBuildInfo::PlayerPicture, "archosfmrecorder"}, 152 { "archosfmrecorder", PlayerBuildInfo::PlayerPicture, "archosfmrecorder"},
153 {"iriverh100", PlayerBuildInfo::BuildStatus, "2"}, 153 { "iriverh100", PlayerBuildInfo::BuildStatus, "2" },
154 {"iriverh100", PlayerBuildInfo::BootloaderMethod, "hex"}, 154 { "iriverh100", PlayerBuildInfo::BootloaderMethod, "hex" },
155 {"iriverh100", PlayerBuildInfo::BootloaderFilter, "*.hex *.zip"}, 155 { "iriverh100", PlayerBuildInfo::BootloaderFilter, "*.hex *.zip" },
156 {"ipodmini2g", PlayerBuildInfo::Encoder, "rbspeex"}, 156 { "ipodmini2g", PlayerBuildInfo::Encoder, "rbspeex" },
157 { "078174b1", PlayerBuildInfo::DisplayName, "Sansa View" },
158 { "de", PlayerBuildInfo::LanguageInfo, "deutsch,Deutsch" },
159 { "en_US", PlayerBuildInfo::LanguageInfo, "english-us,English (US)" },
157}; 160};
158 161
159void TestPlayerBuildInfo::testBuildInfo_data() 162void TestPlayerBuildInfo::testBuildInfo_data()