Ticket #3043: multitrack.patch
File multitrack.patch, 20.2 KB (added by , 19 years ago) |
---|
-
mythmusic/cdrip.h
63 63 64 64 private: 65 65 virtual void run(void); 66 int ripTrack(QString &cddevice, Encoder *encoder, int tracknum );66 int ripTrack(QString &cddevice, Encoder *encoder, int tracknum, int tracklast); 67 67 void sendEvent(int eventType, const QString &value); 68 68 void sendEvent(int eventType, int value); 69 69 … … 111 111 void searchArtist(void); 112 112 void searchAlbum(void); 113 113 void searchGenre(void); 114 void titleChanged(QString newtitle); 115 void searchTitle(void); 114 116 115 117 private: 116 118 void wireupTheme(void); 117 119 void keyPressEvent(QKeyEvent *e); 120 bool isNewTune(QString &artist, QString &album, QString &title); 118 121 void deleteTrack(QString& artist, QString& album, QString& title); 119 122 void updateTrackList(void); 120 123 void trackListDown(bool page); … … 138 141 UIPushButtonType *m_searchArtistButton; 139 142 UIPushButtonType *m_searchAlbumButton; 140 143 UIPushButtonType *m_searchGenreButton; 144 UIRemoteEditType *m_titleEdit; 145 UIPushButtonType *m_searchTitleButton; 141 146 142 147 int m_currentTrack; 143 148 int m_totalTracks; 144 149 vector<Metadata*> *m_tracks; 145 150 146 QString m_albumName, m_artistName, m_genreName, m_year ;151 QString m_albumName, m_artistName, m_genreName, m_year, m_titleName; 147 152 QStringList m_searchList; 148 153 bool m_somethingwasripped; 149 154 bool m_mediaMonitorActive; -
mythmusic/music-ui.xml
495 495 <font>labels</font> 496 496 <value>Track No.:</value> 497 497 </textarea> 498 499 <textarea name="tracklast_label" draworder="1" align="right"> 500 <area>365,350,170,30</area> 501 <font>labels</font> 502 <value>Last Track No.:</value> 503 </textarea> 498 504 499 505 <textarea name="rating_label" draworder="1" align="right"> 500 506 <area>15,350,170,30</area> … … 596 602 <area>545,310,175,35</area> 597 603 <font>display</font> 598 604 </remoteedit> 605 606 <remoteedit name="tracklast_edit" draworder="1" align="left"> 607 <area>545,350,175,35</area> 608 <font>display</font> 609 </remoteedit> 599 610 600 611 <repeatedimage name="rating_image" draworder="1" fleximage="no"> 601 612 <filename>mm_rating.png</filename> … … 835 846 </textarea> 836 847 837 848 <textarea name="title" draworder="4" align="left"> 838 <area> 100,250,130,30</area>849 <area>90,250,130,30</area> 839 850 <font>listlabel</font> 851 <value>Last</value> 852 </textarea> 853 854 <textarea name="title" draworder="4" align="left"> 855 <area>140,250,130,30</area> 856 <font>listlabel</font> 840 857 <value>Title</value> 841 858 </textarea> 842 859 … … 864 881 <fcnfont name="selected" function="selected"></fcnfont> 865 882 <columnpadding>10</columnpadding> 866 883 <column number="1" width="50" context="-1"></column> 867 <column number="2" width="340" context="-1"></column> 868 <column number="3" width="200" context="-1"></column> 869 <column number="4" width="100" context="-1"></column> 884 <column number="2" width="40" context="-1"></column> 885 <column number="3" width="300" context="-1"></column> 886 <column number="4" width="200" context="-1"></column> 887 <column number="5" width="100" context="-1"></column> 870 888 <items>7</items> 871 889 <image function="selectionbar" filename="mm_selectbar.png" location="-2,0"></image> 872 890 <image function="uparrow" filename="uparrow.png" location="735,290"></image> -
mythmusic/decoder.h
81 81 virtual Metadata *getMetadata(void); 82 82 virtual MetaIO *doCreateTagger (void); 83 83 virtual void commitMetadata(Metadata *mdata); 84 virtual void recalcLength(Metadata *mdata); 84 85 85 86 // static methods 86 87 static QStringList all(); -
mythmusic/metadata.cpp
513 513 } 514 514 515 515 516 QString Metadata::ReorderArtist() 517 { 518 if (reorderartist.isEmpty()) { 519 QStringList artistreorder = QStringList::split(QRegExp("[>,]"), formattedartist); 520 formattedartist = artistreorder[1].stripWhiteSpace() + " " 521 + artistreorder[0].stripWhiteSpace(); 522 reorderartist = "Y"; 523 } 524 return formattedartist; 525 } 526 527 516 528 QString Metadata::FormatTitle() 517 529 { 518 530 if (formattedtitle.isEmpty()) … … 613 625 changed = true; 614 626 } 615 627 628 void Metadata::setTrackLast(int ltracklast) 629 { 630 tracklast = ltracklast; 631 changed = true; 632 } 633 616 634 QStringList Metadata::fillFieldList(QString field) 617 635 { 618 636 QStringList searchList; … … 952 970 953 971 a_label += music_map[an_id]->FormatArtist(); 954 972 a_label += " ~ "; 973 //a_label += music_map[an_id]->Album(); 974 //a_label += " ~ "; 955 975 a_label += music_map[an_id]->FormatTitle(); 956 976 957 977 -
mythmusic/cddecoder.h
29 29 Metadata *getMetadata(void); 30 30 Metadata *getLastMetadata(void); 31 31 void commitMetadata(Metadata *mdata); 32 void recalcLength(Metadata *mdata); 32 33 33 34 private: 34 35 void run(); -
mythmusic/cdrip.cpp
81 81 } 82 82 83 83 // we only care about audio tracks 84 //just counting sectors, don't need tracklast 84 85 if (cdda_track_audiop (device, tracknum)) 85 86 { 86 87 cdda_verbose_set(device, CDDA_MESSAGE_FORGETIT, CDDA_MESSAGE_FORGETIT); … … 240 241 break; 241 242 } 242 243 243 ripTrack(cddevice, encoder, trackno + 1); 244 244 //trackno is the counter, 0-start 245 int trackfirst = trackno + 1; 246 int tracklast = track->TrackLast(); 247 ripTrack(cddevice, encoder, trackfirst, tracklast); 248 //counter to end of current track selection, inc at the top 249 trackno = tracklast - 1; 250 245 251 if (isCancelled()) 246 252 return; 247 253 … … 274 280 sendEvent(ST_FINISHED, ""); 275 281 } 276 282 277 int CDRipperThread::ripTrack(QString &cddevice, Encoder *encoder, int tracknum )283 int CDRipperThread::ripTrack(QString &cddevice, Encoder *encoder, int tracknum, int tracklast) 278 284 { 279 285 cdrom_drive *device = cdda_identify(cddevice.ascii(), 0, NULL); 280 286 … … 289 295 290 296 cdda_verbose_set(device, CDDA_MESSAGE_FORGETIT, CDDA_MESSAGE_FORGETIT); 291 297 long int start = cdda_track_firstsector(device, tracknum); 292 long int end = cdda_track_lastsector(device, track num);298 long int end = cdda_track_lastsector(device, tracklast); 293 299 294 300 cdrom_paranoia *paranoia = paranoia_init(device); 295 301 if (gContext->GetSetting("ParanoiaLevel") == "full") … … 443 449 connect(m_searchAlbumButton, SIGNAL(pushed()), this, SLOT(searchAlbum())); 444 450 } 445 451 452 m_titleEdit = getUIRemoteEditType("title_edit"); 453 if (m_titleEdit) 454 { 455 m_titleEdit->createEdit(this); 456 connect(m_titleEdit, SIGNAL(textChanged(QString)), this, SLOT(titleChanged(QString))); 457 } 458 459 m_searchTitleButton = getUIPushButtonType("searchtitle_button"); 460 if (m_searchTitleButton) 461 { 462 connect(m_searchTitleButton, SIGNAL(pushed()), this, SLOT(searchTitle())); 463 } 464 465 446 466 m_genreEdit = getUIRemoteEditType("genre_edit"); 447 467 if (m_genreEdit) 448 468 { … … 577 597 trackListDown(true); 578 598 } 579 599 } 580 else if (action == "INFO")581 {582 showEditMetadataDialog();583 }584 600 else if (action == "1") 585 601 m_scanButton->push(); 586 602 else if (action == "2") … … 629 645 track = m_decoder->getMetadata(trackno + 1); 630 646 if (track) 631 647 { 648 //default, tracklast = track, produces same behavior as before 649 track->setTrackLast(trackno + 1); 632 650 if (track->Compilation()) 633 651 { 634 652 isCompilation = true; … … 979 997 m_albumName = newalbum; 980 998 } 981 999 1000 void Ripper::titleChanged(QString newtitle) 1001 { 1002 Metadata *data; 1003 1004 for (int trackno = 0; trackno < m_totalTracks; ++trackno) 1005 { 1006 data = m_tracks->at(trackno); 1007 1008 if (data) 1009 data->setTitle(newtitle); 1010 } 1011 1012 m_titleName = newtitle; 1013 } 1014 982 1015 void Ripper::genreChanged(QString newgenre) 983 1016 { 984 1017 Metadata *data; … … 1164 1197 m_trackList->SetUpArrow(skip > 0); 1165 1198 m_trackList->SetDownArrow(skip + trackListSize < m_totalTracks); 1166 1199 1200 //calculate which tracks are active 1201 //and which are skipped by a previous tracklast 1202 //skipped show tracklast as 0 and length as - 1203 int j; 1204 int is_active[m_totalTracks]; 1205 for (j = 0; j < m_totalTracks; j++) 1206 { 1207 is_active[j]=1; 1208 Metadata *tmptrack = m_tracks->at(j); 1209 int next = tmptrack->TrackLast(); 1210 if (next > m_totalTracks) 1211 { 1212 next = m_totalTracks; 1213 } 1214 for (int k=j+1; k < next; k++) 1215 { 1216 is_active[k]=0; 1217 } 1218 j = next - 1; 1219 } 1167 1220 int i; 1168 1221 for (i = 0; i < trackListSize; i++) 1169 1222 { … … 1171 1224 break; 1172 1225 1173 1226 Metadata *track = m_tracks->at(i + skip); 1174 1175 m_trackList->SetItemText(i, 1, QString::number(track->Track())); 1176 m_trackList->SetItemText(i, 2, track->Title()); 1177 m_trackList->SetItemText(i, 3, track->Artist()); 1178 int length = track->Length() / 1000; 1227 1228 int tracklast = track->TrackLast(); 1229 int length = track->Length() / 1000; 1179 1230 int min, sec; 1180 1231 min = length / 60; 1181 1232 sec = length % 60; 1182 1233 QString s; 1183 s.sprintf("%02d:%02d", min, sec); 1184 m_trackList->SetItemText(i, 4, s); 1234 s.sprintf("%02d:%02d", min, sec); 1235 if (is_active[i + skip] == 0) 1236 { 1237 tracklast = 0; 1238 s.sprintf("-"); 1239 } 1240 m_trackList->SetItemText(i, 1, QString::number(track->Track())); 1241 m_trackList->SetItemText(i, 2, QString::number(tracklast)); 1242 m_trackList->SetItemText(i, 3, track->Title()); 1243 m_trackList->SetItemText(i, 4, track->Artist()); 1244 m_trackList->SetItemText(i, 5, s); 1185 1245 1186 1246 if (i + skip == m_currentTrack) 1187 1247 { … … 1250 1310 } 1251 1311 } 1252 1312 1313 void Ripper::searchTitle() 1314 { 1315 QString s; 1316 1317 m_searchList = Metadata::fillFieldList("title"); 1318 1319 s = m_titleEdit->getText(); 1320 if (showList(tr("Select Title"), s)) 1321 { 1322 m_titleEdit->setText(s); 1323 titleChanged(s); 1324 } 1325 } 1326 1327 1253 1328 void Ripper::searchGenre() 1254 1329 { 1255 1330 QString s; 1256 1331 1257 1332 // load genre list 1258 1333 m_searchList.clear(); 1259 for (int x = 0; x < genre_table_size; x++) 1260 m_searchList.push_back(QString(genre_table[x])); 1261 m_searchList.sort(); 1334 //for (int x = 0; x < genre_table_size; x++) 1335 // m_searchList.push_back(QString(genre_table[x])); 1336 //m_searchList.sort(); 1337 m_searchList = Metadata::fillFieldList("genre"); 1262 1338 1263 1339 s = m_genreEdit->getText(); 1264 1340 if (showList(tr("Select a Genre"), s)) -
mythmusic/playlist.cpp
974 974 if (tmpdata) 975 975 { 976 976 QString a_string = QString("%1 ~ %2").arg(tmpdata->FormatArtist()).arg(tmpdata->FormatTitle()); 977 //QString a_string = QString(QObject::tr("%1 ~ %2 ~ %3")).arg(tmpdata->FormatArtist()).arg(tmpdata->Album()).arg(tmpdata->FormatTitle()); 977 978 GenericTree *added_node = tree_to_write_to->addNode(a_string, it->getValue(), true); 978 979 ++a_counter; 979 980 added_node->setAttribute(0, 1); … … 1040 1041 { 1041 1042 QString a_string = QString("CD: %1 ~ %2 - %3") 1042 1043 .arg(tmpdata->Track()).arg(tmpdata->FormatTitle()).arg(tmpdata->FormatArtist()); 1043 1044 //QString a_string = QString(QObject::tr("CD: %1 ~ %2 ~ %3 - %4")) 1045 //.arg(tmpdata->FormatArtist()).arg(tmpdata->Album()).arg(tmpdata->Track()).arg(tmpdata->FormatTitle()); 1044 1046 if(tmpdata->FormatArtist().length() < 1 || 1045 1047 tmpdata->FormatTitle().length() < 1) 1046 1048 { -
mythmusic/decoder.cpp
161 161 } 162 162 } 163 163 164 //only cddecoder knows 165 void Decoder::recalcLength(Metadata *mdata) 166 { 167 } 168 164 169 // static methods 165 170 166 171 int Decoder::ignore_id3 = 0; -
mythmusic/metadata.h
28 28 title = ltitle; 29 29 formattedartist = ""; 30 30 formattedtitle = ""; 31 31 genre = lgenre; 32 32 year = lyear; 33 33 tracknum = ltracknum; 34 34 length = llength; … … 40 40 changed = false; 41 41 show = true; 42 42 format = lformat; 43 reorderartist = ""; 43 44 } 44 45 45 46 Metadata(const Metadata &other) … … 85 86 86 87 QString FormatArtist(); 87 88 QString FormatTitle(); 89 QString ReorderArtist(); 88 90 89 91 QString Genre() { return genre; } 90 92 void setGenre(const QString &lgenre) { genre = lgenre; } … … 125 127 bool isVisible() { return show; } 126 128 void setVisible(bool visible) { show = visible; } 127 129 130 int TrackLast() { return tracklast; } 131 void setTrackLast(int tracklast); 132 128 133 // track is part of a compilation album 129 134 bool Compilation() { return compilation; } 130 135 void setCompilation(bool state) { compilation = state; formattedartist = formattedtitle = ""; } … … 162 167 QString lastplay; 163 168 int playcount; 164 169 bool compilation; 170 QString reorderartist; 171 int tracklast; 165 172 166 173 unsigned int id; 167 174 QString filename; -
mythmusic/editmetadata.cpp
102 102 { 103 103 compilation_check->setState(m_metadata->Compilation()); 104 104 } 105 106 if (tracklast_edit) 107 { 108 QString s; 109 s = s.setNum(m_metadata->TrackLast()); 110 tracklast_edit->setText(s); 111 } 112 105 113 } 106 114 107 115 void EditMetadataDialog::incRating(bool up_or_down) … … 227 235 track_edit->createEdit(this); 228 236 connect(track_edit, SIGNAL(loosingFocus()), this, SLOT(editLostFocus())); 229 237 } 238 239 tracklast_edit = getUIRemoteEditType("tracklast_edit"); 240 if (tracklast_edit) 241 { 242 tracklast_edit->createEdit(this); 243 connect(tracklast_edit, SIGNAL(loosingFocus()), this, SLOT(editLostFocus())); 244 } 230 245 231 246 lastplay_text = getUITextType("lastplay_text"); 232 247 playcount_text = getUITextType("playcount_text"); … … 256 271 { 257 272 connect(searchalbum_button, SIGNAL(pushed()), this, SLOT(searchAlbum())); 258 273 } 274 275 searchtitle_button = getUIPushButtonType("searchtitle_button"); 276 if (searchtitle_button) 277 { 278 connect(searchtitle_button, SIGNAL(pushed()), this, SLOT(searchAlbum())); 279 } 259 280 260 281 searchgenre_button = getUIPushButtonType("searchgenre_button"); 261 282 if (searchgenre_button) … … 316 337 else if (whichEditor == track_edit) 317 338 { 318 339 m_metadata->setTrack(track_edit->getText().toInt()); 340 } 341 else if (whichEditor == tracklast_edit) 342 { 343 m_metadata->setTrackLast(tracklast_edit->getText().toInt()); 319 344 } 320 345 321 346 } … … 489 514 cancelPopup(); 490 515 491 516 *m_sourceMetadata = m_metadata; 517 //update length in case a tracklast has been added 518 Decoder *decoder = Decoder::create(m_metadata->Filename(), NULL, NULL, true); 519 if (decoder) 520 { 521 decoder->recalcLength(m_metadata); 522 delete decoder; 523 } 524 *m_sourceMetadata = m_metadata; 525 if (m_metadata->TrackLast() < m_metadata->Track()) 526 { 527 m_metadata->setTrackLast(m_metadata->Track()); 528 } 529 //set tracklast in the new metadata copy 530 m_sourceMetadata->setTrackLast(m_metadata->TrackLast()); 492 531 done(1); 493 532 } 494 533 -
mythmusic/editmetadata.h
64 64 UIRemoteEditType *genre_edit; 65 65 UIRemoteEditType *year_edit; 66 66 UIRemoteEditType *track_edit; 67 67 UIRemoteEditType *tracklast_edit; 68 68 69 UITextType *lastplay_text; 69 70 UITextType *playcount_text; 70 71 UITextType *filename_text; … … 74 75 UIPushButtonType *searchartist_button; 75 76 UIPushButtonType *searchcompilation_artist_button; 76 77 UIPushButtonType *searchalbum_button; 77 UIPushButtonType *searchgenre_button; 78 UIPushButtonType *searchgenre_button; 78 79 UIPushButtonType *rating_button; 80 UIPushButtonType *searchtitle_button; 79 81 80 82 UICheckBoxType *compilation_check; 81 83 -
mythmusic/playbackbox.h
87 87 void byAlbum(); 88 88 void byGenre(); 89 89 void byYear(); 90 void byTitle(); 90 91 void fromCD(); 91 92 void showSmartPlaylistDialog(); 92 93 void showSearchDialog(); -
mythmusic/cddecoder.cpp
437 437 return retdata; 438 438 } 439 439 440 void CdDecoder::recalcLength(Metadata *mdata) 441 { 442 int cd = cd_init_device((char *)devicename.ascii()); 443 444 struct disc_info discinfo; 445 if (cd_stat(cd, &discinfo) != 0) 446 { 447 error("Couldn't stat CD, Error."); 448 cd_finish(cd); 449 } 450 451 if (!discinfo.disc_present) 452 { 453 error("No disc present"); 454 cd_finish(cd); 455 } 456 457 int tracknum = mdata->Track(); 458 int tracklast = mdata->TrackLast(); 459 460 if (tracknum > discinfo.disc_total_tracks) 461 { 462 error("No such track on CD"); 463 cd_finish(cd); 464 return; 465 } 466 467 if (tracklast > discinfo.disc_total_tracks) 468 { 469 error("No such track on CD"); 470 cd_finish(cd); 471 return; 472 } 473 474 if (tracklast < tracknum) 475 { 476 error("Negative-length track"); 477 cd_finish(cd); 478 return; 479 } 480 481 int length = 0; 482 for (int i = tracknum - 1; i < tracklast; i++) 483 { 484 int ltemp = discinfo.disc_track[i].track_length.minutes * 60 + 485 discinfo.disc_track[i].track_length.seconds; 486 ltemp = ltemp < 0 ? 0 : ltemp; 487 length += ltemp; 488 } 489 length *= 1000; 490 VERBOSE(VB_IMPORTANT, QString("Recalculating length to %1").arg(length)); 491 mdata->setLength(length); 492 cd_finish(cd); 493 return; 494 } 495 440 496 void CdDecoder::commitMetadata(Metadata *mdata) 441 497 { 442 498 int cd = cd_init_device((char *)devicename.ascii());