diff options
Diffstat (limited to 'vdr_player.c')
| -rw-r--r-- | vdr_player.c | 273 |
1 files changed, 206 insertions, 67 deletions
diff --git a/vdr_player.c b/vdr_player.c index f30a53d..d69897f 100644 --- a/vdr_player.c +++ b/vdr_player.c @@ -199,12 +199,12 @@ public: void ToggleShuffle(void); void ToggleLoop(void); - virtual bool GetIndex(int &Current, int &Total, bool SnapToIFrame=false); + virtual bool getIndex(int &Current, int &Total, bool SnapToIFrame=false); // bool GetPlayInfo(cMP3PlayInfo *rm); // LVW void NewPlaylist( mgPlaylist *plist, int first ); - mgContentItem *GetCurrent () { return m_current; } - mgPlaylist *GetPlaylist () { return m_playlist; } + mgContentItem *getCurrent () { return m_current; } + mgPlaylist *getPlaylist () { return m_playlist; } }; mgPCMPlayer::mgPCMPlayer(mgPlaylist *plist, int first) @@ -868,13 +868,14 @@ void mgPCMPlayer::SkipSeconds(int secs) } } -bool mgPCMPlayer::GetIndex( int ¤t, int &total, bool snaptoiframe ) +bool mgPCMPlayer::getIndex( int ¤t, int &total, bool snaptoiframe ) { - if(m_current) { - current = SecondsToFrames( m_index ); - total = SecondsToFrames( m_current->getLength() ); - return true; - } + if( m_current ) + { + current = SecondsToFrames( m_index ); + total = SecondsToFrames( m_current->getLength() ); + return true; + } return false; } @@ -887,9 +888,12 @@ mgPlayerControl::mgPlayerControl( mgPlaylist *plist, int start ) #if VDRVERSNUM >= 10307 m_display = NULL; + m_menu = NULL; #endif m_visible = false; m_has_osd = false; + m_track_view = true; + m_progress_view = true; m_szLastShowStatusMsg = NULL; @@ -913,8 +917,6 @@ mgPlayerControl::~mgPlayerControl() bool mgPlayerControl::Active(void) { - MGLOG( "mgPlayerControl::Active" ); - return m_player && m_player->Active(); } @@ -999,53 +1001,149 @@ void mgPlayerControl::NewPlaylist(mgPlaylist *plist, int start) } } -void mgPlayerControl::ShowProgress() +void mgPlayerControl::ShowContents() { - StatusMsgReplaying(); +#if VDRVERSNUM >= 10307 + if( !m_menu ) + { + m_menu = Skins.Current()->DisplayMenu(); + } - if( m_visible ) + if( m_player && m_menu ) { - if( !m_has_osd ) + int num_items = m_menu->MaxItems(); + + if( m_track_view ) { - // open the osd if its not already there... -#if VDRVERSNUM >= 10307 - /* - osd = cOsdProvider::NewOsd (Setup.OSDLeft, Setup.OSDTop); - tArea Areas[] = { { 0, 0, Setup.OSDWidth, Setup.OSDHeight, 2 } }; - osd->SetAreas(Areas,sizeof(Areas)/sizeof(tArea)); - font = cFont::GetFont (fontOsd); - */ -#else - Interface->Open(); -#endif - m_has_osd = true; + m_menu->Clear(); + m_menu->SetTitle( "Track info view" ); + + m_menu->SetTabs( 15 ); + + char *buf; + if( num_items > 0 ) + { + asprintf( &buf, "Title:\t%s", m_player->getCurrent()->getLabel(0).c_str() ); + m_menu->SetItem( buf, 0, false, false ); + free( buf ); + } + if( num_items > 1 ) + { + asprintf( &buf, "Artist:\t%s", m_player->getCurrent()->getLabel(1).c_str() ); + m_menu->SetItem( buf, 1, false, false ); + free( buf ); + } + if( num_items > 2 ) + { + asprintf( &buf, "Album:\t%s", m_player->getCurrent()->getLabel(2).c_str() ); + m_menu->SetItem( buf, 2, false, false ); + free( buf ); + } + if( num_items > 3 ) + { + asprintf( &buf, "Genre:\t%s", m_player->getCurrent()->getLabel(3).c_str() ); + m_menu->SetItem( buf, 3, false, false ); + free( buf ); + } + if( num_items > 4 ) + { + int len = m_player->getCurrent()->getLength(); + asprintf( &buf, "Length:\t%s", IndexToHMSF( SecondsToFrames( len ) ) ); + m_menu->SetItem( buf, 4, false, false ); + free( buf ); + } + if( num_items > 5 ) + { + asprintf( &buf, "Bit rate:\t%s", m_player->getCurrent()->getBitrate().c_str() ); + m_menu->SetItem( buf, 5, false, false ); + free( buf ); + } + if( num_items > 6 ) + { + int sr = m_player->getCurrent()->getSampleRate(); + + asprintf( &buf, "Sampling rate:\t%d", sr ); + m_menu->SetItem( buf, 6, false, false ); + free( buf ); + } } + else + { + mgPlaylist *list = m_player->getPlaylist(); + if( list ) + { + // use items for playlist tag display + m_menu->Clear(); + m_menu->SetTitle( "Playlist info view" ); + + int cur = list->getIndex(); + + char *buf; + for( int i=0; i < num_items; i ++ ) + { + mgContentItem *item = list->getItem( cur-3+i ); + if( item->isValid() ) + { + asprintf( &buf, "%s\t%s", item->getLabel(0).c_str(), item->getLabel(1).c_str() ); + if( i < 3 ) + { // already played + m_menu->SetItem( buf, i, false, false ); + } + if( i > 3 ) + { // to be played + m_menu->SetItem( buf, i, false, true ); + } + if( i == 3 ) + { + m_menu->SetItem( buf, i, true, true ); + } + free( buf ); + } + } + } + } + } +#endif +} + +void mgPlayerControl::ShowProgress() +{ + if( m_player ) + { + char *buf; + bool play = true, forward = true; + int speed = -1; + + int current_frame, total_frames; + m_player->getIndex( current_frame, total_frames ); - // now an osd is open, go on - + if( !m_track_view ) + { // playlist stuff + mgPlaylist *list = m_player->getPlaylist(); + if( list ) + { + total_frames = SecondsToFrames( list->getLength() ); + current_frame += SecondsToFrames( list->getCompletedLength() ); + asprintf( &buf, "Playlist %s (%d/%d)", list->getListname().c_str(), list->getIndex()+1, list->getNumItems() ); + } + } + else + { // track view + asprintf( &buf, "%s: %s", m_player->getCurrent()->getLabel(1).c_str(), m_player->getCurrent()->getTitle().c_str() ); + } + #if VDRVERSNUM >= 10307 if( !m_display ) { m_display = Skins.Current()->DisplayReplay(false); } - if( m_player && m_display ) + if( m_display ) { - int current_frame, total_frames; - m_player->GetIndex( current_frame, total_frames ); - m_display->SetProgress( current_frame, total_frames ); m_display->SetCurrent( IndexToHMSF( current_frame ) ); - m_display->SetTotal( IndexToHMSF( total_frames ) ); - - char *buf; - asprintf( &buf, "%s", m_player->GetCurrent()->getTitle().c_str() ); + m_display->SetTotal( IndexToHMSF( total_frames ) ); m_display->SetTitle( buf ); - // free( buf ); - - bool play = true, forward = true; - int speed = -1; m_display->SetMode( play, forward, speed ); - m_display->Flush(); } #else @@ -1053,12 +1151,48 @@ void mgPlayerControl::ShowProgress() int h = Interface->Height(); Interface->WriteText( w/2, h/2, "Muggle is active!" ); - - // Add: song info (name, artist, pos in playlist, time, ...) - // Add: progress bar - Interface->Flush(); #endif + free( buf ); + } +} + +void mgPlayerControl::Display() +{ + StatusMsgReplaying(); + + if( m_visible ) + { + if( !m_has_osd ) + { + // open the osd if its not already there... +#if VDRVERSNUM >= 10307 +#else + Interface->Open(); +#endif + m_has_osd = true; + } + + // now an osd is open, go on + + if( m_progress_view ) + { + if( m_menu ) + { + delete m_menu; + m_menu = NULL; + } + ShowProgress(); + } + else + { + if( m_display ) + { + delete m_display; + m_display = NULL; + } + ShowContents(); + } } else { @@ -1079,15 +1213,16 @@ void mgPlayerControl::InternalHide() if( m_has_osd ) { #if VDRVERSNUM >= 10307 - /* - osd->Flush(); - delete osd; - */ if( m_display ) { delete m_display; m_display = NULL; } + if( m_menu ) + { + delete m_menu; + m_menu = NULL; + } #else Interface->Close(); #endif @@ -1102,7 +1237,7 @@ eOSState mgPlayerControl::ProcessKey(eKeys key) return osEnd; } - ShowProgress(); + Display(); eOSState state = cControl::ProcessKey(key); @@ -1122,7 +1257,7 @@ eOSState mgPlayerControl::ProcessKey(eKeys key) { if( !m_visible && m_player ) { - mgPlaylist *pl = m_player->GetPlaylist(); + mgPlaylist *pl = m_player->getPlaylist(); std::string s; switch( pl->toggleLoopMode() ) @@ -1155,13 +1290,15 @@ eOSState mgPlayerControl::ProcessKey(eKeys key) else { // toggle progress display between simple and detail + m_progress_view = !m_progress_view; + Display(); } } break; case kGreen: { if( !m_visible && m_player ) { - mgPlaylist *pl = m_player->GetPlaylist(); + mgPlaylist *pl = m_player->getPlaylist(); std::string s; switch( pl->toggleShuffleMode() ) @@ -1193,7 +1330,9 @@ eOSState mgPlayerControl::ProcessKey(eKeys key) } else { - // toggle progress display between playlist and single track + // toggle progress display between playlist and track + m_track_view = !m_track_view; + Display(); } } break; case kPause: @@ -1212,7 +1351,7 @@ eOSState mgPlayerControl::ProcessKey(eKeys key) case kOk: { m_visible = !m_visible; - ShowProgress(); + Display(); return osContinue; } break; @@ -1236,28 +1375,28 @@ void mgPlayerControl::StatusMsgReplaying() { char *szBuf=NULL; if(m_player - && m_player->GetCurrent() - && m_player->GetCurrent()->isValid() - && m_player->GetCurrent()->getContentType() == mgContentItem::GD_AUDIO - && m_player->GetPlaylist()) + && m_player->getCurrent() + && m_player->getCurrent()->isValid() + && m_player->getCurrent()->getContentType() == mgContentItem::GD_AUDIO + && m_player->getPlaylist()) { /* - if(m_player->GetCurrent()->getAlbum().length() > 0) + if(m_player->getCurrent()->getAlbum().length() > 0) { asprintf(&szBuf,"[%c%c] (%d/%d) %s - %s", - m_player->GetPlaylist()->isLoop()?'L':'.', - m_player->GetPlaylist()->isShuffle()'S':'.', - m_player->GetPlaylist()->getIndex() + 1,m_player->GetPlaylist()->getCount(), - m_player->GetCurrent()->getTitle().c_str(), - m_player->GetCurrent()->getAlbum().c_str()); + m_player->getPlaylist()->isLoop()?'L':'.', + m_player->getPlaylist()->isShuffle()'S':'.', + m_player->getPlaylist()->getIndex() + 1,m_player->getPlaylist()->getCount(), + m_player->getCurrent()->getTitle().c_str(), + m_player->getCurrent()->getAlbum().c_str()); } else */ { asprintf(&szBuf,"[%c%c] (%d/%d) %s", /* TODO m_player->GetPlaylist()->isLoop()?'L':*/'.', /* TODO m_player->GetPlaylist()->isShuffle()'S':*/'.', - m_player->GetPlaylist()->getIndex() + 1,m_player->GetPlaylist()->getCount(), - m_player->GetCurrent()->getTitle().c_str()); + m_player->getPlaylist()->getIndex() + 1,m_player->getPlaylist()->getNumItems(), + m_player->getCurrent()->getTitle().c_str()); } } else |
