s32 __sort_play_count(struct discHdr * hdr1, struct discHdr * hdr2, bool desc) { int ret; if (desc) ret = (getPlayCount(hdr2->id) - getPlayCount(hdr1->id)); else ret = (getPlayCount(hdr1->id) - getPlayCount(hdr2->id)); if (ret == 0) ret = __sort_title(hdr1, hdr2, desc); return ret; }
int filter_play_count(struct discHdr *list, int cnt, char *ignore, bool notused) { int i; for (i=0; i<cnt;) { if (getPlayCount(list[i].id) > 0) { memcpy(list+i, list+i+1, (cnt-i-1) * sizeof(struct discHdr)); cnt--; } else { i++; } } return cnt; }
void Track::writeData( QByteArray& data) const { QBuffer buffer( data); buffer.open(IO_WriteOnly); QDataStream stream( &buffer); stream.setByteOrder( QDataStream::LittleEndian); /** Write the track header **/ stream << (Q_UINT32) 0x7469686D; // 0x00 mhit stream << (Q_UINT32) 0xf4; // 0x04 headerlen stream << (Q_UINT32) 0x0; // 0x08 length - set later stream << (Q_UINT32) 0x0; // 0x0C number of mhods stream << (Q_UINT32) getID(); // 0x10 stream << (Q_UINT32) 1; // 0x14 //stream << (Q_UINT32) 0; // 0x18 stream << (Q_UINT32) 0x4d503320; // ipod shiffle wants a "MP3 " here stream << vbr; // 0x1C stream << type; // 0x1D stream << compilation; // 0x1E stream << rating; // 0x1F stream << (Q_UINT32) getLastModified()+ MAC_EPOCH_DELTA; // 0x20 stream << (Q_UINT32) getFileSize(); // 0x24 stream << (Q_UINT32) getTrackLength(); // 0x28 stream << (Q_UINT32) getTrackNumber(); // 0x2C stream << (Q_UINT32) getTrackCount(); // 0x30 stream << (Q_UINT32) getYear(); // 0x34 stream << (Q_UINT32) getBitrate(); // 0x38 stream << (Q_UINT32) getSamplerate(); // 0x3C stream << (Q_UINT32) getVolumeAdjust(); // 0x40 stream << (Q_UINT32) 0; // 0x44 empty space //stream << (Q_UINT32) getTrackLength(); // 0x48 empty space stream << (Q_UINT32) 0; // 0x48 empty space stream << (Q_UINT32) 0; // 0x4C empty space stream << (Q_UINT32) getPlayCount(); // 0x50 stream << (Q_UINT32) getPlayCount(); // 0x54 stream << (Q_UINT32) getLastPlayed(); // 0x58 stream << (Q_UINT32) getCdNumber(); // 0x5C stream << (Q_UINT32) getCdCount(); // 0x60 stream << (Q_UINT32) 0; // 0x64 empty space //userid from apple store stream << (Q_UINT32) date_added; // 0x68 stream << (Q_UINT32) 0; // boockmarktime stream << (Q_UINT64) dbid; // unique bit (64 bit) stream << (Q_UINT8) 0; // checked in iTZnes stream << (Q_UINT8) 0; // application rating stream << (Q_UINT16) 0; // BPM stream << (Q_UINT16) 0; // artworkcount stream << (Q_UINT16) 0xffff; // unkown stream << (Q_UINT32) 0; // artwork size stream << (Q_UINT32) 0; // unkown stream << (float) -getSamplerate(); // samplerate as floating point "-"?!? stream << (Q_UINT32) 0; // date/time added stream << (Q_UINT32) file_format_code; // unkown, but 0x0000000c for MP3 ? stream << (Q_UINT32) 0; // unkown stream << (Q_UINT32) 0; // unkown stream << (Q_UINT32) 0; // unkown stream << (Q_UINT32) 0; // unkown stream << (Q_UINT32) 0x02; // unknown stream << (Q_UINT64) dbid; // same unique id as above for( int i= 0; i< 17; i++) stream << (Q_UINT32) 0; /** Write Track contents **/ Q_UINT32 num_mhods = 0; for( PropertyMap::const_iterator element= properties.begin(); element!= properties.end(); ++element) { if( (*element).isEmpty()) continue; const char *data= (const char *)(*element).ucs2(); if( data == NULL) continue; int datalen= 2* (*element).length(); stream << (Q_UINT32) 0x646F686D; // mhod stream << (Q_UINT32) 0x18; // headerlen stream << (Q_UINT32) 40+ datalen; stream << (Q_UINT32) element.key(); stream << (Q_UINT32) 0; stream << (Q_UINT32) 0; stream << (Q_UINT32) 1; // dummy - would refer to the trackID if used in playlist stream << (Q_UINT32) datalen; stream << (Q_UINT32) 0; stream << (Q_UINT32) 0; stream.writeRawBytes( data, datalen); num_mhods++; } buffer.at( 8); stream << (Q_UINT32)data.size(); // set content length stream << (Q_UINT32)num_mhods; // set real mhod count buffer.close(); }