Skip to content

Commit 79ebea9

Browse files
committed
TOOLS: Improve GUI for Ogg encoding options
This makes it possible to encode using a target quality instead of target bitrate and also makes min and max bitrates optionals. This fixes bug #3092367.
1 parent cf8d020 commit 79ebea9

File tree

8 files changed

+155
-52
lines changed

8 files changed

+155
-52
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ For a more comprehensive changelog for the latest experimental SVN code, see:
22
http://scummvm.svn.sourceforge.net/viewvc/scummvm/tools/trunk/?view=log
33

44
1.3.0 (????-??-??)
5+
- Fix bug #3092367: "TOOLS: Improve GUI for Ogg encoding options".
56

67
1.2.0 (2010-10-15)
78
- Add extract_fascination_cd tool for extracting STK archives from a mode1/2048

compress.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,9 @@ void CompressionTool::setOggQuality(const std::string& arg) {
892892

893893
if (oggparms.quality < -1.f || oggparms.quality > 10.f)
894894
throw ToolException("Quality out of bounds (-q), must be between -1 and 10.");
895+
896+
// Also unset nominal bitrate so that quality is used
897+
oggparms.nominalBitr = -1;
895898
}
896899

897900
void CompressionTool::setOggMinBitrate(const std::string& arg) {
@@ -924,6 +927,14 @@ void CompressionTool::setOggMaxBitrate(const std::string& arg) {
924927
throw ToolException("Maximum bitrate out of bounds (-M), must be between 8 and 160.");
925928
}
926929

930+
void CompressionTool::unsetOggMinBitrate() {
931+
oggparms.minBitr = -1;
932+
}
933+
934+
void CompressionTool::unsetOggMaxBitrate() {
935+
oggparms.maxBitr = -1;
936+
}
937+
927938
bool CompressionTool::processMp3Parms() {
928939
while (!_arguments.empty()) {
929940
std::string arg = _arguments.front();

compress.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ class CompressionTool : public Tool {
113113
void setOggMinBitrate(const std::string&);
114114
void setOggAvgBitrate(const std::string&);
115115
void setOggMaxBitrate(const std::string&);
116+
void unsetOggMinBitrate();
117+
void unsetOggMaxBitrate();
118+
116119

117120
public:
118121
bool processMp3Parms();

gui/configuration.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,12 @@ Configuration::Configuration() {
5252
flacCompressionLevel = wxT("8");
5353
flacBlockSize = wxT("1152");
5454

55-
// flac params
55+
// ogg params
56+
useOggQuality = true;
5657
oggQuality = wxT("3");
57-
oggMinBitrate = wxT("24");
58+
oggMinBitrate = wxT("None");
5859
oggAvgBitrate = wxT("24");
59-
oggMaxBitrate = wxT("64");
60+
oggMaxBitrate = wxT("None");
6061

6162
}
6263

@@ -82,6 +83,7 @@ void Configuration::load() {
8283
filecnf->Read(wxT("flacBlockSize"), &flacBlockSize, flacBlockSize);
8384

8485
// flac params
86+
filecnf->Read(wxT("useOggQuality"), &useOggQuality, useOggQuality);
8587
filecnf->Read(wxT("oggQuality"), &oggQuality, oggQuality);
8688
filecnf->Read(wxT("oggMinBitrate"), &oggMinBitrate, oggMinBitrate);
8789
filecnf->Read(wxT("oggAvgBitrate"), &oggAvgBitrate, oggAvgBitrate);
@@ -111,6 +113,7 @@ void Configuration::save(bool all) {
111113
filecnf->Write(wxT("flacBlockSize"), flacBlockSize);
112114

113115
// flac params
116+
filecnf->Write(wxT("useOggQuality"), useOggQuality);
114117
filecnf->Write(wxT("oggQuality"), oggQuality);
115118
filecnf->Write(wxT("oggMinBitrate"), oggMinBitrate);
116119
filecnf->Write(wxT("oggAvgBitrate"), oggAvgBitrate);

gui/configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ struct Configuration {
104104
wxString flacBlockSize;
105105

106106
// flac
107+
bool useOggQuality;
107108
wxString oggQuality;
108109
wxString oggMinBitrate;
109110
wxString oggAvgBitrate;

gui/gui_tools.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,18 @@ void ToolGUI::run(const Configuration &conf) const {
164164
compression->setFlacBlockSize ( (const char *)conf.flacBlockSize.mb_str() );
165165

166166
// vorbis
167-
compression->setOggQuality ( (const char *)conf.oggQuality.mb_str() );
168-
compression->setOggMinBitrate ( (const char *)conf.oggMinBitrate.mb_str() );
169-
compression->setOggAvgBitrate ( (const char *)conf.oggAvgBitrate.mb_str() );
170-
compression->setOggMaxBitrate ( (const char *)conf.oggMaxBitrate.mb_str() );
167+
if (conf.useOggQuality)
168+
compression->setOggQuality ( (const char *)conf.oggQuality.mb_str() );
169+
else
170+
compression->setOggAvgBitrate ( (const char *)conf.oggAvgBitrate.mb_str() );
171+
if (conf.oggMinBitrate == wxT("None"))
172+
compression->unsetOggMinBitrate();
173+
else
174+
compression->setOggMinBitrate ( (const char *)conf.oggMinBitrate.mb_str() );
175+
if (conf.oggMaxBitrate == wxT("None"))
176+
compression->unsetOggMaxBitrate();
177+
else
178+
compression->setOggMaxBitrate ( (const char *)conf.oggMaxBitrate.mb_str() );
171179
}
172180

173181
_backend->run();

gui/pages.cpp

Lines changed: 102 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,86 +1146,143 @@ ChooseAudioOptionsVorbisPage::ChooseAudioOptionsVorbisPage(Configuration &config
11461146

11471147
wxWindow *ChooseAudioOptionsVorbisPage::CreatePanel(wxWindow *parent) {
11481148
wxWindow *panel = WizardPage::CreatePanel(parent);
1149-
1150-
1149+
1150+
wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
1151+
11511152
/* Vorbis mode params
11521153
" -b <rate> <rate> is the nominal bitrate (default:unset)\n" \
11531154
" -m <rate> <rate> is the minimum bitrate (default:unset)\n" \
11541155
" -M <rate> <rate> is the maximum bitrate (default:unset)\n" \
11551156
" -q <value> specifies the value (0 - 10) of VBR quality (10=best) (default:" oggqualDef_str ")\n" \
11561157
" --silent the output of oggenc is hidden (default:disabled)\n" \
11571158
*/
1159+
1160+
1161+
// Grid
1162+
_gridSizer = new wxFlexGridSizer(5, 2, 10, 25);
1163+
_gridSizer->AddGrowableCol(1);
1164+
1165+
1166+
// Compression target type
1167+
_gridSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Target Type:")));
1168+
1169+
wxRadioButton *qualityButton = new wxRadioButton(
1170+
panel, wxID_ANY, wxT("Quality Factor"),
1171+
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, wxT("Quality"));
1172+
1173+
wxSizer *radioSizer = new wxBoxSizer(wxHORIZONTAL);
1174+
radioSizer->Add(qualityButton);
1175+
1176+
wxRadioButton *bitrateButton = new wxRadioButton(
1177+
panel, wxID_ANY, wxT("Nominal Bitrate"),
1178+
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, wxT("Bitrate"));
1179+
radioSizer->Add(bitrateButton);
1180+
1181+
_gridSizer->Add(radioSizer, wxSizerFlags().Expand());
1182+
1183+
1184+
// Quality
1185+
const int possibleQualityCount = 11;
1186+
wxString possibleQualities[possibleQualityCount + 1];
1187+
for (int i = 0; i <= possibleQualityCount; ++i) {
1188+
possibleQualities[i] << i;
1189+
}
1190+
1191+
_qualityFactorLabel = new wxStaticText(panel, wxID_ANY, wxT("Quality:"));
1192+
_gridSizer->Add(_qualityFactorLabel);
1193+
1194+
_qualityFactor = new wxChoice(
1195+
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
1196+
possibleQualityCount, possibleQualities, 0, wxDefaultValidator, wxT("QualityFactor"));
1197+
_gridSizer->Add(_qualityFactor, wxSizerFlags().Expand().Border(wxRIGHT, 100));
11581198

1159-
wxFlexGridSizer *sizer = new wxFlexGridSizer(4, 2, 10, 25);
1160-
sizer->AddGrowableCol(1);
11611199

11621200
// Bitrates
11631201
const int possibleBitrateCount = 160 / 8;
1164-
wxString possibleBitrates[possibleBitrateCount + 1];
1165-
for (int i = 0; i <= possibleBitrateCount; ++i) {
1202+
wxString possibleBitrates[possibleBitrateCount];
1203+
wxString possibleMinMaxBitrates[possibleBitrateCount + 1];
1204+
possibleMinMaxBitrates[0] = wxT("None");
1205+
for (int i = 0; i < possibleBitrateCount; ++i) {
11661206
possibleBitrates[i] << (i+1)*8;
1207+
possibleMinMaxBitrates[i+1] << (i+1)*8;
11671208
}
1209+
1210+
_nominalBitrateLabel = new wxStaticText(panel, wxID_ANY, wxT("Nominal Bitrate:"));
1211+
_gridSizer->Add(_nominalBitrateLabel);
11681212

1169-
sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Minimum Bitrate:")));
1213+
_nominalBitrate = new wxChoice(
1214+
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
1215+
possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("NominalBitrate"));
1216+
_gridSizer->Add(_nominalBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));
11701217

1171-
wxChoice *MinBitrate = new wxChoice(
1172-
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
1173-
possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("MinimumBitrate"));
1174-
sizer->Add(MinBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));
11751218

1176-
1177-
sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Nominal Bitrate:")));
1178-
1179-
wxChoice *AvgBitrate = new wxChoice(
1180-
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
1181-
possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("NominalBitrate"));
1182-
sizer->Add(AvgBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));
1183-
1184-
1185-
sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Maximum Bitrate:")));
1219+
_gridSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Minimum Bitrate:")));
1220+
1221+
wxChoice *MinBitrate = new wxChoice(
1222+
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
1223+
possibleBitrateCount+1, possibleMinMaxBitrates, 0, wxDefaultValidator, wxT("MinimumBitrate"));
1224+
_gridSizer->Add(MinBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));
1225+
1226+
1227+
_gridSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Maximum Bitrate:")));
11861228

11871229
wxChoice *MaxBitrate = new wxChoice(
1188-
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
1189-
possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("MaximumBitrate"));
1190-
sizer->Add(MaxBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));
1230+
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
1231+
possibleBitrateCount+1, possibleMinMaxBitrates, 0, wxDefaultValidator, wxT("MaximumBitrate"));
1232+
_gridSizer->Add(MaxBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));
1233+
11911234

1192-
// Quality
1193-
const int possibleQualityCount = 11;
1194-
wxString possibleQualities[possibleQualityCount + 1];
1195-
for (int i = 0; i <= possibleQualityCount; ++i) {
1196-
possibleQualities[i] << i;
1197-
}
1235+
qualityButton->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(ChooseAudioOptionsVorbisPage::onChangeTargetType), NULL, this);
1236+
bitrateButton->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(ChooseAudioOptionsVorbisPage::onChangeTargetType), NULL, this);
11981237

1199-
sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Quality:")));
1200-
1201-
wxChoice *quality = new wxChoice(
1202-
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
1203-
possibleQualityCount, possibleQualities, 0, wxDefaultValidator, wxT("Quality"));
1204-
sizer->Add(quality, wxSizerFlags().Expand().Border(wxRIGHT, 100));
12051238

12061239
// Finish the window
1240+
sizer->Add(_gridSizer, wxSizerFlags().Expand());
12071241
SetAlignedSizer(panel, sizer);
12081242

1209-
12101243
// Load settings
12111244
MinBitrate->SetStringSelection(_configuration.oggMinBitrate);
1212-
AvgBitrate->SetStringSelection(_configuration.oggAvgBitrate);
12131245
MaxBitrate->SetStringSelection(_configuration.oggMaxBitrate);
1214-
quality ->SetStringSelection(_configuration.oggQuality);
1246+
_qualityFactor->SetStringSelection(_configuration.oggQuality);
1247+
_nominalBitrate->SetStringSelection(_configuration.oggAvgBitrate);
1248+
if (_configuration.useOggQuality)
1249+
qualityButton->SetValue(true);
1250+
else
1251+
bitrateButton->SetValue(true);
1252+
1253+
updateFields(panel);
12151254

12161255
return panel;
12171256
}
12181257

