1 | #include "soundpagefinal.h"
|
---|
2 | #include "ui_soundpagefinal.h"
|
---|
3 |
|
---|
4 | SoundPageFinal::SoundPageFinal(QString AppDir, QString soundsLocation, DropTableWidget *page2Table, Logger *myLogger, QHash<QString, QString> *commandMap, QWidget *parent) :
|
---|
5 | QWizardPage(parent),
|
---|
6 | ui(new Ui::soundpagefinal)
|
---|
7 | {
|
---|
8 | ui->setupUi(this);
|
---|
9 | this->soundsLocation=soundsLocation;
|
---|
10 | this->page2Table=page2Table;
|
---|
11 | this->myLogger=myLogger;
|
---|
12 | this->commandMap=commandMap;
|
---|
13 |
|
---|
14 | this->xmlCommands = new QStringList();
|
---|
15 | this->oniSplitCommands = new QStringList();
|
---|
16 | this->myXmlProcessor = new XmlProcessor(AppDir, this->myLogger,this->xmlCommands);
|
---|
17 | this->myConverter = new Converter(AppDir, this->myLogger,this->oniSplitCommands);
|
---|
18 |
|
---|
19 | ui->lbComplete->setText("<html>The wizard is now complete. The sounds have been converted. "
|
---|
20 | "You can view all converted files clicking <a href=' '>here.</a><br />"
|
---|
21 | "<br />Click restart to create more sounds from the wizard beggining, "
|
---|
22 | "otherwise click finish.</html>"); // Don't use rich text in qtdesigner because it generates platform dependent code
|
---|
23 |
|
---|
24 | connectSlots();
|
---|
25 | }
|
---|
26 |
|
---|
27 | void SoundPageFinal::openSoundsFolder(){
|
---|
28 | QString outputFolder;
|
---|
29 |
|
---|
30 | if(field("rbOther").toBool()){
|
---|
31 | outputFolder=field("leOtherLocation").toString();
|
---|
32 | }
|
---|
33 | else{
|
---|
34 | outputFolder=this->soundsLocation;
|
---|
35 | }
|
---|
36 |
|
---|
37 | QDesktopServices::openUrl(QUrl("file:///"+outputFolder));
|
---|
38 | }
|
---|
39 |
|
---|
40 | void SoundPageFinal::initializePage(){
|
---|
41 | startProcessing();
|
---|
42 | }
|
---|
43 |
|
---|
44 | void SoundPageFinal::startProcessing(){
|
---|
45 | // Sample files names
|
---|
46 | QString ambFile="OSBDsample_file.amb.xml";
|
---|
47 | QString grpFile="OSBDsample_file.grp.xml";
|
---|
48 | QString impFile="OSBDsample_file.imp.xml";
|
---|
49 | QString ambFileLocation=GlobalVars::VagoTemporaryDir+"/"+ambFile;
|
---|
50 | QString grpFileLocation=GlobalVars::VagoTemporaryDir+"/"+grpFile;
|
---|
51 | QString impFileLocation=GlobalVars::VagoTemporaryDir+"/"+impFile;
|
---|
52 |
|
---|
53 | // Page 2 variables
|
---|
54 | QString outputFolder;
|
---|
55 |
|
---|
56 | // Page 3 variables
|
---|
57 | QString sphereRadious, minElapsedTime, maxElapsedTime, minVolumeDistance,
|
---|
58 | maxVolumeDistance, minOcclusion, treshold, priority;
|
---|
59 | QStringList flags;
|
---|
60 | bool priorityLow = false, priorityNormal = false,
|
---|
61 | priorityHigh = false, priorityHighest = false;
|
---|
62 |
|
---|
63 | bool interruptOnStop=false;
|
---|
64 | bool playOnce=false;
|
---|
65 | bool canPan=false;
|
---|
66 |
|
---|
67 | // Page 4 variables
|
---|
68 | QString volume, minVolume, maxVolume, pitch, minPitch, weight, maxPitch,
|
---|
69 | numberChannels;
|
---|
70 | bool preventRepeat=false;
|
---|
71 | bool stereo22=false, mono22=false, mono44Pc=false;
|
---|
72 |
|
---|
73 | // Page 5 variables
|
---|
74 | QString minVolumeDistanceImp, maxVolumeDistanceImp, minAngleImp,
|
---|
75 | maxAngleImp, minAttenuationImp, impactVelocityImp,
|
---|
76 | minOcclusionImp, priorityImp;
|
---|
77 | bool priorityLowImp = false, priorityNormalImp = false,
|
---|
78 | priorityHighImp = false, priorityHighestImp = false;
|
---|
79 |
|
---|
80 | // Create temp folder if it doesn't exist
|
---|
81 | if(!QDir(GlobalVars::VagoTemporaryDir).exists()){
|
---|
82 | QDir().mkdir(GlobalVars::VagoTemporaryDir);
|
---|
83 | }
|
---|
84 |
|
---|
85 | // Get data page 2
|
---|
86 | if(field("rbOther").toBool()){
|
---|
87 | outputFolder=field("leOtherLocation").toString();
|
---|
88 | }
|
---|
89 | else{
|
---|
90 | outputFolder=this->soundsLocation;
|
---|
91 | }
|
---|
92 |
|
---|
93 | // Get data page 3
|
---|
94 |
|
---|
95 | priorityLow=field("rbPriorityLow").toBool();
|
---|
96 | priorityNormal=field("rbPriorityNormal").toBool();
|
---|
97 | priorityHigh=field("rbPriorityHigh").toBool();
|
---|
98 | priorityHighest=field("rbPriorityHighest").toBool();
|
---|
99 | interruptOnStop=field("cbInterruptOnStop").toBool();
|
---|
100 | playOnce=field("cbPlayOnce").toBool();
|
---|
101 | canPan=field("cbCanPan").toBool();
|
---|
102 |
|
---|
103 | if(priorityNormal){
|
---|
104 | priority="Normal";
|
---|
105 | }
|
---|
106 | else if(priorityLow){
|
---|
107 | priority="Low";
|
---|
108 | }
|
---|
109 | else if(priorityHigh){
|
---|
110 | priority="High";
|
---|
111 | }
|
---|
112 | else if(priorityHighest){
|
---|
113 | priority="Highest";
|
---|
114 | }
|
---|
115 |
|
---|
116 | if(interruptOnStop){
|
---|
117 | flags << "InterruptTracksOnStop";
|
---|
118 | }
|
---|
119 |
|
---|
120 | if(playOnce){
|
---|
121 | flags << "PlayOnce";
|
---|
122 | }
|
---|
123 |
|
---|
124 | if(canPan){
|
---|
125 | flags << "CanPan";
|
---|
126 | }
|
---|
127 |
|
---|
128 | sphereRadious=Util::normalizeDecimalSeparator(field("leSphereRadious").toString());
|
---|
129 | minElapsedTime=Util::normalizeDecimalSeparator(field("leMinElapsedTime").toString());
|
---|
130 | maxElapsedTime=Util::normalizeDecimalSeparator(field("leMaxElapsedTime").toString());
|
---|
131 | minVolumeDistance=Util::normalizeDecimalSeparator(field("leMinVolumeDistance").toString());
|
---|
132 | maxVolumeDistance=Util::normalizeDecimalSeparator(field("leMaxVolumeDistance").toString());
|
---|
133 | minOcclusion=Util::normalizeDecimalSeparator(field("leMinOcclusion").toString());
|
---|
134 | treshold=Util::normalizeDecimalSeparator(field("leTreshold").toString());
|
---|
135 |
|
---|
136 | // Get data page 4
|
---|
137 |
|
---|
138 | volume=Util::normalizeDecimalSeparator(field("leVolume").toString());
|
---|
139 | minVolume=Util::normalizeDecimalSeparator(field("leMinVolume").toString());
|
---|
140 | maxVolume=Util::normalizeDecimalSeparator(field("leMaxVolume").toString());
|
---|
141 | pitch=Util::normalizeDecimalSeparator(field("lePitch").toString());
|
---|
142 | minPitch=Util::normalizeDecimalSeparator(field("leMinPitch").toString());
|
---|
143 | maxPitch=Util::normalizeDecimalSeparator(field("leMaxPitch").toString());
|
---|
144 | weight=Util::normalizeDecimalSeparator(field("leWeight").toString());
|
---|
145 |
|
---|
146 | preventRepeat=field("cbPreventRepeat").toBool();
|
---|
147 |
|
---|
148 | stereo22=field("rbStereo22").toBool();
|
---|
149 | mono22=field("rbMono22").toBool();
|
---|
150 | mono44Pc=field("rbMono44Pc").toBool();
|
---|
151 |
|
---|
152 | if(stereo22 || mono44Pc){
|
---|
153 | numberChannels="2";
|
---|
154 | }
|
---|
155 | else if(mono22){
|
---|
156 | numberChannels="1";
|
---|
157 | }
|
---|
158 |
|
---|
159 | // Get data page 5
|
---|
160 | priorityLowImp=field("rbPriorityLowImp").toBool();
|
---|
161 | priorityNormalImp=field("rbPriorityNormalImp").toBool();
|
---|
162 | priorityHighImp=field("rbPriorityHighImp").toBool();
|
---|
163 | priorityHighestImp=field("rbPriorityHighestImp").toBool();
|
---|
164 |
|
---|
165 | if(priorityNormalImp){
|
---|
166 | priorityImp="Normal";
|
---|
167 | }
|
---|
168 | else if(priorityLowImp){
|
---|
169 | priorityImp="Low";
|
---|
170 | }
|
---|
171 | else if(priorityHighImp){
|
---|
172 | priorityImp="High";
|
---|
173 | }
|
---|
174 | else if(priorityHighestImp){
|
---|
175 | priorityImp="Highest";
|
---|
176 | }
|
---|
177 |
|
---|
178 | minVolumeDistanceImp=Util::normalizeDecimalSeparator(field("leMinVolumeDistanceImp").toString());
|
---|
179 | maxVolumeDistanceImp=Util::normalizeDecimalSeparator(field("leMaxVolumeDistanceImp").toString());
|
---|
180 | minAngleImp=Util::normalizeDecimalSeparator(field("leMinAngleImp").toString());
|
---|
181 | maxAngleImp=Util::normalizeDecimalSeparator(field("leMaxAngleImp").toString());
|
---|
182 | minAttenuationImp=Util::normalizeDecimalSeparator(field("leMinAttenuationImp").toString());
|
---|
183 | impactVelocityImp=Util::normalizeDecimalSeparator(field("leImpactVelocityImp").toString());
|
---|
184 | minOcclusionImp=Util::normalizeDecimalSeparator(field("leMinOcclusionImp").toString());
|
---|
185 |
|
---|
186 | //######################################################### Starting xml processing
|
---|
187 |
|
---|
188 | // Clean tmp dir
|
---|
189 | if(!Util::rmDir(GlobalVars::VagoTemporaryDir)){
|
---|
190 | UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "Couldn't clean vago temp dir for complete sound wizard. Aborting.\n"+GlobalVars::VagoTemporaryDir);
|
---|
191 | return;
|
---|
192 | }
|
---|
193 |
|
---|
194 | if(!QDir(QDir::tempPath()).mkpath("VagoTemp")){
|
---|
195 | UtilVago::showAndLogErrorPopUpLogButton(this->myLogger, "Couldn't reconstruct vago temp dir for complete sound wizard. Aborting.\n"+GlobalVars::VagoTemporaryDir);
|
---|
196 | }
|
---|
197 |
|
---|
198 | // Copy sample xml files to tmp dir
|
---|
199 | QFile::copy(":/new/sampleFiles/"+ambFile , ambFileLocation);
|
---|
200 | QFile::copy(":/new/sampleFiles/"+grpFile , grpFileLocation);
|
---|
201 | QFile::copy(":/new/sampleFiles/"+impFile , impFileLocation);
|
---|
202 | QFile::setPermissions(ambFileLocation, QFile::ReadOwner | QFile::WriteOwner); //remove read only attribute that come from resources
|
---|
203 | QFile::setPermissions(grpFileLocation, QFile::ReadOwner | QFile::WriteOwner);
|
---|
204 | QFile::setPermissions(impFileLocation, QFile::ReadOwner | QFile::WriteOwner);
|
---|
205 |
|
---|
206 | (*this->xmlCommands)
|
---|
207 | << "--replace-all-values -e Priority -n "+Util::insertQuotes(priority)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
208 | << "--replace-all-values -e Flags -n "+(flags.join(" ").isEmpty() ? Util::insertQuotes("") : Util::insertQuotes(flags.join(" ")))+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
209 | << "--replace-all-values -e SphereRadius -n "+Util::insertQuotes(sphereRadious)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
210 | << "--replace-all-values -e Treshold -n "+Util::insertQuotes(treshold)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
211 | << "--replace-all-values -e MinOcclusion -n "+Util::insertQuotes(minOcclusion)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
212 | << "--replace-all-values --parent-element-name ElapsedTime -e Max -n "+Util::insertQuotes(maxElapsedTime)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
213 | << "--replace-all-values --parent-element-name ElapsedTime -e Min -n "+Util::insertQuotes(minElapsedTime)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
214 | << "--replace-all-values --parent-element-name Distance -e Max -n "+Util::insertQuotes(maxVolumeDistance)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
215 | << "--replace-all-values --parent-element-name Distance -e Min -n "+Util::insertQuotes(minVolumeDistance)+" -f "+Util::insertQuotes(ambFileLocation)+" --no-backups --no-verbose"
|
---|
216 | << "--replace-all-values --parent-element-name SoundGroup -e Volume -n "+Util::insertQuotes(volume)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
|
---|
217 | << "--replace-all-values --parent-element-name SoundGroup -e Pitch -n "+Util::insertQuotes(pitch)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
|
---|
218 | << "--replace-all-values --parent-element-name SoundGroup -e NumberOfChannels -n "+Util::insertQuotes(numberChannels)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
|
---|
219 | << "--replace-all-values --parent-element-name Volume -e Min -n "+Util::insertQuotes(minVolume)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
|
---|
220 | << "--replace-all-values --parent-element-name Volume -e Max -n "+Util::insertQuotes(maxVolume)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
|
---|
221 | << "--replace-all-values --parent-element-name Pitch -e Min -n "+Util::insertQuotes(minPitch)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
|
---|
222 | << "--replace-all-values --parent-element-name Pitch -e Max -n "+Util::insertQuotes(maxPitch)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
|
---|
223 | << "--replace-all-values -e Weight -n "+Util::insertQuotes(weight)+" -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose"
|
---|
224 | << "--replace-all-values -e Priority -n "+Util::insertQuotes(priorityImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
|
---|
225 | << "--replace-all-values --parent-element-name Distance -e Min -n "+Util::insertQuotes(minVolumeDistanceImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
|
---|
226 | << "--replace-all-values --parent-element-name Distance -e Max -n "+Util::insertQuotes(maxVolumeDistanceImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
|
---|
227 | << "--replace-all-values --parent-element-name Angle -e Min -n "+Util::insertQuotes(minAngleImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
|
---|
228 | << "--replace-all-values --parent-element-name Angle -e Max -n "+Util::insertQuotes(maxAngleImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
|
---|
229 | << "--replace-all-values -e MinAttenuation -n "+Util::insertQuotes(minAttenuationImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
|
---|
230 | << "--replace-all-values -e ImpactVelocity -n "+Util::insertQuotes(impactVelocityImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose"
|
---|
231 | << "--replace-all-values -e MinOcclusion -n "+Util::insertQuotes(minOcclusionImp)+" -f "+Util::insertQuotes(impFileLocation)+" --no-backups --no-verbose";
|
---|
232 |
|
---|
233 | if(preventRepeat){
|
---|
234 | (*this->xmlCommands) << "--replace-all-values --parent-element-name SoundGroup -e Flags -n PreventRepeat -f "+Util::insertQuotes(grpFileLocation)+" --no-backups --no-verbose";
|
---|
235 | }
|
---|
236 |
|
---|
237 | myXmlProcessor->start();
|
---|
238 | myXmlProcessor->wait(); // Wait until all xml is edited
|
---|
239 |
|
---|
240 | QString currFileName;
|
---|
241 | QString currGrpFileLocation;
|
---|
242 | QString currAmbFileLocation;
|
---|
243 | QString currImpFileLocation;
|
---|
244 |
|
---|
245 | for(int i=0; i<this->page2Table->rowCount(); i++){
|
---|
246 |
|
---|
247 | (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::insertQuotes(outputFolder)+" "+Util::insertQuotes(this->page2Table->item(i,1)->text()); // add location of sound file to convert
|
---|
248 |
|
---|
249 | currFileName=this->page2Table->item(i,0)->text(); // get current file name
|
---|
250 | currAmbFileLocation = outputFolder + "/" + QString(ambFile).replace("sample_file",currFileName); // get the new files, filenames
|
---|
251 | currGrpFileLocation = outputFolder + "/" + QString(grpFile).replace("sample_file",currFileName);
|
---|
252 | currImpFileLocation = outputFolder + "/" + QString(impFile).replace("sample_file",currFileName);
|
---|
253 |
|
---|
254 | QFile::copy(ambFileLocation, currAmbFileLocation); // make a copy of the sample files that will be the real files
|
---|
255 | QFile::copy(grpFileLocation, currGrpFileLocation);
|
---|
256 | QFile::copy(impFileLocation, currImpFileLocation);
|
---|
257 |
|
---|
258 | (*this->xmlCommands) << "--replace-all-values -e BaseTrack1 -n "+Util::insertQuotes(currFileName)+" -f "+Util::insertQuotes(currAmbFileLocation)+" --no-backups --no-verbose" // process the xml
|
---|
259 | << "--replace-all-values -e Sound -n "+Util::insertQuotes(currFileName)+" -f "+Util::insertQuotes(currGrpFileLocation)+" --no-backups --no-verbose"
|
---|
260 | << "--replace-all-values -e Group -n "+Util::insertQuotes(currFileName)+" -f "+Util::insertQuotes(currImpFileLocation)+" --no-backups --no-verbose";
|
---|
261 |
|
---|
262 | myXmlProcessor->start();
|
---|
263 | myXmlProcessor->wait(); // Wait until all xml is edited
|
---|
264 |
|
---|
265 | (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::insertQuotes(outputFolder)+" "+Util::insertQuotes(currAmbFileLocation);
|
---|
266 | (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::insertQuotes(outputFolder)+" "+Util::insertQuotes(currGrpFileLocation);
|
---|
267 | (*this->oniSplitCommands) << this->commandMap->value("xml->XML->ONI")+" "+Util::insertQuotes(outputFolder)+" "+Util::insertQuotes(currImpFileLocation);
|
---|
268 | }
|
---|
269 |
|
---|
270 | this->myConverter->start(); // finally process the onisplit commands
|
---|
271 | this->myConverter->wait(); // wait for it to complete
|
---|
272 | }
|
---|
273 |
|
---|
274 | void SoundPageFinal::catchXmlAndOSplitProcessingError(QString result, int numErrors){
|
---|
275 |
|
---|
276 | if(numErrors!=0){
|
---|
277 | QString sNumErrors=QString::number(numErrors);
|
---|
278 | if(numErrors>1){
|
---|
279 | UtilVago::showErrorPopUpLogButton(result+"\n This is the last of " + sNumErrors + " errors.");
|
---|
280 | }
|
---|
281 | else{
|
---|
282 | UtilVago::showErrorPopUpLogButton(result);
|
---|
283 | }
|
---|
284 | }
|
---|
285 | }
|
---|
286 |
|
---|
287 | void SoundPageFinal::connectSlots(){
|
---|
288 | //This signal is for thread that is working setup the progress bar (make it visible and set it's min-max)
|
---|
289 | connect(this->myXmlProcessor, SIGNAL(resultConversion(QString, int)), this, SLOT(catchXmlAndOSplitProcessingError(QString, int)));
|
---|
290 | connect(this->myConverter, SIGNAL(resultConversion(QString, int)), this, SLOT(catchXmlAndOSplitProcessingError(QString, int)));
|
---|
291 | connect(ui->lbComplete, SIGNAL(linkActivated(const QString & )), this, SLOT(openSoundsFolder()));
|
---|
292 | }
|
---|
293 |
|
---|
294 | SoundPageFinal::~SoundPageFinal()
|
---|
295 | {
|
---|
296 | delete this->xmlCommands;
|
---|
297 | delete this->oniSplitCommands;
|
---|
298 | delete this->myXmlProcessor;
|
---|
299 | delete this->myConverter;
|
---|
300 | delete ui;
|
---|
301 | }
|
---|