123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486 |
- /* --------------------------------------------------------------------------
- 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
- * (<a href="http://musicbrainz.org/doc/Disc ID">MusicBrainz</a>
- * and <a href="http://freedb.org">freedb</a>)
- * for Audio CDs.
- * Additionally the library can extract the MCN/UPC/EAN and the
- * <a href="http://musicbrainz.org/doc/ISRC">ISRCs</a> 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
- * <tt>gcc libdiscid-test.c \`pkg-config libdiscid --cflags --libs\` -o libdiscid-test</tt>
- *
- * \section Contact
- *
- * - <a href="http://lists.musicbrainz.org/mailman/listinfo/musicbrainz-devel">MusicBrainz Development Mailing List</a>
- * - <a href="http://tickets.musicbrainz.org/browse/LIB">MusicBrainz Bug Tracker</a>
- * - <a href="http://musicbrainz.org/doc/libdiscid">MusicBrainz Documentation</a>
- * - <a href="https://github.com/metabrainz/libdiscid">Github Repository</a>
- *
- */
- /**
- * 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:
- * <a href="http://musicbrainz.org/doc/Disc_ID_Calculation">Disc ID Calculation</a>
- *
- *
- * @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
- * <a href="http://musicbrainz.org/doc/libdiscid">MusicBrainz Documentation</a>
- * 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 */
|