⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkmusicbrowser.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        }
    }

    if (allgood)
        GenPlaylist(items);
    else {
        string caption = "Generate Playlist Error";
        string message = "The item(s) you selected to seed the Relatable Engine with are not signatured.  If signaturing is presently taking place, please wait a while longer and try again.  Otherwise, select 'Start Signaturing' from the Relatable menu to start the signaturing process.";

        GTKMessageDialog *dialog = new GTKMessageDialog();
        dialog->Show(message.c_str(), caption.c_str(), kMessageOk, true);
        delete dialog;
    }
 
    delete items;
}

void GTKMusicBrowser::GenPlaylist(vector<PlaylistItem *> *seed)
{
    APSInterface *pInterface = m_context->aps;
    if (!pInterface)
        return;

    if (!pInterface->IsTurnedOn()) {
        AskOptIn(false);
        return;
    }

    int totaltracks = m_context->catalog->GetTotalNumTracks();
    int needingsigs = m_context->catalog->GetNumNeedingSigs();

    if ((needingsigs * 100) / totaltracks > 25) {
        StillNeedSignature(false);
        return;
    }

    APSPlaylist ResultPlaylist;
    uint32 nResponse = 0;

    if ((seed) && (!seed->empty())) {
        APSPlaylist InputPlaylist;
        vector<PlaylistItem *>::iterator i;

        bool allgood = true;
        for (i = seed->begin(); i != seed->end(); i++) {
            if ((*i)->GetMetaData().GUID().size() != 16) {
                allgood = false;
                break;
            }
            InputPlaylist.Insert((*i)->GetMetaData().GUID().c_str(),
                                 (*i)->URL().c_str());
        }

        if (allgood)
            nResponse = m_context->aps->APSGetPlaylist(&InputPlaylist, 
                                                       &ResultPlaylist);
        else {
            string caption = "Generate Playlist Error";
            string message = "The item(s) you selected to seed the Relatable Engine with are not signatured.  If signaturing is presently taking place, please wait a while longer and try again.  Otherwise, select 'Start Signaturing' from the Relatable menu to start the signaturing process.";

            GTKMessageDialog *dialog = new GTKMessageDialog();
            dialog->Show(message.c_str(), caption.c_str(), kMessageOk, false);
            delete dialog;
        }
    }
    else {
        APSPlaylist InputPlaylist;
        nResponse = m_context->aps->APSGetPlaylist(&InputPlaylist, 
                                                   &ResultPlaylist);
    }
   
    if (nResponse == APS_NOERROR) {
        if (ResultPlaylist.Size() > 0) {
            vector<string> newitems;
            string strTemp;
            string strFilename;
            APSPlaylist::iterator j;

            for (j = ResultPlaylist.begin(); j.isvalid(); j.next()) {
                strFilename = m_context->catalog->GetFilename(j.first());
                if (strFilename != "")
                    newitems.push_back(strFilename.c_str());
            }

            for (int z = m_plm->CountItems() - 1; z >= 0; z--) {
                PlaylistItem *testitem = m_plm->ItemAt(z);
                bool remove = true;

                if ((seed) && (!seed->empty())) {
                    vector<PlaylistItem *>::iterator i = seed->begin();
                    for (; i != seed->end(); i++) {
                        if ((*i)->GetMetaData().GUID() == 
                             testitem->GetMetaData().GUID()) {
                            remove = false;
                            break;
                        }
                    }
                }

                if (remove)
                    m_plm->RemoveItem(z);
            }         
            m_plm->AddItems(newitems);
        }
        else
           cerr << "Recommendation didn't return any items\n";
    }
    else
        cerr << "Recommendation server error\n";
}

void GTKMusicBrowser::AddPLStreamToFavs(void)
{
    PlaylistItem *stream = m_plm->ItemAt(m_lastindex);
    m_context->catalog->WriteMetaDataToDatabase(stream->URL().c_str(),
                                                stream->GetMetaData(),
                                                kTypeStream);
    m_context->catalog->AddStream(stream->URL().c_str());
}

