83
82
// Ask lame for the list of genres it knows; otherwise it barfs when doing
84
83
// e.g. lame --tg 'Vocal Jazz'
85
CollectingProcess proc;
85
proc.setOutputChannelMode(KProcess::MergedChannels);
86
86
proc << "lame" << "--genre-list";
87
proc.start(K3Process::Block, K3Process::Stdout);
89
if(proc.exitStatus() != 0)
92
QString str = QString::fromLocal8Bit( proc.collectedStdout() );
93
d->genreList = str.split( '\n', QString::SkipEmptyParts );
89
if(proc.exitStatus() != QProcess::NormalExit)
92
QByteArray array = proc.readAll();
93
QString str = QString::fromLocal8Bit( array );
94
d->genreList = str.split( '\n', QString::SkipEmptyParts );
94
95
// Remove the numbers in front of every genre
95
96
for( QStringList::Iterator it = d->genreList.begin(); it != d->genreList.end(); ++it ) {
96
97
QString& genre = *it;
249
250
//kDebug(7117) << d->currentEncodeProcess->args();
252
connect(d->currentEncodeProcess, SIGNAL(receivedStdout(K3Process *, char *, int)),
253
this, SLOT(receivedStdout(K3Process *, char *, int)));
254
connect(d->currentEncodeProcess, SIGNAL(receivedStderr(K3Process *, char *, int)),
255
this, SLOT(receivedStderr(K3Process *, char *, int)));
256
connect(d->currentEncodeProcess, SIGNAL(wroteStdin(K3Process *)),
257
this, SLOT(wroteStdin(K3Process *)));
253
connect(d->currentEncodeProcess, SIGNAL(readyReadStandardOutput()),
254
this, SLOT(receivedStdout()));
255
connect(d->currentEncodeProcess, SIGNAL(readyReadStandardError()),
256
this, SLOT(receivedStderr()));
257
// connect(d->currentEncodeProcess, SIGNAL(bytesWritten()),
258
// this, SLOT(wroteStdin()));
259
connect(d->currentEncodeProcess, SIGNAL(processExited(K3Process *)),
260
this, SLOT(processExited(K3Process *)));
260
connect(d->currentEncodeProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
261
this, SLOT(processExited(int, QProcess::ExitStatus)));
263
d->currentEncodeProcess->start(K3Process::NotifyOnExit, K3ShellProcess::All);
264
d->currentEncodeProcess->setOutputChannelMode(KProcess::SeparateChannels);
265
d->currentEncodeProcess->start();
267
void EncoderLame::processExited ( K3Process *process ){
268
kDebug(7117) << "Lame Encoding process exited with: " << process->exitStatus();
269
void EncoderLame::processExited ( int exitCode, QProcess::ExitStatus /*status*/ ){
270
kDebug(7117) << "Lame Encoding process exited with: " << exitCode;
269
271
d->processHasExited = true;
272
void EncoderLame::receivedStderr( K3Process * /*process*/, char *buffer, int /*buflen*/ ){
273
kDebug(7117) << "Lame stderr: " << buffer;
274
void EncoderLame::receivedStderr(){
275
QByteArray error = d->currentEncodeProcess->readAllStandardError();
276
kDebug(7117) << "Lame stderr: " << error;
274
277
if ( !d->lastErrorMessage.isEmpty() )
275
278
d->lastErrorMessage += '\t';
276
d->lastErrorMessage += QString::fromLocal8Bit( buffer );
279
void EncoderLame::receivedStdout( K3Process * /*process*/, char *buffer, int /*length*/ ){
280
kDebug(7117) << "Lame stdout: " << buffer;
283
void EncoderLame::wroteStdin( K3Process * /*procces*/ ){
284
d->waitingForWrite = false;
279
d->lastErrorMessage += QString::fromLocal8Bit( error );
282
void EncoderLame::receivedStdout(){
283
QString output = QString::fromLocal8Bit(d->currentEncodeProcess->readAllStandardOutput());
284
kDebug(7117) << "Lame stdout: " << output;
287
// void EncoderLame::wroteStdin(){
288
// d->waitingForWrite = false;
287
291
long EncoderLame::read(int16_t *buf, int frames){
288
292
if(!d->currentEncodeProcess)
293
297
// Pipe the raw data to lame
294
298
char * cbuf = reinterpret_cast<char *>(buf);
295
d->currentEncodeProcess->writeStdin( cbuf, frames*4);
299
d->currentEncodeProcess->write(cbuf, frames * 4);
297
300
// We can't return until the buffer has been written
298
d->waitingForWrite = true;
299
while(d->waitingForWrite && d->currentEncodeProcess->isRunning()){
300
qApp->processEvents();
301
d->currentEncodeProcess->waitForBytesWritten(-1);
304
303
// Determine the file size increase
305
304
QFileInfo file(d->tempFile->fileName());