Ticket #3043: multitrack.patch

File multitrack.patch, 20.2 KB (added by wseltzer@…, 14 years ago)

multitrack to one file

  • mythmusic/cdrip.h

     
    6363
    6464    private:
    6565        virtual void run(void);
    66         int ripTrack(QString &cddevice, Encoder *encoder, int tracknum);
     66        int ripTrack(QString &cddevice, Encoder *encoder, int tracknum, int tracklast);
    6767        void sendEvent(int eventType, const QString &value);
    6868        void sendEvent(int eventType, int value);
    6969
     
    111111    void searchArtist(void);
    112112    void searchAlbum(void);
    113113    void searchGenre(void);
     114    void titleChanged(QString newtitle);
     115    void searchTitle(void);
    114116
    115117  private:
    116118    void wireupTheme(void);
    117119    void keyPressEvent(QKeyEvent *e);
     120    bool isNewTune(QString &artist, QString &album, QString &title);
    118121    void deleteTrack(QString& artist, QString& album, QString& title);
    119122    void updateTrackList(void);
    120123    void trackListDown(bool page);
     
    138141    UIPushButtonType  *m_searchArtistButton;
    139142    UIPushButtonType  *m_searchAlbumButton;
    140143    UIPushButtonType  *m_searchGenreButton;
     144    UIRemoteEditType  *m_titleEdit;
     145    UIPushButtonType  *m_searchTitleButton;
    141146
    142147    int                m_currentTrack;
    143148    int                m_totalTracks;
    144149    vector<Metadata*> *m_tracks;
    145150
    146     QString            m_albumName, m_artistName, m_genreName, m_year;
     151    QString            m_albumName, m_artistName, m_genreName, m_year, m_titleName;
    147152    QStringList        m_searchList;
    148153    bool               m_somethingwasripped;
    149154    bool               m_mediaMonitorActive;
  • mythmusic/music-ui.xml

     
    495495                <font>labels</font>
    496496                <value>Track No.:</value>
    497497            </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>
    498504
    499505            <textarea name="rating_label" draworder="1" align="right">
    500506                <area>15,350,170,30</area>
     
    596602                <area>545,310,175,35</area>
    597603                <font>display</font>
    598604            </remoteedit>
     605           
     606            <remoteedit name="tracklast_edit" draworder="1" align="left">
     607                <area>545,350,175,35</area>
     608                <font>display</font>
     609            </remoteedit>
    599610
    600611            <repeatedimage name="rating_image" draworder="1" fleximage="no">
    601612                <filename>mm_rating.png</filename>
     
    835846           </textarea>
    836847
    837848           <textarea name="title" draworder="4" align="left">
    838                <area>100,250,130,30</area>
     849               <area>90,250,130,30</area>
    839850               <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>
    840857               <value>Title</value>
    841858           </textarea>
    842859
     
    864881               <fcnfont name="selected" function="selected"></fcnfont>
    865882               <columnpadding>10</columnpadding>
    866883               <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>
    870888               <items>7</items>
    871889               <image function="selectionbar" filename="mm_selectbar.png" location="-2,0"></image>
    872890               <image function="uparrow" filename="uparrow.png" location="735,290"></image>
  • mythmusic/decoder.h

     
    8181    virtual Metadata *getMetadata(void);
    8282    virtual MetaIO *doCreateTagger (void);
    8383    virtual void commitMetadata(Metadata *mdata);
     84    virtual void recalcLength(Metadata *mdata);
    8485
    8586    // static methods
    8687    static QStringList all();
  • mythmusic/metadata.cpp

     
    513513}
    514514
    515515
     516QString 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
    516528QString Metadata::FormatTitle()
    517529{
    518530    if (formattedtitle.isEmpty())
     
    613625    changed = true;
    614626}
    615627
     628void Metadata::setTrackLast(int ltracklast)
     629{
     630        tracklast = ltracklast;
     631        changed = true;
     632}
     633
    616634QStringList Metadata::fillFieldList(QString field)
    617635{
    618636    QStringList searchList;
     
    952970     
    953971        a_label += music_map[an_id]->FormatArtist();
    954972        a_label += " ~ ";
     973        //a_label += music_map[an_id]->Album();
     974        //a_label += " ~ ";
    955975        a_label += music_map[an_id]->FormatTitle();
    956976   
    957977
  • mythmusic/cddecoder.h

     
    2929    Metadata *getMetadata(void);
    3030    Metadata *getLastMetadata(void);
    3131    void commitMetadata(Metadata *mdata);
     32        void recalcLength(Metadata *mdata);
    3233
    3334  private:
    3435    void run();
  • mythmusic/cdrip.cpp

     
    8181    }
    8282
    8383    // we only care about audio tracks
     84        //just counting sectors, don't need tracklast
    8485    if (cdda_track_audiop (device, tracknum))
    8586    {
    8687        cdda_verbose_set(device, CDDA_MESSAGE_FORGETIT, CDDA_MESSAGE_FORGETIT);
     
    240241                break;
    241242            }
    242243
    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                       
    245251            if (isCancelled())
    246252                return;
    247253
     
    274280    sendEvent(ST_FINISHED, "");
    275281}
    276282
    277 int CDRipperThread::ripTrack(QString &cddevice, Encoder *encoder, int tracknum)
     283int CDRipperThread::ripTrack(QString &cddevice, Encoder *encoder, int tracknum, int tracklast)
    278284{
    279285    cdrom_drive *device = cdda_identify(cddevice.ascii(), 0, NULL);
    280286
     
    289295
    290296    cdda_verbose_set(device, CDDA_MESSAGE_FORGETIT, CDDA_MESSAGE_FORGETIT);
    291297    long int start = cdda_track_firstsector(device, tracknum);
    292     long int end = cdda_track_lastsector(device, tracknum);
     298    long int end = cdda_track_lastsector(device, tracklast);
    293299
    294300    cdrom_paranoia *paranoia = paranoia_init(device);
    295301    if (gContext->GetSetting("ParanoiaLevel") == "full")
     
    443449        connect(m_searchAlbumButton, SIGNAL(pushed()), this, SLOT(searchAlbum()));
    444450    }
    445451
     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
    446466    m_genreEdit = getUIRemoteEditType("genre_edit");
    447467    if (m_genreEdit)
    448468    {
     
    577597                trackListDown(true);
    578598            }
    579599        }
    580         else if (action == "INFO")
    581         {
    582             showEditMetadataDialog();
    583         }
    584600        else if (action == "1")
    585601            m_scanButton->push();
    586602        else if (action == "2")
     
    629645            track = m_decoder->getMetadata(trackno + 1);
    630646            if (track)
    631647            {
     648            //default, tracklast = track, produces same behavior as before
     649            track->setTrackLast(trackno + 1);
    632650                if (track->Compilation())
    633651                {
    634652                    isCompilation = true;
     
    979997    m_albumName = newalbum;
    980998}
    981999
     1000void 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
    9821015void Ripper::genreChanged(QString newgenre)
    9831016{
    9841017    Metadata *data;
     
    11641197        m_trackList->SetUpArrow(skip > 0);
    11651198        m_trackList->SetDownArrow(skip + trackListSize < m_totalTracks);
    11661199
     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        }     
    11671220        int i;
    11681221        for (i = 0; i < trackListSize; i++)
    11691222        {
     
    11711224                break;
    11721225
    11731226            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;
    11791230            int min, sec;
    11801231            min = length / 60;
    11811232            sec = length % 60;
    11821233            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);
    11851245
    11861246            if (i + skip == m_currentTrack)
    11871247            {
     
    12501310    }
    12511311}
    12521312
     1313void 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
    12531328void Ripper::searchGenre()
    12541329{
    12551330    QString s;
    12561331
    12571332    // load genre list
    12581333    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");
    12621338
    12631339    s = m_genreEdit->getText();
    12641340    if (showList(tr("Select a Genre"), s))
  • mythmusic/playlist.cpp

     
    974974                if (tmpdata)
    975975                {
    976976                    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());
    977978                    GenericTree *added_node = tree_to_write_to->addNode(a_string, it->getValue(), true);
    978979                    ++a_counter;
    979980                    added_node->setAttribute(0, 1);
     
    10401041            {
    10411042                QString a_string = QString("CD: %1 ~ %2 - %3")
    10421043                  .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());
    10441046                if(tmpdata->FormatArtist().length() < 1 ||
    10451047                   tmpdata->FormatTitle().length() < 1)
    10461048                {
  • mythmusic/decoder.cpp

     
    161161    }
    162162}
    163163
     164//only cddecoder knows
     165void Decoder::recalcLength(Metadata *mdata)
     166{
     167}
     168
    164169// static methods
    165170
    166171int Decoder::ignore_id3 = 0;
  • mythmusic/metadata.h

     
    2828                title = ltitle;
    2929                formattedartist = "";
    3030                formattedtitle = "";
    31                  genre = lgenre;
     31                genre = lgenre;
    3232                year = lyear;
    3333                tracknum = ltracknum;
    3434                length = llength;
     
    4040                changed = false;
    4141                show = true;
    4242                format = lformat;
     43                reorderartist = "";
    4344            }
    4445
    4546    Metadata(const Metadata &other)
     
    8586
    8687    QString FormatArtist();
    8788    QString FormatTitle();
     89    QString ReorderArtist();
    8890
    8991    QString Genre() { return genre; }
    9092    void setGenre(const QString &lgenre) { genre = lgenre; }
     
    125127    bool isVisible() { return show; }
    126128    void setVisible(bool visible) { show = visible; }
    127129
     130    int TrackLast() { return tracklast; }
     131    void setTrackLast(int tracklast);
     132
    128133    // track is part of a compilation album
    129134    bool Compilation() { return compilation; }
    130135    void setCompilation(bool state) { compilation = state; formattedartist = formattedtitle = ""; }
     
    162167    QString lastplay;
    163168    int playcount;
    164169    bool compilation;
     170    QString reorderartist;
     171    int tracklast;
    165172     
    166173    unsigned int id;
    167174    QString filename;
  • mythmusic/editmetadata.cpp

     
    102102    {
    103103        compilation_check->setState(m_metadata->Compilation());
    104104    }
     105
     106        if (tracklast_edit)
     107    {
     108        QString s;
     109        s = s.setNum(m_metadata->TrackLast());
     110        tracklast_edit->setText(s);
     111    }
     112
    105113}
    106114
    107115void EditMetadataDialog::incRating(bool up_or_down)
     
    227235        track_edit->createEdit(this);
    228236        connect(track_edit, SIGNAL(loosingFocus()), this, SLOT(editLostFocus()));
    229237    }
     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    }
    230245           
    231246    lastplay_text = getUITextType("lastplay_text");
    232247    playcount_text = getUITextType("playcount_text");
     
    256271    {
    257272        connect(searchalbum_button, SIGNAL(pushed()), this, SLOT(searchAlbum()));
    258273    }
     274       
     275        searchtitle_button = getUIPushButtonType("searchtitle_button");
     276    if (searchtitle_button)
     277    {
     278        connect(searchtitle_button, SIGNAL(pushed()), this, SLOT(searchAlbum()));
     279    }
    259280
    260281    searchgenre_button = getUIPushButtonType("searchgenre_button");
    261282    if (searchgenre_button)
     
    316337    else if (whichEditor == track_edit)
    317338    {
    318339        m_metadata->setTrack(track_edit->getText().toInt());
     340    }   
     341    else if (whichEditor == tracklast_edit)
     342    {
     343        m_metadata->setTrackLast(tracklast_edit->getText().toInt());
    319344    }
    320345
    321346}
     
    489514    cancelPopup();
    490515
    491516    *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());
    492531    done(1);
    493532}
    494533
  • mythmusic/editmetadata.h

     
    6464    UIRemoteEditType    *genre_edit;
    6565    UIRemoteEditType    *year_edit;
    6666    UIRemoteEditType    *track_edit;
    67    
     67    UIRemoteEditType    *tracklast_edit;
     68       
    6869    UITextType          *lastplay_text;
    6970    UITextType          *playcount_text;
    7071    UITextType          *filename_text;
     
    7475    UIPushButtonType    *searchartist_button;
    7576    UIPushButtonType    *searchcompilation_artist_button;
    7677    UIPushButtonType    *searchalbum_button;
    77     UIPushButtonType    *searchgenre_button;
     78    UIPushButtonType    *searchgenre_button; 
    7879    UIPushButtonType    *rating_button;
     80    UIPushButtonType    *searchtitle_button;
    7981   
    8082    UICheckBoxType      *compilation_check;
    8183   
  • mythmusic/playbackbox.h

     
    8787    void byAlbum();
    8888    void byGenre();
    8989    void byYear();   
     90    void byTitle();
    9091    void fromCD();
    9192    void showSmartPlaylistDialog();
    9293    void showSearchDialog();
  • mythmusic/cddecoder.cpp

     
    437437    return retdata;
    438438}   
    439439
     440void 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
    440496void CdDecoder::commitMetadata(Metadata *mdata)
    441497{
    442498    int cd = cd_init_device((char *)devicename.ascii());