void GTKMusicBrowser::AddStreamToFavs(void)
{
    vector<TreeData *>::iterator i = mbSelections->begin();
    for (; i != mbSelections->end(); i++) {
        if ((*i)->type != kTreeStream)
            continue;

        PlaylistItem *stream = (*i)->track;
        m_context->catalog->WriteMetaDataToDatabase(stream->URL().c_str(),
                                                    stream->GetMetaData(),
                                                    kTypeStream);
        m_context->catalog->AddStream(stream->URL().c_str());
    }
}

void GTKMusicBrowser::VisitWebsite(void)
{
    vector<TreeData *>::iterator i = mbSelections->begin();
    for (; i != mbSelections->end(); i++) {
        if ((*i)->type != kTreeStream)
            continue;

        PlaylistItem *stream = (*i)->track;
        LaunchBrowser(stream->WebURL().c_str());
    }
}

static gboolean add_new_destroy(GtkWidget *w, gpointer p)
{
    gtk_main_quit();
    return FALSE;
}

static gint add_new_kill(GtkWidget *w, GdkEvent *e, int *ret)
{
    *ret = 2;
    return FALSE;
}

static void add_new_ok(GtkWidget *w, int *ret)
{
    *ret = 1;
}

static void add_new_cancel(GtkWidget *w, int *ret)
{
    *ret = 2;
}

static void add_new_title(GtkWidget *w, string *title)
{
    *title = gtk_entry_get_text(GTK_ENTRY(w));
}

static void add_new_url(GtkWidget *w, string *url)
{
    *url = gtk_entry_get_text(GTK_ENTRY(w));
}

void GTKMusicBrowser::AddNewStream(void)
{
    int iRet = 0;

    string url, title;

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_modal(GTK_WINDOW(window), TRUE);
    gtk_signal_connect(GTK_OBJECT(window), "destroy",
                       GTK_SIGNAL_FUNC(add_new_destroy), NULL);
    gtk_signal_connect(GTK_OBJECT(window), "delete_event",
                       GTK_SIGNAL_FUNC(add_new_kill), &iRet);
    gtk_window_set_title(GTK_WINDOW(window), "Add a New Stream");
    gtk_container_set_border_width(GTK_CONTAINER(window), 5);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);
    gtk_widget_show(vbox);

    GtkWidget *table = gtk_table_new(8, 2, FALSE);
    gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
    gtk_widget_show(table);

    GtkWidget *label = gtk_label_new("Title:");
    gtk_misc_set_alignment(GTK_MISC(label), (gfloat)1.0, (gfloat)0.5);
    gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL,
                     10, 1);
    gtk_widget_show(label);

    GtkWidget *titleEntry = gtk_entry_new();
    gtk_table_attach_defaults(GTK_TABLE(table), titleEntry, 1, 2, 0, 1);
    gtk_signal_connect(GTK_OBJECT(titleEntry), "changed",
                       GTK_SIGNAL_FUNC(add_new_title), &title);
    gtk_widget_show(titleEntry);

    label = gtk_label_new("URL:");
    gtk_misc_set_alignment(GTK_MISC(label), (gfloat)1.0, (gfloat)0.5);
    gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL,
                     10, 1);
    gtk_widget_show(label);

    GtkWidget *urlEntry = gtk_entry_new();
    gtk_table_attach_defaults(GTK_TABLE(table), urlEntry, 1, 2, 1, 2);
    gtk_signal_connect(GTK_OBJECT(urlEntry), "changed",
                       GTK_SIGNAL_FUNC(add_new_url), &url);
    gtk_widget_show(urlEntry);

    GtkWidget *separator = gtk_hseparator_new();
    gtk_container_add(GTK_CONTAINER(vbox), separator);
    gtk_widget_show(separator);

    GtkWidget *hbox = gtk_hbox_new(FALSE, 10);
    gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
    gtk_container_add(GTK_CONTAINER(vbox), hbox);
    gtk_widget_show(hbox);

    GtkWidget *button = gtk_button_new_with_label("OK");
    gtk_signal_connect(GTK_OBJECT(button), "clicked",
                       GTK_SIGNAL_FUNC(add_new_ok), &iRet);
    gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
                              GTK_SIGNAL_FUNC(gtk_widget_destroy),
                              GTK_OBJECT(window));
    gtk_container_add(GTK_CONTAINER(hbox), button);
    gtk_widget_show(button);

    button = gtk_button_new_with_label("Cancel");
    gtk_signal_connect(GTK_OBJECT(button), "clicked",
                       GTK_SIGNAL_FUNC(add_new_cancel), &iRet);
    gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
                              GTK_SIGNAL_FUNC(gtk_widget_destroy),
                              GTK_OBJECT(window));
    gtk_container_add(GTK_CONTAINER(hbox), button);
    gtk_widget_show(button);

    gtk_widget_show(window);

    gtk_main();

    if (iRet != 1)
        return;

    if (!url.size() || !title.size())
        return;

    PlaylistItem *newitem = new PlaylistItem;
    MetaData metadata;

    newitem->SetURL(url);
    metadata.SetTitle(title);
    newitem->SetMetaData(&metadata);

    m_context->catalog->WriteMetaDataToDatabase(newitem->URL().c_str(),
                                                newitem->GetMetaData(),
                                                kTypeStream);
    m_context->catalog->AddStream(newitem->URL().c_str());
}

