You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
soundkonverter/src/cdmanager.cpp

191 lines
5.4 KiB

#include "cdmanager.h"
#include "paranoia.h"
#include "cddb.h"
#include "conversionoptions.h"
#include <tqstringlist.h>
#include <tqvaluelist.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <kinputdialog.h>
#include <dcopref.h>
// ### soundkonverter 0.4 implement reading of milliseconds/frames
// TODO implement reading of cd data
CDDevice::CDDevice( const TQString& _device )
{
TQStringList s;
bool init = false;
TQValueList<int> qvl;
int i;
TQStringList dcopList, devList;
bool ok = false;
tags.clear();
if( !_device.isEmpty() )
s.append( _device );
else {
DCOPRef mediamanager( "kded", "mediamanager" );
DCOPReply reply = mediamanager.call( "fullList()" );
if( reply.isValid() ) {
dcopList = reply;
i = 0;
while( i < (int)dcopList.count() ) {
if( dcopList[i+10] == "media/audiocd" ) {
devList.append( dcopList[i+5] );
}
i += 13;
}
if( devList.count() > 1 ) {
TQString choice = KInputDialog::getItem( i18n("Audio CD"), i18n("Several audio CDs found. Choose one:"), devList, 0, false, &ok );
if( ok ) s.append( choice );
else s.append( 0 ); // TODO if canceled, the cd opener should close, not use the first item
}
else if( devList.count()==1 ) {
s.append( devList[0] );
}
else {
s.append( "/dev/cdrom" );
s.append( "/dev/dvd" );
}
}
else {
s.append( "/dev/cdrom" );
s.append( "/dev/dvd" );
}
}
para = new Paranoia();
for( i = 0; i < (int)s.count(); i++ ) {
if( init = para->init(s[i]) ) {
device = s[i];
break;
}
}
if( init ) {
trackCount = para->getTracks();
timeCount = para->trackTime( -1 );
for( i = 0; i < para->getTracks(); i++) {
qvl.append( para->trackFirstSector(i+1) + 150 );
}
qvl.append( para->discFirstSector() );
qvl.append( para->discLastSector() );
CDDB* cddb = new CDDB();
cddb->save_cddb( true );
if( cddb->queryCD(qvl) ) {
for( i = 0; i < para->getTracks(); i++ ) {
tags += new TagData( cddb->artist(i), "", cddb->title(), cddb->track(i), cddb->genre(), "",
i+1, cddb->disc(), cddb->year(), para->trackTime(i) );
}
}
else {
cddb->set_server( "gnudb.gnudb.org", 8880 );
if( cddb->queryCD(qvl) ) {
for( i = 0; i < para->getTracks(); i++ ) {
tags += new TagData( cddb->artist(i), "", cddb->title(), cddb->track(i), cddb->genre(), "",
i+1, cddb->disc(), cddb->year(), para->trackTime(i) );
}
}
else {
for( i = 0; i < para->getTracks(); i++ ) {
tags += new TagData( i18n("Unknown"), "", i18n("Unknown"), i18n("Unknown"), "", "", i+1, 1, 0, para->trackTime(i) );
}
}
}
delete cddb;
}
else {
KMessageBox::information( 0, i18n("No audio CD found."), i18n("Warning") );
device = "";
delete para;
para = 0;
}
}
CDDevice::~CDDevice()
{}
CDManager::CDManager()
{}
CDManager::~CDManager()
{
while( cdDevices.count() > 0 ) delete cdDevices.first();
}
TQString CDManager::newCDDevice( const TQString& device )
{
CDDevice* cdDevice = new CDDevice( device );
for( TQValueList<CDDevice*>::Iterator it = cdDevices.begin(); it != cdDevices.end(); ++it ) {
if( (*it)->device = cdDevice->device ) {
cdDevices.remove( *it );
delete (*it);
break;
}
}
cdDevices += cdDevice;
return cdDevice->device;
}
TQValueList<TagData*> CDManager::getTrackList( const TQString& device )
{
for( TQValueList<CDDevice*>::Iterator it = cdDevices.begin(); it != cdDevices.end(); ++it ) {
if( (*it)->device = device ) return (*it)->tags;
}
TQValueList<TagData*> list;
return list;
}
TagData* CDManager::getTags( const TQString& device, int track )
{
for( TQValueList<CDDevice*>::Iterator it = cdDevices.begin(); it != cdDevices.end(); ++it ) {
if( (*it)->device = device ) {
if( track > 0 ) {
TQValueList<TagData*>::Iterator tag = (*it)->tags.at( track - 1 );
return (*tag);
}
else {
return (*it)->discTags;
}
}
}
return 0;
}
int CDManager::getTrackCount( const TQString& device )
{
for( TQValueList<CDDevice*>::Iterator it = cdDevices.begin(); it != cdDevices.end(); ++it ) {
if( (*it)->device = device ) return (*it)->trackCount;
}
return 0;
}
int CDManager::getTimeCount( const TQString& device )
{
for( TQValueList<CDDevice*>::Iterator it = cdDevices.begin(); it != cdDevices.end(); ++it ) {
if( (*it)->device = device ) return (*it)->timeCount;
}
return 0;
}
void CDManager::setDiscTags( const TQString& device, TagData* tags )
{
for( TQValueList<CDDevice*>::Iterator it = cdDevices.begin(); it != cdDevices.end(); ++it ) {
if( (*it)->device = device ) (*it)->discTags = tags;
}
}