/* -------------------------------------------------------------------------- MusicBrainz -- The Internet music metadatabase Copyright (C) 2013 Johannes Dewender Copyright (C) 2006-2010 Lukas Lalinsky Copyright (C) 2006 Matthias Friedrich This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA --------------------------------------------------------------------------- */ #ifndef MUSICBRAINZ_DISC_ID_H #define MUSICBRAINZ_DISC_ID_H #if (defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)) # ifdef libdiscid_EXPORTS # define LIBDISCID_API __declspec(dllexport) # else # define LIBDISCID_API __declspec(dllimport) # endif # define LIBDISCID_INTERNAL #elif (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) # define LIBDISCID_API # define LIBDISCID_INTERNAL __attribute__((visibility("hidden"))) #elif defined(__SUNPRO_C) # define LIBDISCID_API __global # define LIBDISCID_INTERNAL __hidden #else # define LIBDISCID_API # define LIBDISCID_INTERNAL #endif #if (defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)) #define LIBDISCID_DEPRECATED __declspec(deprecated) #elif (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) || defined(__clang__) #define LIBDISCID_DEPRECATED __attribute__((deprecated)) #else #define LIBDISCID_DEPRECATED #endif #define DISCID_VERSION_MAJOR @libdiscid_MAJOR@ #define DISCID_VERSION_MINOR @libdiscid_MINOR@ #define DISCID_VERSION_PATCH @libdiscid_PATCH@ #define DISCID_VERSION_NUM @libdiscid_VERSION_NUM@ #ifdef __cplusplus extern "C" { #endif /*! * \mainpage libdiscid * \section intro Introduction * * Libdiscid is a C library for calculating DiscIDs * (MusicBrainz * and freedb) * for Audio CDs. * Additionally the library can extract the MCN/UPC/EAN and the * ISRCs from disc. * * The idea is to have an easy to use library without any dependencies * that can be used from scripting languages. * * The API is documented in discid.h. * * \section examples Examples * * This is an example of the most basic usage: * * \code * * DiscId *disc = discid_new(); * * if ( discid_read_sparse(disc, "/dev/cdrom", 0) == 0 ) { * fprintf(stderr, "Error: %s\n", discid_get_error_msg(disc)); * return 1; * } * * printf("DiscID : %s\n", discid_get_id(disc)); * printf("Submit via : %s\n", discid_get_submission_url(disc)); * * discid_free(disc); * * \endcode * * \section Building * * libdiscid provides a pkg-config script that returns the necessary compiler and linker flags, as well as the * version number. To build a small sample program one would use: * * @par * gcc libdiscid-test.c \`pkg-config libdiscid --cflags --libs\` -o libdiscid-test * * \section Contact * * - MusicBrainz Development Mailing List * - MusicBrainz Bug Tracker * - MusicBrainz Documentation * - Github Repository * */ /** * A transparent handle for an Audio CD. * * This is returned by discid_new() and has to be passed as the first * parameter to all discid_*() functions. */ typedef void *DiscId; /** * Return a handle for a new DiscId object. * * If no memory could be allocated, NULL is returned. Don't use the created * DiscId object before calling discid_read() or discid_put(). * * @return a DiscId object, or NULL. */ LIBDISCID_API DiscId *discid_new(); /** * Release the memory allocated for the DiscId object. * * @param d a DiscId object created by discid_new() */ LIBDISCID_API void discid_free(DiscId *d); /** * Read all supported features of the disc in the given CD-ROM/DVD-ROM drive. * * This function reads the disc in the drive specified by the given device * identifier. If the device is NULL, the default drive, as returned by * discid_get_default_device() is used. * * If you do not require all features provided by libdiscid, such as MCN * or ISRC reading, you should consider using discid_read_sparse() instead * of discid_read() for performance reasons. * * On error, this function returns false and sets the error message which you * can access using discid_get_error_msg(). In this case, the other functions * won't return meaningful values and should not be used. * * This function may be used multiple times with the same DiscId object. * * @param d a DiscId object created by discid_new() * @param device an operating system dependent device identifier, or NULL * @return true if successful, or false on error. */ LIBDISCID_API int discid_read(DiscId *d, const char *device); /** * Read the disc in the given CD-ROM/DVD-ROM drive * extracting only the TOC and additionally specified features. * * This function will always read the TOC, but additional features * like ::DISCID_FEATURE_MCN and ::DISCID_FEATURE_ISRC can be set * using the features parameter. * Multiple features can be set using bitwise OR. * * If you only want to generate a disc ID, you only need the TOC, * so set features to 0: * \code * discid_read_sparse(disc, device, 0) * \endcode * This is a bit more verbose, but equivalent since ::DISCID_FEATURE_READ * is always implied: * \code * discid_read_sparse(disc, device, DISCID_FEATURE_READ) * \endcode * * If you want to read all features available, you can use discid_read(). * * On error, this function returns false and sets the error message which you * can access using discid_get_error_msg(). In this case, the other functions * won't return meaningful values and should not be used. * * This function may be used multiple times with the same DiscId object. * * \since libdiscid 0.5.0 * * @param d a DiscId object created by discid_new() * @param device an operating system dependent device identifier, or NULL * @param features a list of bit flags from the enum ::discid_feature * @return true if successful, or false on error. */ LIBDISCID_API int discid_read_sparse(DiscId *d, const char *device, unsigned int features); #define DISCID_HAVE_SPARSE_READ /** * Provides the TOC of a known CD. * * This function may be used if the TOC has been read earlier and you * want to calculate the disc ID afterwards, without accessing the disc * drive. It replaces the discid_read function in this case. * * On error, this function returns false and sets the error message which you * can access using discid_get_error_msg(). In this case, the other functions * won't return meaningful values and should not be used. * * The offsets parameter points to an array which contains the track offsets * for each track. The first element, offsets[0], is the leadout track. It * must contain the total number of sectors on the disc. * * For discs with additional data tracks, the trailing data tracks * should be ignored. offset[0] should then be the last sector of the last * audio track. * Make sure the length of the last audio track as returned by libdiscid * after a put is the same as the length of your last audio track. * Depending on your tools you might need to substract 11400 (2:32 min.). * See also: * Disc ID Calculation * * * @param d a DiscID object created by discid_new() * @param first the number of the first audio track on disc (usually one) * @param last the number of the last audio track on the disc * @param offsets a pointer to an array of 100 track offsets * @return true if the given data was valid, and false on error */ LIBDISCID_API int discid_put(DiscId *d, int first, int last, int *offsets); /** * Return a human-readable error message. * * This function may only be used if discid_read() failed. The returned * error message is only valid as long as the DiscId object exists. * * @param d a DiscId object created by discid_new() * @return a string describing the error that occurred */ LIBDISCID_API char *discid_get_error_msg(DiscId *d); /** * Return a MusicBrainz DiscID. * * The returned string is only valid as long as the DiscId object exists. * * @param d a DiscId object created by discid_new() * @return a string containing a MusicBrainz DiscID */ LIBDISCID_API char *discid_get_id(DiscId *d); /** * Return a FreeDB DiscID. * * The returned string is only valid as long as the DiscId object exists. * * @param d a DiscId object created by discid_new() * @return a string containing a FreeDB DiscID */ LIBDISCID_API char *discid_get_freedb_id(DiscId *d); /** * Return a string representing CD Table Of Contents (TOC). * * The string has following values separated by space: * first track number * last track number * total length in sectors * offset of 1st track * offset of 2nd track * ... * * Example: * 1 7 164900 150 22460 50197 80614 100828 133318 144712 * * The returned string is only valid as long as the DiscId object exists. * * @param d a DiscId object created by discid_new() * @return a string containing TOC information */ LIBDISCID_API char *discid_get_toc_string(DiscId *d); /** * Return an URL for submitting the DiscID to MusicBrainz. * * The URL leads to an interactive disc submission wizard that guides the * user through the process of associating this disc's DiscID with a * release in the MusicBrainz database. * * The returned string is only valid as long as the DiscId object exists. * * @param d a DiscId object created by discid_new() * @return a string containing an URL */ LIBDISCID_API char *discid_get_submission_url(DiscId *d); /** * Return an URL for retrieving CD information from MusicBrainz' web service * * The URL provides the CD information in XML. * See http://musicbrainz.org/development/mmd for details. * * The returned string is only valid as long as the DiscId object exists. * * @param d a DiscId object created by discid_new() * @return a string containing an URL * * @deprecated This function is deprecated. Please use libmusicbrainz instead * since this function returns an URL referring the deprecated webservice. */ LIBDISCID_API LIBDISCID_DEPRECATED char *discid_get_webservice_url(DiscId *d); /** * Return the name of the default disc drive for this machine. * This isn't constant, but possibly depends on the drives currently * attached, depending on the platform. * For this reason you should call this once and save it * when you want to make sure to use the same drive for * multiple operations. * * The returned string is thread local and owned by libdiscid internally. * * @return a string containing an operating system dependent device identifier */ LIBDISCID_API char *discid_get_default_device(void); /** * Return the number of the first track on this disc. * * @param d a DiscId object created by discid_new() * @return the number of the first track */ LIBDISCID_API int discid_get_first_track_num(DiscId *d); /** * Return the number of the last audio track on this disc. * * @param d a DiscId object created by discid_new() * @return the number of the last track */ LIBDISCID_API int discid_get_last_track_num(DiscId *d); /** * Return the length of the disc in sectors. * * @param d a DiscId object created by discid_new() * @return the length of the disc in sectors */ LIBDISCID_API int discid_get_sectors(DiscId *d); /** * Return the sector offset of a track. * * Only track numbers between (and including) discid_get_first_track_num() * and discid_get_last_track_num() may be used. * * @param d a DiscId object created by discid_new() * @param track_num the number of a track * @return sector offset of the specified track */ LIBDISCID_API int discid_get_track_offset(DiscId *d, int track_num); /** * Return the length of a track in sectors. * * Only track numbers between (and including) discid_get_first_track_num() * and discid_get_last_track_num() may be used. * * @param d a DiscId object created by discid_new() * @param track_num the number of a track * @return length of the specified track */ LIBDISCID_API int discid_get_track_length(DiscId *d, int track_num); /** * Return the Media Catalogue Number (MCN) for the disc. * * This is essentially an EAN (= UPC with 0 prefix). * * \since libdiscid 0.3.0 * * @param d a DiscId object created by discid_new() * @return a string containing an Media Catalogue Number of the disk */ LIBDISCID_API char* discid_get_mcn(DiscId *d); /** * Return the ISRC for a track. * * Only track numbers between (and including) discid_get_first_track_num() * and discid_get_last_track_num() may be used. * * \since libdiscid 0.3.0 * * @param d a DiscId object created by discid_new() * @param track_num the number of a track * @return a string containing an ISRC for the specified track */ LIBDISCID_API char* discid_get_track_isrc(DiscId *d, int track_num); /** * PLATFORM-DEPENDENT FEATURES * * The platform dependent features are currently: * - "read" read TOC from disc * - "mcn" read MCN from disc * - "isrc" read ISRC from disc * * A table in the * MusicBrainz Documentation * specifies which features are available on which platform in what version. * * In the code you can use discid_get_feature_list() or discid_has_feature() * below to get the features for your platform in this version. */ enum discid_feature { DISCID_FEATURE_READ = 1 << 0, DISCID_FEATURE_MCN = 1 << 1, DISCID_FEATURE_ISRC = 1 << 2, }; /** * Check if a certain feature is implemented on the current platform. * * This only works for single features, not bit masks with multiple features. * * \since libdiscid 0.4.0 * * @param feature as enum ::discid_feature * @return 1 if the feature is implemented and 0 if not. */ LIBDISCID_API int discid_has_feature(enum discid_feature feature); #define DISCID_FEATURE_STR_READ "read" #define DISCID_FEATURE_STR_MCN "mcn" #define DISCID_FEATURE_STR_ISRC "isrc" #define DISCID_FEATURE_LENGTH 32 /** * Return a list of features supported by the current platform. * The array of length ::DISCID_FEATURE_LENGTH should be allocated by the user. * After the call each element of the array is either NULL * or a pointer to a static string. * * \since libdiscid 0.4.0 * * @param[out] features a static string array of length ::DISCID_FEATURE_LENGTH */ LIBDISCID_API void discid_get_feature_list( char *features[DISCID_FEATURE_LENGTH]); /** * Return the full version string of this library, including the name. * This can be used for debug output. * Don't use this to test for features, see discid_has_feature(). * * \since libdiscid 0.4.0 * * @return a string containing the version of libdiscid. */ LIBDISCID_API char *discid_get_version_string(void); #ifdef __cplusplus } #endif #endif /* MUSICBRAINZ_DISC_ID_H */