void GTKMusicBrowser::UpdateCD(void)
{
    m_context->player->UpdateCDNow();
}

void GTKMusicBrowser::EjectCD(void)
{
#ifndef NO_CDAUDIO
    Registry *pmoRegistry = m_context->player->GetPMORegistry();
    RegistryItem *pmo_item = NULL;
    int32 i = 0;

    while (NULL != (pmo_item = pmoRegistry->GetItem(i++))) {
        if (!strcmp("cd.pmo", pmo_item->Name())) {
            break;
        }
    }

    if (!pmo_item)
        return;

    PhysicalMediaOutput *pmo;
    pmo = (PhysicalMediaOutput *)pmo_item->InitFunction()(m_context);
    pmo->SetPropManager((Properties *)(m_context->player));

    pmo->Init(NULL);
    ((CDPMO*)pmo)->Eject();

    delete pmo;
#endif
}

void GTKMusicBrowser::PlayMenu()
{
    if (pauseState)
        m_context->target->AcceptEvent(new Event(CMD_Play));
    else
        m_context->target->AcceptEvent(new Event(CMD_Pause));
}

void GTKMusicBrowser::StopMenu()
{
    m_context->target->AcceptEvent(new Event(CMD_Stop));
}

void GTKMusicBrowser::NextMenu(void)
{
    m_context->target->AcceptEvent(new Event(CMD_NextMediaPiece));
}

void GTKMusicBrowser::PrevMenu(void)
{
    m_context->target->AcceptEvent(new Event(CMD_PrevMediaPiece));
}

void GTKMusicBrowser::SetRepeat(int numrepeat)
{
   iSetRepeatMode = true;
   switch(numrepeat) {
       case 0: {
           m_plm->SetRepeatMode(kPlaylistMode_RepeatNone);
           break; }
       case 1: {
           m_plm->SetRepeatMode(kPlaylistMode_RepeatOne);
           break; }
       case 2: {
           m_plm->SetRepeatMode(kPlaylistMode_RepeatAll);
           break; }
   }
}

void GTKMusicBrowser::SetRepeatType(RepeatMode mode)
{
    GtkWidget *w;

    if (mode == kPlaylistMode_RepeatNone)
        w = gtk_item_factory_get_widget(menuFactory,
                                        "/Controls/Repeat No Tracks");
    else if (mode == kPlaylistMode_RepeatOne)
        w = gtk_item_factory_get_widget(menuFactory,
                                        "/Controls/Repeat Current Track");
    else
        w = gtk_item_factory_get_widget(menuFactory, 
                                        "/Controls/Repeat All Tracks");
    if (GTK_IS_CHECK_MENU_ITEM(GTK_OBJECT(w))) 
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), TRUE);
}

void GTKMusicBrowser::SetShuffleType(bool shuffled)
{
    iSetShuffleMode = false;
    GtkWidget *w;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -