/** * @file * Copyright 2014 (c) Anna Schumaker. */ #ifndef OCARINA_CORE_TAGS_TRACK_H #define OCARINA_CORE_TAGS_TRACK_H #include #include #include #include #include /** * Track fields that can be compared. */ enum sort_t { /** Artist name */ SORT_ARTIST, /** Album name */ SORT_ALBUM, /** Play count */ SORT_COUNT, /** Genre */ SORT_GENRE, /** Track length */ SORT_LENGTH, /** Date the track was last played */ SORT_PLAYED, /** Track title */ SORT_TITLE, /** Track number */ SORT_TRACK, /** Track year */ SORT_YEAR, }; /** Structure used to represent dates. */ struct date { unsigned int day; /**< Day of the month (1 - 31). */ unsigned int month; /**< Month of the year (1 - 12). */ unsigned int year; /**< Number of years, Commen Era. */ date() : day(0), month(0), year(0) {}; }; class Track : public GenericTag { private: Album *_album; /**< Pointer to the Album containing this track. */ Artist *_artist; /**< Pointer to the Artist performing this track. */ Genre *_genre; /**< Pointer to the Genre describing this track. */ Library *_library; /**< Pointer to the Library containing this track. */ unsigned int _count; /**< Number of times this track has been played.*/ unsigned int _length; /**< Length of this track (in seconds). */ unsigned int _track; /**< Track number of this track. */ struct date _date; /**< Date that we last played this track. */ std::string _path; /**< Path of this track, relative to the Library. */ public: /** Track constructor */ Track(); /** * Track constructor * * @param album The album containing this track. * @param artist The artist performing this track. * @param genre The genre describing this track. * @param library The library containing this track. * @param filepath The full filepath of this track. * @param name The name (title) of this track. * @param length The length of this track (in seconds). * @param track The track number of this track. */ Track(Album *, Artist *, Genre *, Library *, const std::string &, const std::string &, unsigned int, unsigned int); /** Track destructor */ ~Track(); Album *album(); /**< @return Track::_album. */ Artist *artist(); /**< @return Track::_artist. */ Genre *genre(); /**< @return Track::_genre. */ Library *library(); /**< @return Track::_library. */ unsigned int count(); /**< @return Track::_count. */ unsigned int length(); /**< @return Track::_length. */ unsigned int track(); /**< @return Track::_track. */ /** * @return A locale-dependent string containing the day this * track was last played, or "Never" if the track has * never been played. */ const std::string date() const; /** @return The full path of this track. */ const std::string path() const; /** @return Track::_length in mm:ss format. */ const std::string length_str() const; /** * A track's primary key is the concatenation of the library index * and the relative path. * * @return "Track::_library::index()"/Track::_path */ const std::string primary_key() const; /** Increment Track::_count and set Track::_date to today's date. */ void played(); /** * Read track data from file * @param file The file to read from */ void read(File &); /** * Write track data to file * @param file The file to write to */ void write(File &); /** * Compare two tracks based on a specific field. * @param rhs The other track to compare. * @param field The field to compare. * @return 0 if lhs == rhs * @return < 0 if lhs < rhs, or rhs is NULL * @return > 0 if lhs > rhs */ int less_than(Track *, sort_t); }; #endif /* OCARINA_CORE_TAGS_TRACK_H */