Ticket #341: decoder-refactor.patch
File decoder-refactor.patch, 14.1 KB (added by , 18 years ago) |
---|
-
mythplugins/mythmusic/mythmusic/decoder.h
8 8 #include <qptrlist.h> 9 9 10 10 class Metadata; 11 class MetaIO; 11 12 class Decoder; 12 13 class DecoderFactory; 13 14 … … 79 80 static Decoder *create(const QString &, QIODevice *, AudioOutput *, 80 81 bool = FALSE); 81 82 82 virtual Metadata *getMetadata() = 0; 83 virtual void commitMetadata(Metadata *mdata) = 0; 83 /** \brief Read the metadata from \p filename directly. 84 85 Creates a \p MetaIO object using \p Decoder::doCreateTagger and uses 86 the MetaIO object to read the metadata. 87 88 \returns an instance of \p Metadata owned by the caller 89 */ 90 virtual Metadata *readMetadata(); 84 91 92 /** \brief Get the metadata for \p filename 93 94 First tries to read the metadata from the database. If there 95 is no database entry, it'll call \p Decoder::readMetadata. 96 97 \returns an instance of \p Metadata owned by the caller 98 */ 99 virtual Metadata *getMetadata(); 100 101 /** \brief Create a \p MetaIO object for the format. 102 103 This method should be overwritten by subclasses to return an 104 instance of the appropriate MetaIO subtype. It is used by \p 105 Decoder::getMetadata, \p Decoder::readMetadata and \p 106 Decoder::commitMetadata. 107 108 The default implementation returns a NULL pointer, which 109 essentially means, that if the decoder does not overrider this 110 method or all of the users (see previous paragraph), files 111 that the decoder supports cannot be indexed using metadata in 112 the file. 113 114 Eg. the mp3 decoder (\p MadDecoder) implements this, whereas 115 the audio CD decoder (\p CdDecoder) does not. 116 117 \returns an instance of \p MetaIO owned by the caller 118 */ 119 virtual MetaIO *doCreateTagger (); 120 121 /** \brief Write the given metadata to the \p filename. 122 123 Creates a \p MetaIO object using \p Decoder::doCreateTagger and 124 asks the MetaIO object to write the contents of mdata to \p 125 filename. 126 127 \params mdata the metadata to write to the disk 128 */ 129 virtual void commitMetadata(Metadata *mdata); 130 85 131 static void SetLocationFormatUseTags(void); 86 132 87 133 QString getFilename(void) { return filename; } -
mythplugins/mythmusic/mythmusic/aacdecoder.cpp
614 614 deinit(); 615 615 } 616 616 617 Meta data* aacDecoder::getMetadata()617 MetaIO* aacDecoder::doCreateTagger() 618 618 { 619 620 Metadata *mdata = new Metadata(filename); 621 if (mdata->isInDatabase(musiclocation)) 622 { 623 return mdata; 624 } 625 626 delete mdata; 627 628 MetaIOMP4* p_tagger = new MetaIOMP4; 629 if (ignore_id3) { 630 mdata = p_tagger->readFromFilename(filename); 631 } else { 632 mdata = p_tagger->read(filename); 633 } 634 635 delete p_tagger; 636 637 if (mdata) 638 mdata->dumpToDatabase(musiclocation); 639 else 640 error(QString("aacdecoder.o: Could not read metadata from \"%1\"").arg(filename.local8Bit())); 641 642 return mdata; 643 } 644 645 void aacDecoder::commitMetadata(Metadata *mdata) 646 { 647 MetaIOMP4* p_tagger = new MetaIOMP4; 648 p_tagger->write(mdata); 649 delete p_tagger; 619 return new MetaIOMP4; 650 620 } 651 621 652 622 uint32_t aacDecoder::aacRead(char *buffer, uint32_t length) -
mythplugins/mythmusic/mythmusic/decoder.cpp
6 6 7 7 #include "decoder.h" 8 8 #include "constants.h" 9 #include "metadata.h" 10 #include "metaio.h" 9 11 #include <mythtv/output.h> 10 12 #include <mythtv/visual.h> 11 13 … … 87 89 listeners.remove(object); 88 90 } 89 91 92 Metadata *Decoder::readMetadata () { 93 Metadata *mdata = NULL; 94 MetaIO* p_tagger = doCreateTagger (); 90 95 96 if (p_tagger) { 97 if (ignore_id3) 98 mdata = p_tagger->readFromFilename(filename); 99 else 100 mdata = p_tagger->read(filename); 101 102 delete p_tagger; 103 } else { 104 if (!mdata) 105 cerr << "maddecoder.o: Could not read metadata from " << filename.local8Bit() << endl; 106 } 107 108 return mdata; 109 } 110 111 Metadata* Decoder::getMetadata() 112 { 113 114 Metadata *mdata = new Metadata(filename); 115 if (mdata->isInDatabase(musiclocation)) 116 { 117 return mdata; 118 } 119 120 delete mdata; 121 122 return readMetadata (); 123 } 124 125 void Decoder::commitMetadata(Metadata *mdata) 126 { 127 MetaIO* p_tagger = doCreateTagger (); 128 if (p_tagger) { 129 p_tagger->write(mdata); 130 delete p_tagger; 131 } 132 } 133 134 MetaIO *Decoder::doCreateTagger () { 135 return NULL; 136 } 137 91 138 // static methods 92 139 93 140 int Decoder::ignore_id3 = 0; -
mythplugins/mythmusic/mythmusic/aacdecoder.h
29 29 void seek(double); 30 30 void stop(); 31 31 32 Metadata *getMetadata(); 33 void commitMetadata(Metadata *mdata); 32 MetaIO *doCreateTagger(); 34 33 35 34 bool initializeMP4(); 36 35 int getAACTrack(mp4ff_t *infile); -
mythplugins/mythmusic/mythmusic/vorbisdecoder.cpp
293 293 deinit(); 294 294 } 295 295 296 Meta data *VorbisDecoder::getMetadata()296 MetaIO *VorbisDecoder::doCreateTagger() 297 297 { 298 Metadata *mdata = new Metadata(filename); 299 if (mdata->isInDatabase(musiclocation)) 300 { 301 return mdata; 302 } 303 304 delete mdata; 305 306 307 MetaIOOggVorbisComment* p_tagger = new MetaIOOggVorbisComment; 308 if (ignore_id3) 309 mdata = p_tagger->readFromFilename(filename); 310 else 311 mdata = p_tagger->read(filename); 312 313 delete p_tagger; 314 315 if (mdata) 316 mdata->dumpToDatabase(musiclocation); 317 else 318 cerr << "vorbisdecoder.o: Could not read metadata from " << filename.local8Bit() << endl; 319 320 return mdata; 321 } 322 323 void VorbisDecoder::commitMetadata(Metadata *mdata) 324 { 325 MetaIOOggVorbisComment* p_tagger = new MetaIOOggVorbisComment; 326 p_tagger->write(mdata); 327 delete p_tagger; 298 return new MetaIOOggVorbisComment; 328 299 } 329 300 330 301 -
mythplugins/mythmusic/mythmusic/flacdecoder.h
22 22 void doWrite(const FLAC__Frame *frame, const FLAC__int32 * const buffer[]); 23 23 void setFlacMetadata(const FLAC__StreamMetadata *metadata); 24 24 25 Metadata *getMetadata(); 26 void commitMetadata(Metadata *mdata); 25 MetaIO *doCreateTagger(); 27 26 28 27 private: 29 28 void run(); -
mythplugins/mythmusic/mythmusic/avfdecoder.cpp
357 357 deinit(); 358 358 } 359 359 360 Meta data* avfDecoder::getMetadata()360 MetaIO* avfDecoder::doCreateTagger() 361 361 { 362 Metadata *mdata = new Metadata(filename); 363 if (mdata->isInDatabase(musiclocation)) 364 { 365 return mdata; 366 } 367 368 delete mdata; 369 370 371 MetaIOAVFComment* p_tagger = new MetaIOAVFComment; 372 if (ignore_id3) 373 mdata = p_tagger->readFromFilename(filename); 374 else 375 mdata = p_tagger->read(filename); 376 377 delete p_tagger; 378 379 if (mdata) 380 mdata->dumpToDatabase(musiclocation); 381 else 382 cerr << "avfdecoder.o: Could not read metadata from " << filename << endl; 383 384 return mdata; 362 return new MetaIOAVFComment; 385 363 } 386 364 387 void avfDecoder::commitMetadata(Metadata *mdata)388 {389 MetaIOAVFComment* p_tagger = new MetaIOAVFComment;390 p_tagger->write(mdata);391 delete p_tagger;392 }393 394 365 bool avfDecoderFactory::supports(const QString &source) const 395 366 { 396 367 return (source.right(extension().length()).lower() == extension()); -
mythplugins/mythmusic/mythmusic/main.cpp
65 65 return decoder; 66 66 } 67 67 68 void CheckFile(const QString &filename)68 void AddFileToDB(const QString &directory, const QString &filename) 69 69 { 70 70 Decoder *decoder = getDecoder(filename); 71 71 72 72 if (decoder) 73 73 { 74 74 Metadata *data = decoder->getMetadata(); 75 if (data) 75 if (data) { 76 data->dumpToDatabase(directory); 76 77 delete data; 78 } 77 79 78 80 delete decoder; 79 81 } 80 82 } 81 83 84 // Remove a file from the database 85 void RemoveFileFromDB (const QString &directory, const QString &filename) 86 { 87 QString name(filename); 88 name.remove(0, directory.length()); 89 MSqlQuery query(MSqlQuery::InitCon()); 90 query.prepare("DELETE FROM musicmetadata WHERE " 91 "filename = :NAME ;"); 92 query.bindValue(":NAME", name.utf8()); 93 query.exec(); 94 } 95 82 96 enum MusicFileLocation 83 97 { 84 98 kFileSystem, … … 215 229 for (iter = music_files.begin(); iter != music_files.end(); iter++) 216 230 { 217 231 if (*iter == kFileSystem) 218 { 219 CheckFile(iter.key()); 220 } 232 AddFileToDB(directory, iter.key()); 221 233 else if (*iter == kDatabase) 222 { 223 QString name(iter.key()); 224 name.remove(0, directory.length()); 234 RemoveFileFromDB(directory, iter.key ()); 225 235 226 query.prepare("DELETE FROM musicmetadata WHERE "227 "filename = :NAME ;");228 query.bindValue(":NAME", name.utf8());229 query.exec();230 }231 232 236 file_checking->setProgress(++counter); 233 237 } 234 238 file_checking->Close(); -
mythplugins/mythmusic/mythmusic/flacdecoder.cpp
385 385 char *field_value; 386 386 } Argument_VcField; 387 387 388 Meta data *FlacDecoder::getMetadata()388 MetaIO *FlacDecoder::doCreateTagger() 389 389 { 390 Metadata *mdata = new Metadata(filename); 391 if (mdata->isInDatabase(musiclocation)) 392 { 393 return mdata; 394 } 390 return new MetaIOFLACVorbisComment; 391 } 395 392 396 delete mdata;397 393 398 MetaIOFLACVorbisComment* p_tagger = new MetaIOFLACVorbisComment;399 if (ignore_id3)400 mdata = p_tagger->readFromFilename(filename);401 else402 mdata = p_tagger->read(filename);403 404 delete p_tagger;405 406 if (mdata)407 mdata->dumpToDatabase(musiclocation);408 else409 cerr << "flacdecoder.o: Could not read metadata from " << filename.local8Bit() << endl;410 411 return mdata;412 }413 414 void FlacDecoder::commitMetadata(Metadata *mdata)415 {416 MetaIOFLACVorbisComment* p_tagger = new MetaIOFLACVorbisComment;417 p_tagger->write(mdata);418 delete p_tagger;419 }420 421 422 394 bool FlacDecoderFactory::supports(const QString &source) const 423 395 { 424 396 return (source.right(extension().length()).lower() == extension()); -
mythplugins/mythmusic/mythmusic/maddecoder.h
24 24 static const int maxFrameCheck; 25 25 static const int initialFrameSize; 26 26 27 Metadata *getMetadata(); 28 void commitMetadata(Metadata *mdata); 27 MetaIO *doCreateTagger(); 29 28 30 29 private: 31 30 void run(); -
mythplugins/mythmusic/mythmusic/vorbisdecoder.h
18 18 void seek(double); 19 19 void stop(); 20 20 21 Metadata *getMetadata(); 22 void commitMetadata(Metadata *mdata); 21 MetaIO *doCreateTagger(); 23 22 24 23 private: 25 24 void run(); -
mythplugins/mythmusic/mythmusic/avfdecoder.h
18 18 void seek(double); 19 19 void stop(); 20 20 21 Metadata *getMetadata(); 22 void commitMetadata(Metadata *mdata); 21 MetaIO *doCreateTagger(); 23 22 24 23 private: 25 24 void run(); -
mythplugins/mythmusic/mythmusic/maddecoder.cpp
512 512 return MAD_FLOW_STOP; 513 513 } 514 514 515 Meta data *MadDecoder::getMetadata()515 MetaIO *MadDecoder::doCreateTagger() 516 516 { 517 Metadata *mdata = new Metadata(filename); 518 if (mdata->isInDatabase(musiclocation)) 519 { 520 return mdata; 521 } 522 523 delete mdata; 524 525 526 MetaIOID3v2* p_tagger = new MetaIOID3v2; 527 if (ignore_id3) 528 mdata = p_tagger->readFromFilename(filename); 529 else 530 mdata = p_tagger->read(filename); 531 532 delete p_tagger; 533 534 if (mdata) 535 mdata->dumpToDatabase(musiclocation); 536 else 537 cerr << "maddecoder.o: Could not read metadata from " << filename.local8Bit() << endl; 538 539 return mdata; 517 return new MetaIOID3v2; 540 518 } 541 519 542 void MadDecoder::commitMetadata(Metadata *mdata)543 {544 MetaIOID3v2* p_tagger = new MetaIOID3v2;545 p_tagger->write(mdata);546 delete p_tagger;547 }548 549 520 bool MadDecoderFactory::supports(const QString &source) const 550 521 { 551 522 bool res = false;