MPEGPlayer: Skip to next file when there is a problem with a video file in all-play...
[kugel-rb.git] / rbutil / rbutilqt / base / encoders.cpp
blobd763b96b4beae81bd6934a299ce7b7c7498ef264
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
9 * Copyright (C) 2007 by Dominik Wenger
10 * $Id$
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "encoders.h"
21 #include "utils.h"
22 #include "rbsettings.h"
24 /*********************************************************************
25 * Encoder Base
26 **********************************************************************/
27 QMap<QString,QString> EncBase::encoderList;
29 EncBase::EncBase(QObject *parent): EncTtsSettingInterface(parent)
34 // initialize list of encoders
35 void EncBase::initEncodernamesList()
37 encoderList["rbspeex"] = "Rockbox Speex Encoder";
38 encoderList["lame"] = "Lame Mp3 Encoder";
42 // get nice name for a specific encoder
43 QString EncBase::getEncoderName(QString encoder)
45 if(encoderList.isEmpty())
46 initEncodernamesList();
47 return encoderList.value(encoder);
51 // get a specific encoder object
52 EncBase* EncBase::getEncoder(QObject* parent,QString encoder)
54 EncBase* enc;
55 if(encoder == "lame")
57 enc = new EncExes(encoder,parent);
58 return enc;
60 else // rbspeex is default
62 enc = new EncRbSpeex(parent);
63 return enc;
68 QStringList EncBase::getEncoderList()
70 if(encoderList.isEmpty())
71 initEncodernamesList();
72 return encoderList.keys();
76 /*********************************************************************
77 * GEneral Exe Encoder
78 **********************************************************************/
79 EncExes::EncExes(QString name,QObject *parent) : EncBase(parent)
81 m_name = name;
83 m_TemplateMap["lame"] = "\"%exe\" %options \"%input\" \"%output\"";
89 void EncExes::generateSettings()
91 QString exepath =RbSettings::subValue(m_name,RbSettings::EncoderPath).toString();
92 if(exepath == "") exepath = Utils::findExecutable(m_name);
94 insertSetting(eEXEPATH,new EncTtsSetting(this,EncTtsSetting::eSTRING,
95 tr("Path to Encoder:"),exepath,EncTtsSetting::eBROWSEBTN));
96 insertSetting(eEXEOPTIONS,new EncTtsSetting(this,EncTtsSetting::eSTRING,
97 tr("Encoder options:"),RbSettings::subValue(m_name,RbSettings::EncoderOptions)));
100 void EncExes::saveSettings()
102 RbSettings::setSubValue(m_name,RbSettings::EncoderPath,getSetting(eEXEPATH)->current().toString());
103 RbSettings::setSubValue(m_name,RbSettings::EncoderOptions,getSetting(eEXEOPTIONS)->current().toString());
104 RbSettings::sync();
107 bool EncExes::start()
109 m_EncExec = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString();
110 m_EncOpts = RbSettings::subValue(m_name, RbSettings::EncoderOptions).toString();
112 m_EncTemplate = m_TemplateMap.value(m_name);
114 QFileInfo enc(m_EncExec);
115 if(enc.exists())
117 return true;
119 else
121 return false;
125 bool EncExes::encode(QString input,QString output)
127 //qDebug() << "encoding..";
128 QString execstring = m_EncTemplate;
130 execstring.replace("%exe",m_EncExec);
131 execstring.replace("%options",m_EncOpts);
132 execstring.replace("%input",input);
133 execstring.replace("%output",output);
134 qDebug() << "[EncExes] cmd: " << execstring;
135 int result = QProcess::execute(execstring);
136 return (result == 0) ? true : false;
140 bool EncExes::configOk()
142 QString path = RbSettings::subValue(m_name, RbSettings::EncoderPath).toString();
144 if (QFileInfo(path).exists())
145 return true;
147 return false;
150 /*********************************************************************
151 * RB SPEEX ENCODER
152 **********************************************************************/
153 EncRbSpeex::EncRbSpeex(QObject *parent) : EncBase(parent)
158 void EncRbSpeex::generateSettings()
160 insertSetting(eVOLUME,new EncTtsSetting(this,EncTtsSetting::eDOUBLE,
161 tr("Volume:"),RbSettings::subValue("rbspeex",RbSettings::EncoderVolume),1.0,10.0));
162 insertSetting(eQUALITY,new EncTtsSetting(this,EncTtsSetting::eDOUBLE,
163 tr("Quality:"),RbSettings::subValue("rbspeex",RbSettings::EncoderQuality),0,10.0));
164 insertSetting(eCOMPLEXITY,new EncTtsSetting(this,EncTtsSetting::eINT,
165 tr("Complexity:"),RbSettings::subValue("rbspeex",RbSettings::EncoderComplexity),0,10));
166 insertSetting(eNARROWBAND,new EncTtsSetting(this,EncTtsSetting::eBOOL,
167 tr("Use Narrowband:"),RbSettings::subValue("rbspeex",RbSettings::EncoderNarrowBand)));
170 void EncRbSpeex::saveSettings()
172 //save settings in user config
173 RbSettings::setSubValue("rbspeex",RbSettings::EncoderVolume,
174 getSetting(eVOLUME)->current().toDouble());
175 RbSettings::setSubValue("rbspeex",RbSettings::EncoderQuality,
176 getSetting(eQUALITY)->current().toDouble());
177 RbSettings::setSubValue("rbspeex",RbSettings::EncoderComplexity,
178 getSetting(eCOMPLEXITY)->current().toInt());
179 RbSettings::setSubValue("rbspeex",RbSettings::EncoderNarrowBand,
180 getSetting(eNARROWBAND)->current().toBool());
182 RbSettings::sync();
185 bool EncRbSpeex::start()
188 // try to get config from settings
189 quality = RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble();
190 complexity = RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt();
191 volume = RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble();
192 narrowband = RbSettings::subValue("rbspeex", RbSettings::EncoderNarrowBand).toBool();
195 return true;
198 bool EncRbSpeex::encode(QString input,QString output)
200 qDebug() << "[RbSpeex] Encoding " << input << " to "<< output;
201 char errstr[512];
203 FILE *fin,*fout;
204 if ((fin = fopen(input.toLocal8Bit(), "rb")) == NULL) {
205 qDebug() << "[RbSpeex] Error: could not open input file\n";
206 return false;
208 if ((fout = fopen(output.toLocal8Bit(), "wb")) == NULL) {
209 qDebug() << "[RbSpeex] Error: could not open output file\n";
210 fclose(fin);
211 return false;
214 int ret = encode_file(fin, fout, quality, complexity, narrowband, volume,
215 errstr, sizeof(errstr));
216 fclose(fout);
217 fclose(fin);
219 if (!ret) {
220 /* Attempt to delete unfinished output */
221 qDebug() << "[RbSpeex] Error:" << errstr;
222 QFile(output).remove();
223 return false;
225 return true;
228 bool EncRbSpeex::configOk()
230 bool result=true;
231 // check config
233 if(RbSettings::subValue("rbspeex", RbSettings::EncoderVolume).toDouble() <= 0)
234 result =false;
236 if(RbSettings::subValue("rbspeex", RbSettings::EncoderQuality).toDouble() <= 0)
237 result =false;
239 if(RbSettings::subValue("rbspeex", RbSettings::EncoderComplexity).toInt() <= 0)
240 result =false;
242 return result;