12191258
void ChooseAudioOptionsVorbisPage::save(wxWindow *panel) {
1220-
wxChoice *minBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("MinimumBitrate")));
1221-
wxChoice *avgBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("NominalBitrate")));
1222-
wxChoice *maxBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("MaximumBitrate")));
1223-
wxChoice *quality = static_cast<wxChoice *>(panel->FindWindowByName(wxT("Quality")));
1259+
wxRadioButton *quality = static_cast<wxRadioButton *>(panel->FindWindowByName(wxT("Quality")));
1260+
wxChoice *minBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("MinimumBitrate")));
1261+
wxChoice *maxBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("MaximumBitrate")));
12241262

1263+
_configuration.useOggQuality = quality->GetValue();
12251264
_configuration.oggMinBitrate = minBitrate->GetStringSelection();
1226-
_configuration.oggAvgBitrate = avgBitrate->GetStringSelection();
1265+
_configuration.oggAvgBitrate = _nominalBitrate->GetStringSelection();
12271266
_configuration.oggMaxBitrate = maxBitrate->GetStringSelection();
1228-
_configuration.oggQuality = quality ->GetStringSelection();
1267+
_configuration.oggQuality = _qualityFactor->GetStringSelection();
1268+
}
1269+
1270+
void ChooseAudioOptionsVorbisPage::updateFields(wxWindow *panel) {
1271+
wxRadioButton *quality = static_cast<wxRadioButton *>(panel->FindWindowByName(wxT("Quality")));
1272+
1273+
bool isQualitySelected = quality->GetValue();
1274+
_gridSizer->Show(_qualityFactor, isQualitySelected);
1275+
_gridSizer->Show(_qualityFactorLabel, isQualitySelected);
1276+
_gridSizer->Show(_nominalBitrate, !isQualitySelected);
1277+
_gridSizer->Show(_nominalBitrateLabel, !isQualitySelected);
1278+
1279+
_gridSizer->Layout();
1280+
}
1281+
1282+
void ChooseAudioOptionsVorbisPage::onChangeTargetType(wxCommandEvent &evt) {
1283+
wxRadioButton *btn = static_cast<wxRadioButton *>(evt.GetEventObject());
1284+
wxWindow *parent = btn->GetParent();
1285+
updateFields(parent);
12291286
}
12301287

12311288
void ChooseAudioOptionsVorbisPage::onNext(wxWindow *panel) {

gui/pages.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,25 @@ class ChooseAudioOptionsVorbisPage : public WizardPage {
366366
void onNext(wxWindow *panel);
367367

368368
void save(wxWindow *panel);
369+
370+
/**
371+
* Handles clicks on the radio buttons for Quality / Nominal bitrate
372+
*/
373+
void onChangeTargetType(wxCommandEvent &evt);
374+
375+
/**
376+
* Enables/Disables the different fields depending on ABR/VBR setting
377+
*
378+
* @param panel The panel to operate on
379+
*/
380+
void updateFields(wxWindow *panel);
381+
382+
private:
383+
wxFlexGridSizer* _gridSizer;
384+
wxStaticText* _qualityFactorLabel;
385+
wxChoice* _qualityFactor;
386+
wxStaticText* _nominalBitrateLabel;
387+
wxChoice* _nominalBitrate;
369388
};
370389

371390

0 commit comments

Comments
 (0)