diff options
Diffstat (limited to 'libk3b/tools/k3bcdparanoialib.h')
-rw-r--r-- | libk3b/tools/k3bcdparanoialib.h | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/libk3b/tools/k3bcdparanoialib.h b/libk3b/tools/k3bcdparanoialib.h new file mode 100644 index 0000000..70504de --- /dev/null +++ b/libk3b/tools/k3bcdparanoialib.h @@ -0,0 +1,161 @@ +/* + * + * $Id: k3bcdparanoialib.h 619556 2007-01-03 17:38:12Z trueg $ + * Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org> + * + * This file is part of the K3b project. + * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org> + * + * 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 <qstring.h> + +#include <sys/types.h> +#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: + * <pre> + * K3bCdparanoiaLib lib; + * lib.initParanoia( mydevice ); + * lib.initReading( tracknumber ); + * while( char* data = lib.read() ) + * dosomethingcoolwithdata( data ); + * </pre> + */ +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 QString& ) + */ + 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 |