diff options
| author | LarsAC <LarsAC@e10066b5-e1e2-0310-b819-94efdf66514b> | 2005-10-09 11:05:01 +0000 |
|---|---|---|
| committer | LarsAC <LarsAC@e10066b5-e1e2-0310-b819-94efdf66514b> | 2005-10-09 11:05:01 +0000 |
| commit | c0e5840cbe5d9099d3f3a88b92c20d5100b91db2 (patch) | |
| tree | 37b89837d6cbffef7ea229e56784b15cd35084fd | |
| parent | 2b11e1237021b24a19ad765666ed9b51285b359c (diff) | |
| download | vdr-plugin-muggle-c0e5840cbe5d9099d3f3a88b92c20d5100b91db2.tar.gz vdr-plugin-muggle-c0e5840cbe5d9099d3f3a88b92c20d5100b91db2.tar.bz2 | |
Remove several bugs in image display code
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/trunk/muggle-plugin@878 e10066b5-e1e2-0310-b819-94efdf66514b
| -rw-r--r-- | mg_image_provider.c | 95 | ||||
| -rw-r--r-- | mg_image_provider.h | 13 | ||||
| -rw-r--r-- | vdr_player.c | 12 |
3 files changed, 62 insertions, 58 deletions
diff --git a/mg_image_provider.c b/mg_image_provider.c index 7b46d52..a9418f3 100644 --- a/mg_image_provider.c +++ b/mg_image_provider.c @@ -95,6 +95,11 @@ mgImageProvider::mgImageProvider( ) mgImageProvider::~mgImageProvider() { + deleteTemporaryImages(); +} + +void mgImageProvider::deleteTemporaryImages() +{ if( m_delete_imgs_from_tag ) { for( vector<string>::iterator iter = m_image_list.begin(); iter != m_image_list.end(); iter ++ ) @@ -104,12 +109,14 @@ mgImageProvider::~mgImageProvider() } m_delete_imgs_from_tag = false; } - + m_image_list.clear(); + for( vector<string>::iterator iter = m_converted_images.begin(); iter != m_converted_images.end(); iter ++ ) { // remove( (*iter).c_str() ); cout << "Removing " << *iter << endl; } + m_converted_images.clear(); } mgImageProvider* mgImageProvider::Create( string dir ) @@ -122,6 +129,31 @@ mgImageProvider* mgImageProvider::Create( ) return new mgImageProvider(); } +void mgImageProvider::updateFromItemDirectory( mgItemGd *item ) +{ + // no images in tags, find images in the directory of the file itself + string dir = dirname( (char *) (item->getSourceFile().c_str()) ); + + // do something, when there are no images here, either: + // simply go up one step in the directory hierarchy, until we reach top level directory + bool toplevel_reached = false; + while( !m_image_list.size() && !toplevel_reached ) + { + if( samedir( dir.c_str(), the_setup.ToplevelDir ) ) + { + toplevel_reached = true; + } + + fillImageList( dir ); + + if( !m_image_list.size() ) + { + // nothing found, turn up one directory level + dir = dirname( (char *)dir.c_str() ); + } + } +} + bool mgImageProvider::updateItem( mgItemGd *item ) { // clean up stuff from previous item ? @@ -129,69 +161,24 @@ bool mgImageProvider::updateItem( mgItemGd *item ) string filename = item->getSourceFile(); if( m_mode == IM_ITEM_DIR ) - { - // do not try to acquire new images when we are playing back a separate directory - - if( m_delete_imgs_from_tag ) - { - for( vector<string>::iterator iter = m_image_list.begin(); iter != m_image_list.end(); iter ++ ) - { - // remove( (*iter).c_str() ); - cout << "Removing " << *iter << endl; - } - m_delete_imgs_from_tag = false; - } - m_image_list.clear(); - - for( vector<string>::iterator iter = m_converted_images.begin(); iter != m_converted_images.end(); iter ++ ) - { - // remove( (*iter).c_str() ); - cout << "Removing " << *iter << endl; - } - m_converted_images.clear(); - // clear temporary image directory + { // do not try to acquire new images when we are playing back a separate directory + deleteTemporaryImages(); // check whether the item has cover images in tags? string dir = extractImagesFromTag( filename ); + if( dir == "" ) { - // no images in tags, find images in the directory of the file itself - dir = dirname( (char *) (item->getSourceFile().c_str()) ); - cout << "No images in tags. Looking in " << dir << endl; - - // do something, when there are no images here, either: - // simply go up one step in the directory hierarchy, until we reach top level directory - bool toplevel_reached = false; - while( !m_image_list.size() ) - { - if( samedir( dir.c_str(), the_setup.ToplevelDir ) ) - { - cout << "Toplevel reached at " << dir << endl; - toplevel_reached = true; - } - - fillImageList( dir ); - cout << "Images in " << dir << ": " << m_image_list.size() << endl; - - if( !m_image_list.size() ) - { - cout << "Nothing found in " << dir << endl; - - // nothing found, turn up one directory level - dir = dirname( (char *)dir.c_str() ); - cout << "Looking further in " << dir << endl; - } - } - cout << "Finished." << endl; + updateFromItemDirectory( item ); } else { fillImageList( dir ); } - // start a thread to convert all images in 'dir into .mpg format in the background + // start a thread to convert all images in 'dir' into .mpg format in the background Start(); - + m_image_index = 0; } // else: nothing todo when changing the item currently being played @@ -227,7 +214,7 @@ void mgImageProvider::Action() // assemble path from relative paths string tmpFile = string( the_setup.ImageCacheDir ) + string( "/" ) + bname.substr( 0, dotpos ) + string( ".mpg" ); - cout << "Converting " << filename << " to " << tmpFile << endl << flush; + // cout << "Converting " << filename << " to " << tmpFile << endl << flush; char *tmp; asprintf( &tmp, "image_convert.sh \"%s\" \"%s\"", filename.c_str(), tmpFile.c_str() ); @@ -245,7 +232,7 @@ void mgImageProvider::Action() // Check whether we need to continue this!? Next song may be playing already... } - cout << "Image conversion thread ending." << endl << flush; + // cout << "Image conversion thread ending." << endl << flush; } void mgImageProvider::fillImageList( string dir ) diff --git a/mg_image_provider.h b/mg_image_provider.h index c5526bb..be6893a 100644 --- a/mg_image_provider.h +++ b/mg_image_provider.h @@ -54,13 +54,26 @@ class mgImageProvider : public cThread */ void fillImageList( std::string dir ); + /*! \brief find images for an item + */ + void updateFromItemDirectory( mgItemGd *item ); + + /*! \brief write image from an id3v2 frame to a file + */ void writeImage( TagLib::ByteVector &image, int num, std::string &image_cache ); + + /*! \brief convert all images found in the APIC frame list + */ std::string treatFrameList( TagLib::ID3v2::FrameList &l, std::string &image_cache ); /*! \brief save images from APIC tag and save to file. returns directory where images were saved or empty string if no images were found in the APIC tag */ std::string extractImagesFromTag( std::string filename ); + /*! \brief delete temporary images + */ + void deleteTemporaryImages(); + //! \brief define various modes how images can be obtained enum ImageMode { diff --git a/vdr_player.c b/vdr_player.c index 45099ff..6b178df 100644 --- a/vdr_player.c +++ b/vdr_player.c @@ -274,6 +274,12 @@ mgPCMPlayer::~mgPCMPlayer () Detach (); delete m_playlist; delete m_ringbuffer; + + if( m_img_provider ) + { + delete m_img_provider; + m_img_provider = NULL; + } } void @@ -363,6 +369,7 @@ mgPCMPlayer::NewImagePlaylist( const char *directory ) if( m_img_provider ) { delete m_img_provider; + m_img_provider = NULL; } m_img_provider = mgImageProvider::Create( directory ); m_hasimages = true; // assume we have some images here! @@ -468,6 +475,7 @@ mgPCMPlayer::Action (void) if( m_img_provider && the_setup.BackgrMode == 1 ) { m_hasimages = m_img_provider->updateItem( m_current ); + cout << "Image provider returns " << m_hasimages << endl; m_lastshow = -1; // never showed a picture during this song replay } @@ -683,10 +691,6 @@ mgPCMPlayer::Action (void) case msStop: { m_playing = false; - if( m_img_provider ) - { - delete m_img_provider; - } if (m_decoder) { // who deletes decoder? |
