diff options
author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2020-12-05 13:14:43 +0100 |
---|---|---|
committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2020-12-05 13:44:37 +0100 |
commit | 0e315e848ae7ea5b226af4ab16c215119cbd3fb3 (patch) | |
tree | eed592e48bbd636ecdc02d65f7befbf213584faf /rbutil | |
parent | ac5fc26085e390cb55a3a5fd186a8091adcae2d4 (diff) | |
download | rockbox-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
Diffstat (limited to 'rbutil')
-rw-r--r-- | rbutil/rbutilqt/base/playerbuildinfo.cpp | 25 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/playerbuildinfo.h | 2 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/systeminfo.cpp | 20 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/systeminfo.h | 3 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/ttssapi.cpp | 11 | ||||
-rw-r--r-- | rbutil/rbutilqt/createvoicewindow.cpp | 32 | ||||
-rw-r--r-- | rbutil/rbutilqt/gui/selectiveinstallwidget.cpp | 29 | ||||
-rw-r--r-- | rbutil/rbutilqt/gui/selectiveinstallwidget.h | 1 | ||||
-rw-r--r-- | rbutil/rbutilqt/test/test-playerbuildinfo.cpp | 37 |
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 | ||
73 | const static struct { | 75 | const 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 | ||
41 | QMap<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 | |||
61 | QMap<int, QStringList> SystemInfo::usbIdMap(enum MapType type) | 41 | QMap<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 | ||
25 | TTSSapi::TTSSapi(QObject* parent) : TTSBase(parent) | 25 | TTSSapi::TTSSapi(QObject* parent) : TTSBase(parent) |
@@ -40,15 +40,12 @@ TTSBase::Capabilities TTSSapi::capabilities() | |||
40 | void TTSSapi::generateSettings() | 40 | void 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 | ||
28 | CreateVoiceWindow::CreateVoiceWindow(QWidget *parent) : QDialog(parent) | 28 | CreateVoiceWindow::CreateVoiceWindow(QWidget *parent) : QDialog(parent) |
@@ -70,26 +70,32 @@ void CreateVoiceWindow::accept() | |||
70 | */ | 70 | */ |
71 | void CreateVoiceWindow::updateSettings(void) | 71 | void 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 | |||
170 | void 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 | ||
159 | void TestPlayerBuildInfo::testBuildInfo_data() | 162 | void TestPlayerBuildInfo::testBuildInfo_data() |