Thread: [Kpod-devel] cvs_commit libqtpod/src playlistitem.h, 1.15, 1.16 itunesdbwriter.h, 1.8, 1.9 playlist
Status: Beta
Brought to you by:
fry26
From: Michael S. <fr...@us...> - 2008-01-18 22:23:15
|
Update of /cvsroot/kpod/libqtpod/src In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv27132/src Modified Files: playlistitem.h itunesdbwriter.h playlistitem.cpp track.h listitem.cpp itunesdbwriter.cpp playlist.h playlist.cpp itunesdb.cpp track.cpp listitem.h itunesdb_rw.cpp Log Message: fixed wirting MHOD53, moved dbid to listitem base class and other current development Index: listitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.cpp,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** listitem.cpp 14 Jan 2008 21:03:59 -0000 1.30 --- listitem.cpp 18 Jan 2008 22:23:15 -0000 1.31 *************** *** 75,83 **** }; ! ListItem::ListItem(int type) : m_dirty( true ) { m_itemType = type; } ! ListItem::ListItem() : m_dirty( true ) { m_itemType = ITEMTYPE_NONE; } --- 75,83 ---- }; ! ListItem::ListItem( int type ) : m_dbid( 0 ), m_dirty( true ) { m_itemType = type; } ! ListItem::ListItem() : m_dbid( 0 ), m_dirty( true ) { m_itemType = ITEMTYPE_NONE; } Index: playlist.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.cpp,v retrieving revision 1.68 retrieving revision 1.69 diff -C2 -d -r1.68 -r1.69 *** playlist.cpp 14 Jan 2008 21:03:59 -0000 1.68 --- playlist.cpp 18 Jan 2008 22:23:16 -0000 1.69 *************** *** 45,49 **** Playlist::Playlist() : ListItem( ITEMTYPE_PLAYLIST ), m_tracklist( true ), m_isMaster( 0 ), m_flag2( 0 ), ! m_flag3( 0 ), m_flag4( 0 ), timeStamp( 0 ), m_id( 0 ), unk3( 0 ), mIsPodcast( 0 ), m_order( SORTORDER_MANUAL ), mSplRuleSet( NULL ) { --- 45,49 ---- Playlist::Playlist() : ListItem( ITEMTYPE_PLAYLIST ), m_tracklist( true ), m_isMaster( 0 ), m_flag2( 0 ), ! m_flag3( 0 ), m_flag4( 0 ), timeStamp( 0 ), unk3( 0 ), mIsPodcast( 0 ), m_order( SORTORDER_MANUAL ), mSplRuleSet( NULL ) { *************** *** 54,58 **** Playlist::Playlist( const Playlist& src ) : ListItem( src ), m_tracklist( true ), m_isMaster( src.m_isMaster ), ! timeStamp( src.timeStamp ), m_id( src.m_id ), unk3( src.unk3 ), mIsPodcast( src.mIsPodcast ), m_order( src.m_order ), mSplRuleSet( NULL ) { --- 54,58 ---- Playlist::Playlist( const Playlist& src ) : ListItem( src ), m_tracklist( true ), m_isMaster( src.m_isMaster ), ! timeStamp( src.timeStamp ), unk3( src.unk3 ), mIsPodcast( src.mIsPodcast ), m_order( src.m_order ), mSplRuleSet( NULL ) { *************** *** 100,104 **** instream >> m_flag4; instream >> timeStamp; ! instream >> m_id; // 36 bytes read --- 100,104 ---- instream >> m_flag4; instream >> timeStamp; ! instream >> m_dbid; // 36 bytes read *************** *** 277,285 **** - void Playlist::setID( Q_UINT64 id ) { - m_id = id; - } - - void Playlist::clear() { m_tracklist.clear(); --- 277,280 ---- *************** *** 538,542 **** stream << (Q_UINT8) m_flag4; stream << (Q_UINT32) timeStamp; ! stream << m_id; stream << (Q_UINT32) unk3; // unknown, but significant stream << (Q_UINT16) getNumStringComponents(); // number of string MHODs --- 533,537 ---- stream << (Q_UINT8) m_flag4; stream << (Q_UINT32) timeStamp; ! stream << (Q_UINT64) m_dbid; stream << (Q_UINT32) unk3; // unknown, but significant stream << (Q_UINT16) getNumStringComponents(); // number of string MHODs Index: listitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/listitem.h,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** listitem.h 14 Jan 2008 21:03:59 -0000 1.26 --- listitem.h 18 Jan 2008 22:23:16 -0000 1.27 *************** *** 158,166 **** virtual bool isDirty() const; protected: - typedef std::map<Q_UINT32,QString> PropertyMap; PropertyMap m_properties; ListItem(); ListItem( int type); --- 158,176 ---- virtual bool isDirty() const; + /** + * Returns the DBID which refers to additional media associated to this item (like cover art) + * @return the DBID for this item + */ + Q_UINT64 getDBID() const { return m_dbid; } + protected: + typedef std::map<Q_UINT32,QString> PropertyMap; PropertyMap m_properties; + void setDBID( Q_UINT64 dbid ) { m_dbid = dbid; } + + Q_UINT64 m_dbid; + ListItem(); ListItem( int type); *************** *** 182,186 **** --- 192,198 ---- private: + bool m_dirty; + }; Index: playlistitem.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** playlistitem.cpp 14 Jan 2008 21:03:59 -0000 1.9 --- playlistitem.cpp 18 Jan 2008 22:23:15 -0000 1.10 *************** *** 27,34 **** namespace itunesdb { ! PlaylistItem::PlaylistItem( Q_UINT32 ipod_id) ! : ListItem( ITEMTYPE_PLAYLISTITEM), m_pos( PLAYLISTITEM_INVALID ) { - m_id = ipod_id; } --- 27,33 ---- namespace itunesdb { ! PlaylistItem::PlaylistItem( Q_UINT32 track_id ) ! : ListItem( ITEMTYPE_PLAYLISTITEM), m_trackid( track_id ), m_pos( PLAYLISTITEM_INVALID ) { } *************** *** 36,40 **** : ListItem( ITEMTYPE_PLAYLISTITEM), m_pos( PLAYLISTITEM_INVALID ) { ! m_id = PLAYLISTITEM_INVALID; } --- 35,39 ---- : ListItem( ITEMTYPE_PLAYLISTITEM), m_pos( PLAYLISTITEM_INVALID ) { ! m_trackid = PLAYLISTITEM_INVALID; } *************** *** 54,59 **** } Q_UINT32 PlaylistItem::getID() const { ! return m_id; } --- 53,78 ---- } + QDataStream & PlaylistItem::readFromStream( QDataStream & instream, bool * ok ) { + Q_UINT32 dummy, blocklen; + instream >> blocklen; + + // 8 bytes read + #if 0 + if ( blocklen < ) { + // insufficient information + QByteArray buffer( blocklen ); + instream.readRawBytes(buffer.data(), blocklen - 8); + + if ( ok ) { + *ok = false; + } + + return instream; + } + #endif + } + Q_UINT32 PlaylistItem::getID() const { ! return m_trackid; } Index: itunesdb.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb.cpp,v retrieving revision 1.113 retrieving revision 1.114 diff -C2 -d -r1.113 -r1.114 *** itunesdb.cpp 14 Jan 2008 21:03:59 -0000 1.113 --- itunesdb.cpp 18 Jan 2008 22:23:16 -0000 1.114 *************** *** 360,364 **** PlaylistByIDFinder( Q_UINT64 id ) : mID( id ) { } bool operator() ( const Playlist * playlist ) const { ! return playlist->getID() == mID; } private: --- 360,364 ---- PlaylistByIDFinder( Q_UINT64 id ) : mID( id ) { } bool operator() ( const Playlist * playlist ) const { ! return playlist->getDBID() == mID; } private: *************** *** 443,447 **** ITunesDBPlaylist * result = new ITunesDBPlaylist( *this ); if ( mMaxDBID != 0 ) { // iTunesDB is open ! result->setID( getNextFreeDBID() ); } if ( !title.isEmpty() ) { --- 443,447 ---- ITunesDBPlaylist * result = new ITunesDBPlaylist( *this ); if ( mMaxDBID != 0 ) { // iTunesDB is open ! result->setDBID( getNextFreeDBID() ); } if ( !title.isEmpty() ) { *************** *** 525,534 **** // check if the DBID is available and itunesdb is open ! if ( isOpen() && getPlaylistByID( playlist->getID() ) ) { ! playlist->setID( getNextFreeDBID() ); } ! if ( mMaxDBID < playlist->getID() ) { ! mMaxDBID = playlist->getID(); } --- 525,534 ---- // check if the DBID is available and itunesdb is open ! if ( isOpen() && getPlaylistByID( playlist->getDBID() ) ) { ! playlist->setDBID( getNextFreeDBID() ); } ! if ( mMaxDBID < playlist->getDBID() ) { ! mMaxDBID = playlist->getDBID(); } Index: playlistitem.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlistitem.h,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** playlistitem.h 14 Jan 2008 21:03:58 -0000 1.15 --- playlistitem.h 18 Jan 2008 22:23:15 -0000 1.16 *************** *** 68,72 **** PlaylistItem(); ! PlaylistItem( Q_UINT32 ipod_id); /** --- 68,72 ---- PlaylistItem(); ! PlaylistItem( Q_UINT32 track_id); /** *************** *** 80,84 **** virtual bool readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); ! Q_UINT32 m_id; Q_UINT32 m_pos; }; --- 80,91 ---- virtual bool readMHOD( QDataStream& stream, Q_UINT32 type, Q_UINT32 blocklen ); ! virtual QDataStream & readFromStream( QDataStream & instream, bool * ok = NULL ); ! ! Q_UINT16 m_podcastgroupflag; ! Q_UINT16 m_unk4unk5; ! Q_UINT32 m_groupid; ! Q_UINT32 m_trackid; ! Q_UINT32 m_weirdotimestamp; ! Q_UINT32 m_groupref; Q_UINT32 m_pos; }; Index: track.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.cpp,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** track.cpp 28 Dec 2007 11:41:40 -0000 1.74 --- track.cpp 18 Jan 2008 22:23:16 -0000 1.75 *************** *** 523,527 **** type( 0 ), compilation( 0 ), - dbid( 0 ), checked( 1 ), app_rating( 0 ), --- 523,526 ---- *************** *** 615,619 **** stream << (Q_UINT32) ( date_added ? date_added + MAC_EPOCH_DELTA : 0 ); // 0x68 stream << (Q_UINT32) 0; // bookmarktime ! stream << (Q_UINT64) dbid; // unique bit (64 bit) stream << (Q_UINT8) checked; // checked in iTunes stream << (Q_UINT8) app_rating; // application rating --- 614,618 ---- stream << (Q_UINT32) ( date_added ? date_added + MAC_EPOCH_DELTA : 0 ); // 0x68 stream << (Q_UINT32) 0; // bookmarktime ! stream << (Q_UINT64) m_dbid; // unique bit (64 bit) stream << (Q_UINT8) checked; // checked in iTunes stream << (Q_UINT8) app_rating; // application rating *************** *** 634,638 **** stream << (Q_UINT8) mRememberPbackPos; // 0xA6 0x01 if remember playback position is set stream << (Q_UINT8) flag4; // set to 1 or 2 if podcast, 0 otherwise ! stream << (Q_UINT64) dbid; // 0xA8 - same unique id as above stream << (Q_UINT8) mHasLyricsFlag; // 0xB0 - 0x01 if lyrics stored in MP3 meta tags stream << (Q_UINT8) mIsMovie; // 0xB1 - 0x01 if refers to a movie, 0x0 otherwise --- 633,637 ---- stream << (Q_UINT8) mRememberPbackPos; // 0xA6 0x01 if remember playback position is set stream << (Q_UINT8) flag4; // set to 1 or 2 if podcast, 0 otherwise ! stream << (Q_UINT64) m_dbid; // 0xA8 - same unique id as above stream << (Q_UINT8) mHasLyricsFlag; // 0xB0 - 0x01 if lyrics stored in MP3 meta tags stream << (Q_UINT8) mIsMovie; // 0xB1 - 0x01 if refers to a movie, 0x0 otherwise *************** *** 743,747 **** if ( blocklen >= 148 ) { // iTunes >= 4.7 instream >> dummy; // 108 ! instream >> dbid; // 112 instream >> checked; // 120; instream >> app_rating; // 121; --- 742,746 ---- if ( blocklen >= 148 ) { // iTunes >= 4.7 instream >> dummy; // 108 ! instream >> m_dbid; // 112 instream >> checked; // 120; instream >> app_rating; // 121; *************** *** 1030,1040 **** } - /** - */ - Q_UINT64 Track::getDBID() const - { - return dbid; - } - void Track::setAlbum( const QString& album ) { --- 1029,1032 ---- *************** *** 1145,1156 **** - /** - */ - void Track::setDBID( Q_UINT64 id ) - { - dbid = id; - } - - void Track::setComment( const QString& comment ) { setItemProperty( comment, itunesdb::MHOD_COMMENT ); --- 1137,1140 ---- Index: playlist.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/playlist.h,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** playlist.h 14 Jan 2008 21:03:59 -0000 1.51 --- playlist.h 18 Jan 2008 22:23:15 -0000 1.52 *************** *** 200,215 **** /** - * Returns the unique DB id for this playlist - * @return the unique DB id for this playlist - */ - Q_UINT64 getID() const { return m_id; } - - /** - * Sets the unique DB id for this playlist - * @param id the unique DB id for this playlist - */ - void setID( Q_UINT64 id ); - - /** * Sorts the playlistItems by position. */ --- 200,203 ---- *************** *** 332,336 **** Q_UINT8 m_flag4; Q_UINT32 timeStamp; // some timestamp - Q_UINT64 m_id; // playlist ID Q_UINT32 unk3; Q_UINT16 mIsPodcast; // podcast flag --- 320,323 ---- Index: itunesdbwriter.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** itunesdbwriter.h 14 Jan 2008 21:04:37 -0000 1.8 --- itunesdbwriter.h 18 Jan 2008 22:23:15 -0000 1.9 *************** *** 32,35 **** --- 32,44 ---- namespace itunesdb { + enum DBFlags { + None = 0x0, + Has_Podcasts = 0x1, + Has_AlbumInfo = 0x2, + Has_CheckSum = 0x4, + Has_LetterJT = 0x8, + Has_All = 0xFFFFFFFF + }; + /** Writes an iTunesDB file *************** *** 41,54 **** class ItunesDBWriter{ public: - enum Flags { - None = 0x0, - Has_Podcasts = 0x1, - Has_AlbumInfo = 0x2, - Has_CheckSum = 0x4, - Has_LetterJT = 0x8, - Has_All = 0xFFFFFFFF - }; ! ItunesDBWriter(ItunesDBDataSource & trackdatasource); ~ItunesDBWriter(); --- 50,55 ---- class ItunesDBWriter{ public: ! ItunesDBWriter( ItunesDBDataSource & trackdatasource, int flags = Has_All ); ~ItunesDBWriter(); *************** *** 65,69 **** * @return true if the operation was successful, false otherwise */ ! bool write( QFile& file, int flags = Has_All ); /** --- 66,70 ---- * @return true if the operation was successful, false otherwise */ ! bool write( QFile& file ); /** *************** *** 74,77 **** --- 75,81 ---- private: + + int m_flags; + ItunesDBDataSource& m_datasource; Index: track.h =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/track.h,v retrieving revision 1.77 retrieving revision 1.78 diff -C2 -d -r1.77 -r1.78 *** track.h 28 Dec 2007 11:41:40 -0000 1.77 --- track.h 18 Jan 2008 22:23:15 -0000 1.78 *************** *** 187,196 **** /** - * Returns the DBID which refers to additional media associated to this track (like cover art) - * @return the DBID - */ - Q_UINT64 getDBID() const; - - /** * Returns the rating for this track as read from the itunesdb. * @return the rating for this track as read from the itunesdb. --- 187,190 ---- *************** *** 297,302 **** Q_UINT16 getBPM() const; - virtual void setDBID( Q_UINT64 id ); - /** * Sets the album for this track. --- 291,294 ---- *************** *** 682,686 **** unsigned char compilation; // iscompiltaion=1, 0 otherwise - Q_UINT64 dbid; Q_UINT8 checked; Q_UINT8 app_rating; --- 674,677 ---- Index: itunesdb_rw.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdb_rw.cpp,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** itunesdb_rw.cpp 4 Jan 2008 21:20:24 -0000 1.37 --- itunesdb_rw.cpp 18 Jan 2008 22:23:16 -0000 1.38 *************** *** 157,163 **** virtual void handlePlaylist( Playlist * playlist ) { std::auto_ptr<Playlist> plCleanup( playlist ); ! ! // printf( "listener handling playlist %s\n", playlist->getTitle().ascii() ); ! // This has to be before the podcast check since we really need the FIRST playlist after // the track section no matter if it's in the podcast block or not --- 157,185 ---- virtual void handlePlaylist( Playlist * playlist ) { std::auto_ptr<Playlist> plCleanup( playlist ); ! #define ANALYSE_PLAYLIST_STRUCTURE ! #ifdef ANALYSE_PLAYLIST_STRUCTURE ! printf( "listener handling playlist %s in section %d with %d elements\n", ! playlist->getTitle().ascii(), ! m_currentDataSet, ! playlist->getNumTracks() ); ! Playlist * existingPL = m_itunesdb.getPlaylistByTitle( playlist->getTitle() ); ! if( existingPL ) { ! // playlist already exists ! printf( "playlist %s in section %d already exists\n", ! playlist->getTitle().ascii(), ! m_currentDataSet ); ! Playlist::Iterator iter = playlist->getElements(); ! Playlist::Iterator existingIter = existingPL->getElements(); ! while ( iter.hasNext() && existingIter.hasNext() ) { ! if ( iter.next()->getID() != existingIter.next()->getID() ) { ! printf( "\tplaylists differ at element position %d\n", ! iter.current()->getPosition() ); ! } ! } ! if ( iter.hasNext() || existingIter.hasNext() ) { ! printf( "\tplaylist differs in length\n" ); ! } ! } ! #endif // This has to be before the podcast check since we really need the FIRST playlist after // the track section no matter if it's in the podcast block or not *************** *** 178,182 **** --- 200,206 ---- // can't handle podcasts at the moment + #ifndef ANALYSE_PLAYLIST_STRUCTURE return; + #endif } *************** *** 302,308 **** for( ; playlist != m_playlists->end(); ++playlist ) { (*playlist)->doPostParsingChecks(); ! if ( (*playlist)->getID() == 0 ) { Q_UINT64 nextDBID = getNextFreeDBID(); ! (*playlist)->setID( nextDBID ); mMaxDBID = nextDBID; } --- 326,332 ---- for( ; playlist != m_playlists->end(); ++playlist ) { (*playlist)->doPostParsingChecks(); ! if ( (*playlist)->getDBID() == 0 ) { Q_UINT64 nextDBID = getNextFreeDBID(); ! (*playlist)->setDBID( nextDBID ); mMaxDBID = nextDBID; } Index: itunesdbwriter.cpp =================================================================== RCS file: /cvsroot/kpod/libqtpod/src/itunesdbwriter.cpp,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** itunesdbwriter.cpp 16 Jan 2008 07:49:18 -0000 1.31 --- itunesdbwriter.cpp 18 Jan 2008 22:23:15 -0000 1.32 *************** *** 38,47 **** namespace itunesdb { ! ItunesDBWriter::ItunesDBWriter(ItunesDBDataSource & trackdatasource) : m_datasource( trackdatasource ) {} ItunesDBWriter::~ItunesDBWriter() {} #if 0 ! inline void writeMHIA( const QString& artist, const QString& album, Q_UINT32 albumID, QDataStream& datastream ) { QBuffer io_buffer; io_buffer.open(IO_WriteOnly); --- 38,48 ---- namespace itunesdb { ! ItunesDBWriter::ItunesDBWriter( ItunesDBDataSource & trackdatasource, int flags ) ! : m_flags( flags ), m_datasource( trackdatasource ) {} ItunesDBWriter::~ItunesDBWriter() {} #if 0 ! void writeMHIA( const QString& artist, const QString& album, Q_UINT32 albumID, QDataStream& datastream ) { QBuffer io_buffer; io_buffer.open(IO_WriteOnly); *************** *** 53,57 **** bufferstream << (Q_UINT32) 0x2; // number of string child records bufferstream << (Q_UINT32) albumID; // TODO ! bufferstream << (Q_UINT64) 0x0; // TODO DBID??? bufferstream << (Q_UINT32) 0x2; // TODO number of child records again??? --- 54,58 ---- bufferstream << (Q_UINT32) 0x2; // number of string child records bufferstream << (Q_UINT32) albumID; // TODO ! bufferstream << (Q_UINT64) 0x0; // TODO DBID!! bufferstream << (Q_UINT32) 0x2; // TODO number of child records again??? *************** *** 59,63 **** } ! inline void writeMHLA( QByteArray& buffer, const TrackPtrList::Iterator& tracks ) { TrackPtrList allTracks( tracks ); allTracks.sort(); --- 60,64 ---- } ! void writeMHLA( QByteArray& buffer, const TrackPtrList::Iterator& tracks ) { TrackPtrList allTracks( tracks ); allTracks.sort(); *************** *** 83,89 **** \fn itunesdb::ItunesDBWriter::write(QFile& file) */ ! bool ItunesDBWriter::write( QFile& file, int flags ) { ! if ( flags == ItunesDBWriter::None ) { return false; } --- 84,90 ---- \fn itunesdb::ItunesDBWriter::write(QFile& file) */ ! bool ItunesDBWriter::write( QFile& file ) { ! if ( m_flags == None ) { return false; } *************** *** 123,127 **** } ! if ( flags & ItunesDBWriter::Has_AlbumInfo ) { // TODO write mhla/mhia-s here } --- 124,128 ---- } ! if ( m_flags & Has_AlbumInfo ) { // TODO write mhla/mhia-s here } *************** *** 286,295 **** uint m_trackCount; uint * m_indices; public: ! MasterPlaylist( itunesdb::TrackPtrList & allTracks ) : itunesdb::Playlist(), m_trackPtrList( allTracks ), m_trackCount( allTracks.count() ), ! m_indices( new uint [ m_trackCount ] ) { TrackPtrList::Iterator trackIter = m_trackPtrList.iterator(); --- 287,298 ---- uint m_trackCount; uint * m_indices; + bool m_writeMHOD53; public: ! MasterPlaylist( itunesdb::TrackPtrList & allTracks, bool writeMHOD53 ) : itunesdb::Playlist(), m_trackPtrList( allTracks ), m_trackCount( allTracks.count() ), ! m_indices( new uint [ m_trackCount ] ), ! m_writeMHOD53( writeMHOD53 ) { TrackPtrList::Iterator trackIter = m_trackPtrList.iterator(); *************** *** 328,342 **** QChar letter; Q_UINT32 startidx; ! Q_UINT32 lastseen; MHOD53entry() : letter(), startidx( 0 ), lastseen( -1 ) {} }; ! void writeMHOD53( QDataStream& stream, uint sortIndex ) const { // write MHOD 53 ! typedef std::vector<MHOD53entry> EntryList; ! EntryList entrylist; MHOD53entry entry; - entry.letter = '0'; - MHOD53entry tailDigitEntry; tailDigitEntry.letter = '0'; --- 331,354 ---- QChar letter; Q_UINT32 startidx; ! int lastseen; MHOD53entry() : letter(), startidx( 0 ), lastseen( -1 ) {} + MHOD53entry( const QChar& newletter, unsigned int idx ) : + letter( newletter ), startidx( idx ), lastseen( idx ) {} + bool operator< ( const MHOD53entry& other ) const { return startidx < other.startidx; } }; ! typedef std::vector<MHOD53entry> MHOD53EntryList; ! unsigned int writeMHOD53( QDataStream& stream, uint sortIndex ) const { ! if ( !m_writeMHOD53 ) { ! return 0; ! } ! // write MHOD 53 ! MHOD53EntryList entrylist; ! MHOD53entry entry; MHOD53entry tailDigitEntry; + + // start and end may be non-letters + entry.letter = '0'; tailDigitEntry.letter = '0'; *************** *** 366,370 **** default: // do nothing ! return; } property = property.left( 1 ).lower(); --- 378,382 ---- default: // do nothing ! return 0; } property = property.left( 1 ).lower(); *************** *** 374,390 **** // property starts with a letter (a-z) if ( !entry.letter.isLetter() || property.localeAwareCompare( entry.letter ) > 0 ) { ! if ( i ) { // ignore letter jump at 0 entrylist.push_back( entry ); } ! entry.letter = property.at( 0 ); ! entry.startidx = i; ! entry.lastseen = i; } ! tailDigitEntry.startidx = 0; } else { // property starts with something else if ( entry.letter.isLetter() ) { ! // where already passed the "something else" section ! if ( !tailDigitEntry.startidx ) { tailDigitEntry.startidx = i; } --- 386,407 ---- // property starts with a letter (a-z) if ( !entry.letter.isLetter() || property.localeAwareCompare( entry.letter ) > 0 ) { ! if ( entry.lastseen >= 0 ) { // happens sometimes at 0 entrylist.push_back( entry ); } ! entry = MHOD53entry( newletter, i ); } ! tailDigitEntry.lastseen = -1; ! ! } else if ( newletter.isNull() && !entry.letter.isNull() ) { ! if ( entry.lastseen >= 0 ) { // happens sometimes at 0 ! entrylist.push_back( entry ); ! } ! entry = MHOD53entry( newletter, i ); ! } else { // property starts with something else if ( entry.letter.isLetter() ) { ! // we've already passed the "something else" section ! if ( tailDigitEntry.lastseen == -1 ) { tailDigitEntry.startidx = i; } *************** *** 394,404 **** entry.lastseen = i; } ! if ( entry.startidx ) { entrylist.push_back( entry ); } ! if ( tailDigitEntry.startidx ) { entrylist.push_back( tailDigitEntry ); } // write the MHOD stream << (Q_UINT32) 0x646F686D; // mhod --- 411,423 ---- entry.lastseen = i; } ! if ( entry.lastseen > 0 ) { entrylist.push_back( entry ); } ! if ( tailDigitEntry.lastseen > 0 ) { entrylist.push_back( tailDigitEntry ); } + std::sort( entrylist.begin(), entrylist.end() ); + // write the MHOD stream << (Q_UINT32) 0x646F686D; // mhod *************** *** 412,430 **** stream << (Q_UINT64) 0; ! EntryList::iterator entryIter = entrylist.begin(); for ( ; entryIter != entrylist.end(); ++entryIter ) { if ( entryIter->letter.isNull() ) { stream << (Q_UINT32) 0; } else { stream << (Q_UINT32) entryIter->letter.upper().unicode(); } stream << (Q_UINT32) entryIter->startidx; stream << (Q_UINT32) ( entryIter->lastseen - entryIter->startidx + 1 ); - // printf( "" ); } } ! void writeMHOD52( QDataStream& stream, uint sortIndex, const TrackComparatorPtr& comparator ) const { stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen --- 431,469 ---- stream << (Q_UINT64) 0; ! MHOD53EntryList::iterator entryIter = entrylist.begin(); for ( ; entryIter != entrylist.end(); ++entryIter ) { + + if ( entryIter + 1 != entrylist.end() ) { + // check for overlaps + MHOD53entry& nextentry = *(entryIter + 1); + if ( entryIter->lastseen >= (int)nextentry.startidx ) { + entryIter->lastseen = nextentry.startidx - 1; + // printf( "overlap!\n" ); + } + } + if ( entryIter->letter.isNull() ) { stream << (Q_UINT32) 0; + #if 0 + printf( "written MHOD53 entry (null)[%d,%d]\n", + entryIter->startidx, entryIter->lastseen ); + #endif } else { stream << (Q_UINT32) entryIter->letter.upper().unicode(); + #if 0 + printf( "written MHOD53 entry %c[%d,%d]\n", entryIter->letter.upper().latin1(), + entryIter->startidx, entryIter->lastseen ); + #endif } + stream << (Q_UINT32) entryIter->startidx; stream << (Q_UINT32) ( entryIter->lastseen - entryIter->startidx + 1 ); } + + return 1; } ! unsigned int writeMHOD52( QDataStream& stream, uint sortIndex, const TrackComparatorPtr& comparator ) const { stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen *************** *** 445,464 **** stream << (Q_UINT32) m_indices[ i ]; } } ! virtual uint writeNonStringMHODs( QDataStream& outstream ) const { ! // write type52 MHODs ! writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! writeMHOD53( outstream, 0x03 ); ! writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! writeMHOD53( outstream, 0x05 ); ! writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! writeMHOD53( outstream, 0x04 ); ! writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! writeMHOD53( outstream, 0x07 ); ! writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); --- 484,505 ---- stream << (Q_UINT32) m_indices[ i ]; } + + return 1; } ! virtual unsigned int writeNonStringMHODs( QDataStream& outstream ) const { ! unsigned int numMHOD = 0; // write type52 MHODs ! numMHOD += writeMHOD52( outstream, 0x03, TrackComparators::BY_TITLE ); ! numMHOD += writeMHOD53( outstream, 0x03 ); ! numMHOD += writeMHOD52( outstream, 0x05, TrackComparators::BY_ARTIST ); ! numMHOD += writeMHOD53( outstream, 0x05 ); ! numMHOD += writeMHOD52( outstream, 0x04, TrackComparators::BY_ALBUM ); ! numMHOD += writeMHOD53( outstream, 0x04 ); ! numMHOD += writeMHOD52( outstream, 0x07, TrackComparators::BY_GENRE ); ! numMHOD += writeMHOD53( outstream, 0x07 ); ! numMHOD += writeMHOD52( outstream, 0x12, TrackComparators::BY_COMPOSER ); ! numMHOD += writeMHOD53( outstream, 0x12 ); // writeMHOD52( outstream, 0x1D, TrackComparators::BY_TVSHOW ); *************** *** 466,473 **** // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); ! writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); ! writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); ! return 12; } }; --- 507,514 ---- // writeMHOD52( outstream, 0x1F, TrackComparators::BY_EPISODE ); ! numMHOD += writeMHOD52( outstream, 0x23, TrackComparators::BY_ALBUMARTIST ); ! numMHOD += writeMHOD52( outstream, 0x24, TrackComparators::BY_ARTISTFIELD ); ! return numMHOD; } }; *************** *** 483,487 **** stream.setByteOrder( QDataStream::LittleEndian); ! MasterPlaylist masterlist( m_datasource.getTrackList() ); masterlist.setTitle( m_datasource.getTitle() ); --- 524,528 ---- stream.setByteOrder( QDataStream::LittleEndian); ! MasterPlaylist masterlist( m_datasource.getTrackList(), m_flags & Has_LetterJT ); masterlist.setTitle( m_datasource.getTitle() ); |