/* * * $Id: k3bcdparanoialib.h 619556 2007-01-03 17:38:12Z trueg $ * Copyright (C) 2003 Sebastian Trueg * * This file is part of the K3b project. * Copyright (C) 1998-2007 Sebastian Trueg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * See the file "COPYING" for the exact licensing terms. */ #ifndef K3B_CDPARANOIA_LIB_H #define K3B_CDPARANOIA_LIB_H // from cdda_interface.h #define CD_FRAMESIZE_RAW 2352 #include #include #include "k3b_export.h" namespace K3bDevice { class Device; class Toc; } /** * K3bCdparanoiaLib is a convenience wrapper around libcdda_interface * and libcdda_paranoia. * * It uses four paranoia levels 0-3 which can be set via setParanoiaMode * and are used the same way as in cdrdao: * \li 0: No checking, data is copied directly from the drive. * \li 1: Perform overlapped reading to avoid jitter. * \li 2: Like 1 but with additional checks of the read audio data. * \li 3: Like 2 but with additional scratch detection and repair. * * K3bCdparanoiaLib is based on a shared data approach which makes sure * that each device can only be opened once. This is necessary since * libcdda_interface opens the device exclusively on most distributions. * * However, it is perfectly possible to have two instances of K3bCdparanoiaLib * accessing the same device at the same time. K3bCdparanoiaLib will take care * of the syncing and seeking issues automatically. * * K3bCdparanoiaLib is thread-safe. * * Usage: *
 * K3bCdparanoiaLib lib;
 * lib.initParanoia( mydevice );
 * lib.initReading( tracknumber );
 * while( char* data = lib.read() )
 *   dosomethingcoolwithdata( data );
 * 
*/ class LIBK3B_EXPORT K3bCdparanoiaLib { public: ~K3bCdparanoiaLib(); /** default: 1 */ void setParanoiaMode( int ); void setNeverSkip( bool b ); /** default: 5 */ void setMaxRetries( int ); /** * This will read the Toc and initialize some stuff. * It will also call paranoiaInit( const TQString& ) */ bool initParanoia( K3bDevice::Device* dev ); /** * Use for faster initialization without reading the toc */ bool initParanoia( K3bDevice::Device* dev, const K3bDevice::Toc& ); void close(); /** * Call this after initParanoia to set the data to rip. * * Rip all audio tracks. */ bool initReading(); /** * Call this after initParanoia to set the data to rip. */ bool initReading( unsigned int track ); /** * Call this after initParanoia to set the data to rip. */ bool initReading( long startSector, long endSector ); /** * Read data. * \param statusCode If not 0 will be set. * \param track the tracknumer the data belongs to * * This method takes care of swapping the byte-order depending on the * machine type. * * \return The read sector data or 0 if all data within the specified range * has been read or an error has occured. */ char* read( int* statusCode = 0, unsigned int* track = 0, bool littleEndian = true ); /** * This only is valid after a call to read() */ int status() const; enum Status { S_OK, S_ERROR // to be extended with Jitter and stuff... }; /** * Only valid after a call to initParanoia() */ const K3bDevice::Toc& toc() const; long rippedDataLength() const; /** * returns 0 if the cdparanoialib could not * be found on the system. * Otherwise you have to take care of * deleting. */ static K3bCdparanoiaLib* create(); private: void cleanup(); K3bCdparanoiaLib(); bool load(); class Private; Private* d; static void* s_libInterface; static void* s_libParanoia; static int s_counter; }; #endif