From 551d389d3bc4d229df604c131376b3b3532ca3b0 Mon Sep 17 00:00:00 2001 From: olf Date: Tue, 5 Dec 2023 19:22:46 +0100 Subject: [PATCH 1/3] Delete src/taglib directory Obsoleted by PR #19 by @dcaliste --- src/taglib/AUTHORS | 17 - src/taglib/CMakeLists.txt | 120 - src/taglib/COPYING.LGPL | 502 ---- src/taglib/COPYING.MPL | 470 ---- src/taglib/ConfigureChecks.cmake | 226 -- src/taglib/Doxyfile.cmake | 210 -- src/taglib/INSTALL | 157 -- src/taglib/NEWS | 189 -- src/taglib/bindings/CMakeLists.txt | 1 - src/taglib/bindings/README | 6 - src/taglib/bindings/c/CMakeLists.txt | 68 - src/taglib/bindings/c/tag_c.cpp | 290 --- src/taglib/bindings/c/tag_c.h | 299 --- src/taglib/bindings/c/taglib_c.pc.cmake | 12 - src/taglib/cmake/modules/FindCppUnit.cmake | 69 - .../cmake/modules/MacroEnsureVersion.cmake | 71 - src/taglib/cmake_uninstall.cmake.in | 21 - src/taglib/config.h.cmake | 37 - src/taglib/doc/README | 1 - src/taglib/doc/api-footer.html | 4 - src/taglib/doc/api-header.html | 41 - src/taglib/doc/taglib-api.css | 395 ---- src/taglib/doc/taglib.png | Bin 2748 -> 0 bytes src/taglib/examples/CMakeLists.txt | 50 - src/taglib/examples/framelist.cpp | 109 - src/taglib/examples/strip-id3v1.cpp | 40 - src/taglib/examples/tagreader.cpp | 96 - src/taglib/examples/tagreader_c.c | 81 - src/taglib/examples/tagwriter.cpp | 139 -- src/taglib/taglib-config.cmake | 55 - src/taglib/taglib-config.cmd.cmake | 36 - src/taglib/taglib.pc.cmake | 11 - src/taglib/taglib/CMakeLists.txt | 335 --- src/taglib/taglib/ape/ape-tag-format.txt | 170 -- src/taglib/taglib/ape/apefile.cpp | 314 --- src/taglib/taglib/ape/apefile.h | 229 -- src/taglib/taglib/ape/apefooter.cpp | 236 -- src/taglib/taglib/ape/apefooter.h | 173 -- src/taglib/taglib/ape/apeitem.cpp | 286 --- src/taglib/taglib/ape/apeitem.h | 219 -- src/taglib/taglib/ape/apeproperties.cpp | 232 -- src/taglib/taglib/ape/apeproperties.h | 99 - src/taglib/taglib/ape/apetag.cpp | 383 ---- src/taglib/taglib/ape/apetag.h | 208 -- src/taglib/taglib/asf/asfattribute.cpp | 350 --- src/taglib/taglib/asf/asfattribute.h | 203 -- src/taglib/taglib/asf/asffile.cpp | 630 ----- src/taglib/taglib/asf/asffile.h | 148 -- src/taglib/taglib/asf/asfpicture.cpp | 179 -- src/taglib/taglib/asf/asfpicture.h | 217 -- src/taglib/taglib/asf/asfproperties.cpp | 111 - src/taglib/taglib/asf/asfproperties.h | 76 - src/taglib/taglib/asf/asftag.cpp | 354 --- src/taglib/taglib/asf/asftag.h | 190 -- src/taglib/taglib/audioproperties.cpp | 51 - src/taglib/taglib/audioproperties.h | 110 - src/taglib/taglib/fileref.cpp | 286 --- src/taglib/taglib/fileref.h | 263 --- src/taglib/taglib/flac/flacfile.cpp | 568 ----- src/taglib/taglib/flac/flacfile.h | 305 --- src/taglib/taglib/flac/flacmetadatablock.cpp | 47 - src/taglib/taglib/flac/flacmetadatablock.h | 75 - src/taglib/taglib/flac/flacpicture.cpp | 217 -- src/taglib/taglib/flac/flacpicture.h | 208 -- src/taglib/taglib/flac/flacproperties.cpp | 169 -- src/taglib/taglib/flac/flacproperties.h | 103 - .../taglib/flac/flacunknownmetadatablock.cpp | 79 - .../taglib/flac/flacunknownmetadatablock.h | 81 - src/taglib/taglib/it/itfile.cpp | 330 --- src/taglib/taglib/it/itfile.h | 109 - src/taglib/taglib/it/itproperties.cpp | 245 -- src/taglib/taglib/it/itproperties.h | 101 - src/taglib/taglib/mod/modfile.cpp | 187 -- src/taglib/taglib/mod/modfile.h | 110 - src/taglib/taglib/mod/modfilebase.cpp | 120 - src/taglib/taglib/mod/modfilebase.h | 62 - src/taglib/taglib/mod/modfileprivate.h | 67 - src/taglib/taglib/mod/modproperties.cpp | 96 - src/taglib/taglib/mod/modproperties.h | 65 - src/taglib/taglib/mod/modtag.cpp | 168 -- src/taglib/taglib/mod/modtag.h | 190 -- src/taglib/taglib/mp4/mp4atom.cpp | 194 -- src/taglib/taglib/mp4/mp4atom.h | 111 - src/taglib/taglib/mp4/mp4coverart.cpp | 83 - src/taglib/taglib/mp4/mp4coverart.h | 75 - src/taglib/taglib/mp4/mp4file.cpp | 163 -- src/taglib/taglib/mp4/mp4file.h | 130 -- src/taglib/taglib/mp4/mp4item.cpp | 206 -- src/taglib/taglib/mp4/mp4item.h | 83 - src/taglib/taglib/mp4/mp4properties.cpp | 199 -- src/taglib/taglib/mp4/mp4properties.h | 71 - src/taglib/taglib/mp4/mp4tag.cpp | 917 -------- src/taglib/taglib/mp4/mp4tag.h | 118 - src/taglib/taglib/mpc/mpcfile.cpp | 367 --- src/taglib/taglib/mpc/mpcfile.h | 231 -- src/taglib/taglib/mpc/mpcproperties.cpp | 316 --- src/taglib/taglib/mpc/mpcproperties.h | 122 - src/taglib/taglib/mpeg/id3v1/id3v1genres.cpp | 219 -- src/taglib/taglib/mpeg/id3v1/id3v1genres.h | 66 - src/taglib/taglib/mpeg/id3v1/id3v1tag.cpp | 265 --- src/taglib/taglib/mpeg/id3v1/id3v1tag.h | 202 -- .../id3v2/frames/attachedpictureframe.cpp | 222 -- .../mpeg/id3v2/frames/attachedpictureframe.h | 230 -- .../mpeg/id3v2/frames/commentsframe.cpp | 197 -- .../taglib/mpeg/id3v2/frames/commentsframe.h | 179 -- .../frames/generalencapsulatedobjectframe.cpp | 176 -- .../frames/generalencapsulatedobjectframe.h | 178 -- .../mpeg/id3v2/frames/ownershipframe.cpp | 162 -- .../taglib/mpeg/id3v2/frames/ownershipframe.h | 151 -- .../mpeg/id3v2/frames/popularimeterframe.cpp | 137 -- .../mpeg/id3v2/frames/popularimeterframe.h | 132 -- .../taglib/mpeg/id3v2/frames/privateframe.cpp | 128 -- .../taglib/mpeg/id3v2/frames/privateframe.h | 111 - .../mpeg/id3v2/frames/relativevolumeframe.cpp | 236 -- .../mpeg/id3v2/frames/relativevolumeframe.h | 274 --- .../id3v2/frames/textidentificationframe.cpp | 423 ---- .../id3v2/frames/textidentificationframe.h | 313 --- .../frames/uniquefileidentifierframe.cpp | 148 -- .../id3v2/frames/uniquefileidentifierframe.h | 123 - .../taglib/mpeg/id3v2/frames/unknownframe.cpp | 84 - .../taglib/mpeg/id3v2/frames/unknownframe.h | 79 - .../frames/unsynchronizedlyricsframe.cpp | 193 -- .../id3v2/frames/unsynchronizedlyricsframe.h | 179 -- .../taglib/mpeg/id3v2/frames/urllinkframe.cpp | 230 -- .../taglib/mpeg/id3v2/frames/urllinkframe.h | 189 -- src/taglib/taglib/mpeg/id3v2/id3v2.2.0.txt | 1660 -------------- src/taglib/taglib/mpeg/id3v2/id3v2.3.0.txt | 2022 ----------------- .../taglib/mpeg/id3v2/id3v2.4.0-frames.txt | 1734 -------------- .../taglib/mpeg/id3v2/id3v2.4.0-structure.txt | 733 ------ .../taglib/mpeg/id3v2/id3v2extendedheader.cpp | 71 - .../taglib/mpeg/id3v2/id3v2extendedheader.h | 93 - src/taglib/taglib/mpeg/id3v2/id3v2footer.cpp | 60 - src/taglib/taglib/mpeg/id3v2/id3v2footer.h | 82 - src/taglib/taglib/mpeg/id3v2/id3v2frame.cpp | 844 ------- src/taglib/taglib/mpeg/id3v2/id3v2frame.h | 518 ----- .../taglib/mpeg/id3v2/id3v2framefactory.cpp | 458 ---- .../taglib/mpeg/id3v2/id3v2framefactory.h | 166 -- src/taglib/taglib/mpeg/id3v2/id3v2header.cpp | 243 -- src/taglib/taglib/mpeg/id3v2/id3v2header.h | 175 -- .../taglib/mpeg/id3v2/id3v2synchdata.cpp | 84 - src/taglib/taglib/mpeg/id3v2/id3v2synchdata.h | 70 - src/taglib/taglib/mpeg/id3v2/id3v2tag.cpp | 732 ------ src/taglib/taglib/mpeg/id3v2/id3v2tag.h | 412 ---- src/taglib/taglib/mpeg/mpegfile.cpp | 663 ------ src/taglib/taglib/mpeg/mpegfile.h | 390 ---- src/taglib/taglib/mpeg/mpegheader.cpp | 277 --- src/taglib/taglib/mpeg/mpegheader.h | 166 -- src/taglib/taglib/mpeg/mpegproperties.cpp | 254 --- src/taglib/taglib/mpeg/mpegproperties.h | 118 - src/taglib/taglib/mpeg/xingheader.cpp | 115 - src/taglib/taglib/mpeg/xingheader.h | 100 - src/taglib/taglib/ogg/flac/oggflacfile.cpp | 294 --- src/taglib/taglib/ogg/flac/oggflacfile.h | 162 -- src/taglib/taglib/ogg/oggfile.cpp | 432 ---- src/taglib/taglib/ogg/oggfile.h | 122 - src/taglib/taglib/ogg/oggpage.cpp | 340 --- src/taglib/taglib/ogg/oggpage.h | 211 -- src/taglib/taglib/ogg/oggpageheader.cpp | 323 --- src/taglib/taglib/ogg/oggpageheader.h | 232 -- src/taglib/taglib/ogg/opus/opusfile.cpp | 139 -- src/taglib/taglib/ogg/opus/opusfile.h | 124 - src/taglib/taglib/ogg/opus/opusproperties.cpp | 161 -- src/taglib/taglib/ogg/opus/opusproperties.h | 96 - src/taglib/taglib/ogg/speex/speexfile.cpp | 132 -- src/taglib/taglib/ogg/speex/speexfile.h | 126 - .../taglib/ogg/speex/speexproperties.cpp | 170 -- src/taglib/taglib/ogg/speex/speexproperties.h | 89 - src/taglib/taglib/ogg/vorbis/vorbisfile.cpp | 138 -- src/taglib/taglib/ogg/vorbis/vorbisfile.h | 144 -- .../taglib/ogg/vorbis/vorbisproperties.cpp | 183 -- .../taglib/ogg/vorbis/vorbisproperties.h | 125 - src/taglib/taglib/ogg/xiphcomment.cpp | 382 ---- src/taglib/taglib/ogg/xiphcomment.h | 225 -- src/taglib/taglib/riff/aiff/aifffile.cpp | 144 -- src/taglib/taglib/riff/aiff/aifffile.h | 142 -- .../taglib/riff/aiff/aiffproperties.cpp | 160 -- src/taglib/taglib/riff/aiff/aiffproperties.h | 83 - src/taglib/taglib/riff/rifffile.cpp | 321 --- src/taglib/taglib/riff/rifffile.h | 157 -- src/taglib/taglib/riff/wav/infotag.cpp | 266 --- src/taglib/taglib/riff/wav/infotag.h | 192 -- src/taglib/taglib/riff/wav/wavfile.cpp | 244 -- src/taglib/taglib/riff/wav/wavfile.h | 189 -- src/taglib/taglib/riff/wav/wavproperties.cpp | 129 -- src/taglib/taglib/riff/wav/wavproperties.h | 92 - src/taglib/taglib/s3m/s3mfile.cpp | 243 -- src/taglib/taglib/s3m/s3mfile.h | 108 - src/taglib/taglib/s3m/s3mproperties.cpp | 204 -- src/taglib/taglib/s3m/s3mproperties.h | 88 - src/taglib/taglib/tag.cpp | 180 -- src/taglib/taglib/tag.h | 201 -- src/taglib/taglib/taglib_config.h | 4 - src/taglib/taglib/taglib_export.h | 43 - src/taglib/taglib/tagunion.cpp | 186 -- src/taglib/taglib/tagunion.h | 95 - src/taglib/taglib/toolkit/taglib.h | 170 -- src/taglib/taglib/toolkit/tbytevector.cpp | 857 ------- src/taglib/taglib/toolkit/tbytevector.h | 518 ----- src/taglib/taglib/toolkit/tbytevectorlist.cpp | 102 - src/taglib/taglib/toolkit/tbytevectorlist.h | 91 - .../taglib/toolkit/tbytevectorstream.cpp | 167 -- src/taglib/taglib/toolkit/tbytevectorstream.h | 145 -- src/taglib/taglib/toolkit/tdebug.cpp | 99 - src/taglib/taglib/toolkit/tdebug.h | 62 - src/taglib/taglib/toolkit/tdebuglistener.cpp | 85 - src/taglib/taglib/toolkit/tdebuglistener.h | 74 - src/taglib/taglib/toolkit/tfile.cpp | 503 ---- src/taglib/taglib/toolkit/tfile.h | 306 --- src/taglib/taglib/toolkit/tfilestream.cpp | 492 ---- src/taglib/taglib/toolkit/tfilestream.h | 154 -- src/taglib/taglib/toolkit/tiostream.cpp | 150 -- src/taglib/taglib/toolkit/tiostream.h | 169 -- src/taglib/taglib/toolkit/tlist.h | 257 --- src/taglib/taglib/toolkit/tlist.tcc | 324 --- src/taglib/taglib/toolkit/tmap.h | 199 -- src/taglib/taglib/toolkit/tmap.tcc | 199 -- src/taglib/taglib/toolkit/tpropertymap.cpp | 173 -- src/taglib/taglib/toolkit/tpropertymap.h | 233 -- src/taglib/taglib/toolkit/trefcounter.cpp | 108 - src/taglib/taglib/toolkit/trefcounter.h | 111 - src/taglib/taglib/toolkit/tstring.cpp | 880 ------- src/taglib/taglib/toolkit/tstring.h | 543 ----- src/taglib/taglib/toolkit/tstringlist.cpp | 123 - src/taglib/taglib/toolkit/tstringlist.h | 115 - src/taglib/taglib/toolkit/tutils.h | 190 -- src/taglib/taglib/toolkit/unicode.cpp | 303 --- src/taglib/taglib/toolkit/unicode.h | 154 -- src/taglib/taglib/trueaudio/trueaudiofile.cpp | 325 --- src/taglib/taglib/trueaudio/trueaudiofile.h | 252 -- .../taglib/trueaudio/trueaudioproperties.cpp | 150 -- .../taglib/trueaudio/trueaudioproperties.h | 98 - src/taglib/taglib/wavpack/wavpackfile.cpp | 311 --- src/taglib/taglib/wavpack/wavpackfile.h | 216 -- .../taglib/wavpack/wavpackproperties.cpp | 203 -- src/taglib/taglib/wavpack/wavpackproperties.h | 110 - src/taglib/taglib/xm/xmfile.cpp | 650 ------ src/taglib/taglib/xm/xmfile.h | 108 - src/taglib/taglib/xm/xmproperties.cpp | 180 -- src/taglib/taglib/xm/xmproperties.h | 79 - src/taglib/tests/CMakeLists.txt | 76 - src/taglib/tests/data/005411.id3 | Bin 38402 -> 0 bytes src/taglib/tests/data/64bit.mp4 | Bin 85 -> 0 bytes src/taglib/tests/data/broken-tenc.id3 | Bin 400 -> 0 bytes src/taglib/tests/data/changed.mod | Bin 3132 -> 0 bytes src/taglib/tests/data/changed.s3m | Bin 544 -> 0 bytes src/taglib/tests/data/changed.xm | Bin 5471 -> 0 bytes src/taglib/tests/data/click.mpc | Bin 1588 -> 0 bytes src/taglib/tests/data/click.wv | Bin 3176 -> 0 bytes .../tests/data/compressed_id3_frame.mp3 | Bin 5000 -> 0 bytes .../data/correctness_gain_silent_output.opus | Bin 35506 -> 0 bytes src/taglib/tests/data/covr-junk.m4a | Bin 5108 -> 0 bytes src/taglib/tests/data/empty.aiff | Bin 5936 -> 0 bytes src/taglib/tests/data/empty.ogg | Bin 4328 -> 0 bytes src/taglib/tests/data/empty.spx | Bin 24301 -> 0 bytes src/taglib/tests/data/empty.tta | Bin 79538 -> 0 bytes src/taglib/tests/data/empty.wav | Bin 14744 -> 0 bytes src/taglib/tests/data/empty_alac.m4a | Bin 5380 -> 0 bytes src/taglib/tests/data/empty_flac.oga | Bin 9113 -> 0 bytes src/taglib/tests/data/empty_vorbis.oga | Bin 4328 -> 0 bytes src/taglib/tests/data/gnre.m4a | Bin 5026 -> 0 bytes src/taglib/tests/data/has-tags.m4a | Bin 5108 -> 0 bytes src/taglib/tests/data/id3v22-tda.mp3 | Bin 8192 -> 0 bytes src/taglib/tests/data/ilst-is-last.m4a | Bin 32768 -> 0 bytes src/taglib/tests/data/mac-390-hdr.ape | Bin 128 -> 0 bytes src/taglib/tests/data/mac-396.ape | Bin 104 -> 0 bytes src/taglib/tests/data/mac-399.ape | Bin 172 -> 0 bytes src/taglib/tests/data/mpeg2.mp3 | Bin 16384 -> 0 bytes src/taglib/tests/data/multiple-vc.flac | Bin 4754 -> 0 bytes src/taglib/tests/data/no-extension | Bin 256 -> 0 bytes src/taglib/tests/data/no-tags.3g2 | Bin 68335 -> 0 bytes src/taglib/tests/data/no-tags.flac | Bin 4692 -> 0 bytes src/taglib/tests/data/no-tags.m4a | Bin 2898 -> 0 bytes src/taglib/tests/data/no_length.wv | Bin 532 -> 0 bytes src/taglib/tests/data/noise.aif | Bin 4400 -> 0 bytes src/taglib/tests/data/noise_odd.aif | Bin 4399 -> 0 bytes src/taglib/tests/data/rare_frames.mp3 | Bin 8320 -> 0 bytes src/taglib/tests/data/silence-1.wma | Bin 35416 -> 0 bytes src/taglib/tests/data/silence-44-s.flac | Bin 50904 -> 0 bytes src/taglib/tests/data/stripped.xm | Bin 602 -> 0 bytes src/taglib/tests/data/sv4_header.mpc | Bin 128 -> 0 bytes src/taglib/tests/data/sv5_header.mpc | Bin 128 -> 0 bytes src/taglib/tests/data/sv8_header.mpc | Bin 114 -> 0 bytes src/taglib/tests/data/test.it | Bin 644 -> 0 bytes src/taglib/tests/data/test.mod | Bin 3132 -> 0 bytes src/taglib/tests/data/test.ogg | Bin 4408 -> 0 bytes src/taglib/tests/data/test.s3m | Bin 544 -> 0 bytes src/taglib/tests/data/test.xm | Bin 5471 -> 0 bytes .../tests/data/unsupported-extension.xxx | Bin 256 -> 0 bytes src/taglib/tests/data/unsynch.id3 | Bin 320 -> 0 bytes src/taglib/tests/data/w000.mp3 | Bin 512 -> 0 bytes src/taglib/tests/data/xing.mp3 | Bin 8208 -> 0 bytes src/taglib/tests/data/zero-size-chunk.wav | Bin 1024 -> 0 bytes src/taglib/tests/main.cpp | 57 - src/taglib/tests/test_aiff.cpp | 31 - src/taglib/tests/test_ape.cpp | 52 - src/taglib/tests/test_apetag.cpp | 122 - src/taglib/tests/test_asf.cpp | 255 --- src/taglib/tests/test_bytevector.cpp | 246 -- src/taglib/tests/test_bytevectorlist.cpp | 38 - src/taglib/tests/test_bytevectorstream.cpp | 92 - src/taglib/tests/test_fileref.cpp | 163 -- src/taglib/tests/test_flac.cpp | 248 -- src/taglib/tests/test_flacpicture.cpp | 52 - .../tests/test_flacunknownmetadatablock.cpp | 38 - src/taglib/tests/test_id3v1.cpp | 40 - src/taglib/tests/test_id3v2.cpp | 758 ------ src/taglib/tests/test_info.cpp | 49 - src/taglib/tests/test_it.cpp | 136 -- src/taglib/tests/test_list.cpp | 58 - src/taglib/tests/test_map.cpp | 27 - src/taglib/tests/test_mod.cpp | 126 - src/taglib/tests/test_mp4.cpp | 282 --- src/taglib/tests/test_mp4coverart.cpp | 49 - src/taglib/tests/test_mp4item.cpp | 37 - src/taglib/tests/test_mpc.cpp | 66 - src/taglib/tests/test_mpeg.cpp | 88 - src/taglib/tests/test_ogg.cpp | 104 - src/taglib/tests/test_oggflac.cpp | 44 - src/taglib/tests/test_opus.cpp | 61 - src/taglib/tests/test_propertymap.cpp | 32 - src/taglib/tests/test_riff.cpp | 198 -- src/taglib/tests/test_s3m.cpp | 123 - src/taglib/tests/test_string.cpp | 233 -- src/taglib/tests/test_synchdata.cpp | 107 - src/taglib/tests/test_trueaudio.cpp | 27 - src/taglib/tests/test_wav.cpp | 36 - src/taglib/tests/test_wavpack.cpp | 40 - src/taglib/tests/test_xiphcomment.cpp | 79 - src/taglib/tests/test_xm.cpp | 216 -- src/taglib/tests/utils.h | 104 - 330 files changed, 57578 deletions(-) delete mode 100644 src/taglib/AUTHORS delete mode 100644 src/taglib/CMakeLists.txt delete mode 100644 src/taglib/COPYING.LGPL delete mode 100644 src/taglib/COPYING.MPL delete mode 100644 src/taglib/ConfigureChecks.cmake delete mode 100644 src/taglib/Doxyfile.cmake delete mode 100644 src/taglib/INSTALL delete mode 100644 src/taglib/NEWS delete mode 100644 src/taglib/bindings/CMakeLists.txt delete mode 100644 src/taglib/bindings/README delete mode 100644 src/taglib/bindings/c/CMakeLists.txt delete mode 100644 src/taglib/bindings/c/tag_c.cpp delete mode 100644 src/taglib/bindings/c/tag_c.h delete mode 100644 src/taglib/bindings/c/taglib_c.pc.cmake delete mode 100644 src/taglib/cmake/modules/FindCppUnit.cmake delete mode 100644 src/taglib/cmake/modules/MacroEnsureVersion.cmake delete mode 100644 src/taglib/cmake_uninstall.cmake.in delete mode 100644 src/taglib/config.h.cmake delete mode 100644 src/taglib/doc/README delete mode 100644 src/taglib/doc/api-footer.html delete mode 100644 src/taglib/doc/api-header.html delete mode 100644 src/taglib/doc/taglib-api.css delete mode 100644 src/taglib/doc/taglib.png delete mode 100644 src/taglib/examples/CMakeLists.txt delete mode 100644 src/taglib/examples/framelist.cpp delete mode 100644 src/taglib/examples/strip-id3v1.cpp delete mode 100644 src/taglib/examples/tagreader.cpp delete mode 100644 src/taglib/examples/tagreader_c.c delete mode 100644 src/taglib/examples/tagwriter.cpp delete mode 100644 src/taglib/taglib-config.cmake delete mode 100644 src/taglib/taglib-config.cmd.cmake delete mode 100644 src/taglib/taglib.pc.cmake delete mode 100644 src/taglib/taglib/CMakeLists.txt delete mode 100644 src/taglib/taglib/ape/ape-tag-format.txt delete mode 100644 src/taglib/taglib/ape/apefile.cpp delete mode 100644 src/taglib/taglib/ape/apefile.h delete mode 100644 src/taglib/taglib/ape/apefooter.cpp delete mode 100644 src/taglib/taglib/ape/apefooter.h delete mode 100644 src/taglib/taglib/ape/apeitem.cpp delete mode 100644 src/taglib/taglib/ape/apeitem.h delete mode 100644 src/taglib/taglib/ape/apeproperties.cpp delete mode 100644 src/taglib/taglib/ape/apeproperties.h delete mode 100644 src/taglib/taglib/ape/apetag.cpp delete mode 100644 src/taglib/taglib/ape/apetag.h delete mode 100644 src/taglib/taglib/asf/asfattribute.cpp delete mode 100644 src/taglib/taglib/asf/asfattribute.h delete mode 100644 src/taglib/taglib/asf/asffile.cpp delete mode 100644 src/taglib/taglib/asf/asffile.h delete mode 100644 src/taglib/taglib/asf/asfpicture.cpp delete mode 100644 src/taglib/taglib/asf/asfpicture.h delete mode 100644 src/taglib/taglib/asf/asfproperties.cpp delete mode 100644 src/taglib/taglib/asf/asfproperties.h delete mode 100644 src/taglib/taglib/asf/asftag.cpp delete mode 100644 src/taglib/taglib/asf/asftag.h delete mode 100644 src/taglib/taglib/audioproperties.cpp delete mode 100644 src/taglib/taglib/audioproperties.h delete mode 100644 src/taglib/taglib/fileref.cpp delete mode 100644 src/taglib/taglib/fileref.h delete mode 100644 src/taglib/taglib/flac/flacfile.cpp delete mode 100644 src/taglib/taglib/flac/flacfile.h delete mode 100644 src/taglib/taglib/flac/flacmetadatablock.cpp delete mode 100644 src/taglib/taglib/flac/flacmetadatablock.h delete mode 100644 src/taglib/taglib/flac/flacpicture.cpp delete mode 100644 src/taglib/taglib/flac/flacpicture.h delete mode 100644 src/taglib/taglib/flac/flacproperties.cpp delete mode 100644 src/taglib/taglib/flac/flacproperties.h delete mode 100644 src/taglib/taglib/flac/flacunknownmetadatablock.cpp delete mode 100644 src/taglib/taglib/flac/flacunknownmetadatablock.h delete mode 100644 src/taglib/taglib/it/itfile.cpp delete mode 100644 src/taglib/taglib/it/itfile.h delete mode 100644 src/taglib/taglib/it/itproperties.cpp delete mode 100644 src/taglib/taglib/it/itproperties.h delete mode 100644 src/taglib/taglib/mod/modfile.cpp delete mode 100644 src/taglib/taglib/mod/modfile.h delete mode 100644 src/taglib/taglib/mod/modfilebase.cpp delete mode 100644 src/taglib/taglib/mod/modfilebase.h delete mode 100644 src/taglib/taglib/mod/modfileprivate.h delete mode 100644 src/taglib/taglib/mod/modproperties.cpp delete mode 100644 src/taglib/taglib/mod/modproperties.h delete mode 100644 src/taglib/taglib/mod/modtag.cpp delete mode 100644 src/taglib/taglib/mod/modtag.h delete mode 100644 src/taglib/taglib/mp4/mp4atom.cpp delete mode 100644 src/taglib/taglib/mp4/mp4atom.h delete mode 100644 src/taglib/taglib/mp4/mp4coverart.cpp delete mode 100644 src/taglib/taglib/mp4/mp4coverart.h delete mode 100644 src/taglib/taglib/mp4/mp4file.cpp delete mode 100644 src/taglib/taglib/mp4/mp4file.h delete mode 100644 src/taglib/taglib/mp4/mp4item.cpp delete mode 100644 src/taglib/taglib/mp4/mp4item.h delete mode 100644 src/taglib/taglib/mp4/mp4properties.cpp delete mode 100644 src/taglib/taglib/mp4/mp4properties.h delete mode 100644 src/taglib/taglib/mp4/mp4tag.cpp delete mode 100644 src/taglib/taglib/mp4/mp4tag.h delete mode 100644 src/taglib/taglib/mpc/mpcfile.cpp delete mode 100644 src/taglib/taglib/mpc/mpcfile.h delete mode 100644 src/taglib/taglib/mpc/mpcproperties.cpp delete mode 100644 src/taglib/taglib/mpc/mpcproperties.h delete mode 100644 src/taglib/taglib/mpeg/id3v1/id3v1genres.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v1/id3v1genres.h delete mode 100644 src/taglib/taglib/mpeg/id3v1/id3v1tag.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v1/id3v1tag.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/commentsframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/commentsframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/ownershipframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/ownershipframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/popularimeterframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/popularimeterframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/privateframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/privateframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/unknownframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/unknownframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/urllinkframe.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/frames/urllinkframe.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2.2.0.txt delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2.3.0.txt delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2.4.0-frames.txt delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2.4.0-structure.txt delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2extendedheader.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2extendedheader.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2footer.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2footer.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2frame.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2frame.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2framefactory.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2framefactory.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2header.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2header.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2synchdata.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2synchdata.h delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2tag.cpp delete mode 100644 src/taglib/taglib/mpeg/id3v2/id3v2tag.h delete mode 100644 src/taglib/taglib/mpeg/mpegfile.cpp delete mode 100644 src/taglib/taglib/mpeg/mpegfile.h delete mode 100644 src/taglib/taglib/mpeg/mpegheader.cpp delete mode 100644 src/taglib/taglib/mpeg/mpegheader.h delete mode 100644 src/taglib/taglib/mpeg/mpegproperties.cpp delete mode 100644 src/taglib/taglib/mpeg/mpegproperties.h delete mode 100644 src/taglib/taglib/mpeg/xingheader.cpp delete mode 100644 src/taglib/taglib/mpeg/xingheader.h delete mode 100644 src/taglib/taglib/ogg/flac/oggflacfile.cpp delete mode 100644 src/taglib/taglib/ogg/flac/oggflacfile.h delete mode 100644 src/taglib/taglib/ogg/oggfile.cpp delete mode 100644 src/taglib/taglib/ogg/oggfile.h delete mode 100644 src/taglib/taglib/ogg/oggpage.cpp delete mode 100644 src/taglib/taglib/ogg/oggpage.h delete mode 100644 src/taglib/taglib/ogg/oggpageheader.cpp delete mode 100644 src/taglib/taglib/ogg/oggpageheader.h delete mode 100644 src/taglib/taglib/ogg/opus/opusfile.cpp delete mode 100644 src/taglib/taglib/ogg/opus/opusfile.h delete mode 100644 src/taglib/taglib/ogg/opus/opusproperties.cpp delete mode 100644 src/taglib/taglib/ogg/opus/opusproperties.h delete mode 100644 src/taglib/taglib/ogg/speex/speexfile.cpp delete mode 100644 src/taglib/taglib/ogg/speex/speexfile.h delete mode 100644 src/taglib/taglib/ogg/speex/speexproperties.cpp delete mode 100644 src/taglib/taglib/ogg/speex/speexproperties.h delete mode 100644 src/taglib/taglib/ogg/vorbis/vorbisfile.cpp delete mode 100644 src/taglib/taglib/ogg/vorbis/vorbisfile.h delete mode 100644 src/taglib/taglib/ogg/vorbis/vorbisproperties.cpp delete mode 100644 src/taglib/taglib/ogg/vorbis/vorbisproperties.h delete mode 100644 src/taglib/taglib/ogg/xiphcomment.cpp delete mode 100644 src/taglib/taglib/ogg/xiphcomment.h delete mode 100644 src/taglib/taglib/riff/aiff/aifffile.cpp delete mode 100644 src/taglib/taglib/riff/aiff/aifffile.h delete mode 100644 src/taglib/taglib/riff/aiff/aiffproperties.cpp delete mode 100644 src/taglib/taglib/riff/aiff/aiffproperties.h delete mode 100644 src/taglib/taglib/riff/rifffile.cpp delete mode 100644 src/taglib/taglib/riff/rifffile.h delete mode 100644 src/taglib/taglib/riff/wav/infotag.cpp delete mode 100644 src/taglib/taglib/riff/wav/infotag.h delete mode 100644 src/taglib/taglib/riff/wav/wavfile.cpp delete mode 100644 src/taglib/taglib/riff/wav/wavfile.h delete mode 100644 src/taglib/taglib/riff/wav/wavproperties.cpp delete mode 100644 src/taglib/taglib/riff/wav/wavproperties.h delete mode 100644 src/taglib/taglib/s3m/s3mfile.cpp delete mode 100644 src/taglib/taglib/s3m/s3mfile.h delete mode 100644 src/taglib/taglib/s3m/s3mproperties.cpp delete mode 100644 src/taglib/taglib/s3m/s3mproperties.h delete mode 100644 src/taglib/taglib/tag.cpp delete mode 100644 src/taglib/taglib/tag.h delete mode 100644 src/taglib/taglib/taglib_config.h delete mode 100644 src/taglib/taglib/taglib_export.h delete mode 100644 src/taglib/taglib/tagunion.cpp delete mode 100644 src/taglib/taglib/tagunion.h delete mode 100644 src/taglib/taglib/toolkit/taglib.h delete mode 100644 src/taglib/taglib/toolkit/tbytevector.cpp delete mode 100644 src/taglib/taglib/toolkit/tbytevector.h delete mode 100644 src/taglib/taglib/toolkit/tbytevectorlist.cpp delete mode 100644 src/taglib/taglib/toolkit/tbytevectorlist.h delete mode 100644 src/taglib/taglib/toolkit/tbytevectorstream.cpp delete mode 100644 src/taglib/taglib/toolkit/tbytevectorstream.h delete mode 100644 src/taglib/taglib/toolkit/tdebug.cpp delete mode 100644 src/taglib/taglib/toolkit/tdebug.h delete mode 100644 src/taglib/taglib/toolkit/tdebuglistener.cpp delete mode 100644 src/taglib/taglib/toolkit/tdebuglistener.h delete mode 100644 src/taglib/taglib/toolkit/tfile.cpp delete mode 100644 src/taglib/taglib/toolkit/tfile.h delete mode 100644 src/taglib/taglib/toolkit/tfilestream.cpp delete mode 100644 src/taglib/taglib/toolkit/tfilestream.h delete mode 100644 src/taglib/taglib/toolkit/tiostream.cpp delete mode 100644 src/taglib/taglib/toolkit/tiostream.h delete mode 100644 src/taglib/taglib/toolkit/tlist.h delete mode 100644 src/taglib/taglib/toolkit/tlist.tcc delete mode 100644 src/taglib/taglib/toolkit/tmap.h delete mode 100644 src/taglib/taglib/toolkit/tmap.tcc delete mode 100644 src/taglib/taglib/toolkit/tpropertymap.cpp delete mode 100644 src/taglib/taglib/toolkit/tpropertymap.h delete mode 100644 src/taglib/taglib/toolkit/trefcounter.cpp delete mode 100644 src/taglib/taglib/toolkit/trefcounter.h delete mode 100644 src/taglib/taglib/toolkit/tstring.cpp delete mode 100644 src/taglib/taglib/toolkit/tstring.h delete mode 100644 src/taglib/taglib/toolkit/tstringlist.cpp delete mode 100644 src/taglib/taglib/toolkit/tstringlist.h delete mode 100644 src/taglib/taglib/toolkit/tutils.h delete mode 100644 src/taglib/taglib/toolkit/unicode.cpp delete mode 100644 src/taglib/taglib/toolkit/unicode.h delete mode 100644 src/taglib/taglib/trueaudio/trueaudiofile.cpp delete mode 100644 src/taglib/taglib/trueaudio/trueaudiofile.h delete mode 100644 src/taglib/taglib/trueaudio/trueaudioproperties.cpp delete mode 100644 src/taglib/taglib/trueaudio/trueaudioproperties.h delete mode 100644 src/taglib/taglib/wavpack/wavpackfile.cpp delete mode 100644 src/taglib/taglib/wavpack/wavpackfile.h delete mode 100644 src/taglib/taglib/wavpack/wavpackproperties.cpp delete mode 100644 src/taglib/taglib/wavpack/wavpackproperties.h delete mode 100644 src/taglib/taglib/xm/xmfile.cpp delete mode 100644 src/taglib/taglib/xm/xmfile.h delete mode 100644 src/taglib/taglib/xm/xmproperties.cpp delete mode 100644 src/taglib/taglib/xm/xmproperties.h delete mode 100644 src/taglib/tests/CMakeLists.txt delete mode 100644 src/taglib/tests/data/005411.id3 delete mode 100644 src/taglib/tests/data/64bit.mp4 delete mode 100644 src/taglib/tests/data/broken-tenc.id3 delete mode 100644 src/taglib/tests/data/changed.mod delete mode 100644 src/taglib/tests/data/changed.s3m delete mode 100644 src/taglib/tests/data/changed.xm delete mode 100644 src/taglib/tests/data/click.mpc delete mode 100644 src/taglib/tests/data/click.wv delete mode 100644 src/taglib/tests/data/compressed_id3_frame.mp3 delete mode 100644 src/taglib/tests/data/correctness_gain_silent_output.opus delete mode 100644 src/taglib/tests/data/covr-junk.m4a delete mode 100644 src/taglib/tests/data/empty.aiff delete mode 100644 src/taglib/tests/data/empty.ogg delete mode 100644 src/taglib/tests/data/empty.spx delete mode 100644 src/taglib/tests/data/empty.tta delete mode 100644 src/taglib/tests/data/empty.wav delete mode 100644 src/taglib/tests/data/empty_alac.m4a delete mode 100644 src/taglib/tests/data/empty_flac.oga delete mode 100644 src/taglib/tests/data/empty_vorbis.oga delete mode 100644 src/taglib/tests/data/gnre.m4a delete mode 100644 src/taglib/tests/data/has-tags.m4a delete mode 100644 src/taglib/tests/data/id3v22-tda.mp3 delete mode 100644 src/taglib/tests/data/ilst-is-last.m4a delete mode 100644 src/taglib/tests/data/mac-390-hdr.ape delete mode 100644 src/taglib/tests/data/mac-396.ape delete mode 100644 src/taglib/tests/data/mac-399.ape delete mode 100644 src/taglib/tests/data/mpeg2.mp3 delete mode 100644 src/taglib/tests/data/multiple-vc.flac delete mode 100644 src/taglib/tests/data/no-extension delete mode 100644 src/taglib/tests/data/no-tags.3g2 delete mode 100644 src/taglib/tests/data/no-tags.flac delete mode 100644 src/taglib/tests/data/no-tags.m4a delete mode 100644 src/taglib/tests/data/no_length.wv delete mode 100644 src/taglib/tests/data/noise.aif delete mode 100644 src/taglib/tests/data/noise_odd.aif delete mode 100644 src/taglib/tests/data/rare_frames.mp3 delete mode 100644 src/taglib/tests/data/silence-1.wma delete mode 100644 src/taglib/tests/data/silence-44-s.flac delete mode 100644 src/taglib/tests/data/stripped.xm delete mode 100644 src/taglib/tests/data/sv4_header.mpc delete mode 100644 src/taglib/tests/data/sv5_header.mpc delete mode 100644 src/taglib/tests/data/sv8_header.mpc delete mode 100644 src/taglib/tests/data/test.it delete mode 100644 src/taglib/tests/data/test.mod delete mode 100644 src/taglib/tests/data/test.ogg delete mode 100644 src/taglib/tests/data/test.s3m delete mode 100644 src/taglib/tests/data/test.xm delete mode 100644 src/taglib/tests/data/unsupported-extension.xxx delete mode 100644 src/taglib/tests/data/unsynch.id3 delete mode 100644 src/taglib/tests/data/w000.mp3 delete mode 100644 src/taglib/tests/data/xing.mp3 delete mode 100644 src/taglib/tests/data/zero-size-chunk.wav delete mode 100644 src/taglib/tests/main.cpp delete mode 100644 src/taglib/tests/test_aiff.cpp delete mode 100644 src/taglib/tests/test_ape.cpp delete mode 100644 src/taglib/tests/test_apetag.cpp delete mode 100644 src/taglib/tests/test_asf.cpp delete mode 100644 src/taglib/tests/test_bytevector.cpp delete mode 100644 src/taglib/tests/test_bytevectorlist.cpp delete mode 100644 src/taglib/tests/test_bytevectorstream.cpp delete mode 100644 src/taglib/tests/test_fileref.cpp delete mode 100644 src/taglib/tests/test_flac.cpp delete mode 100644 src/taglib/tests/test_flacpicture.cpp delete mode 100644 src/taglib/tests/test_flacunknownmetadatablock.cpp delete mode 100644 src/taglib/tests/test_id3v1.cpp delete mode 100644 src/taglib/tests/test_id3v2.cpp delete mode 100644 src/taglib/tests/test_info.cpp delete mode 100644 src/taglib/tests/test_it.cpp delete mode 100644 src/taglib/tests/test_list.cpp delete mode 100644 src/taglib/tests/test_map.cpp delete mode 100644 src/taglib/tests/test_mod.cpp delete mode 100644 src/taglib/tests/test_mp4.cpp delete mode 100644 src/taglib/tests/test_mp4coverart.cpp delete mode 100644 src/taglib/tests/test_mp4item.cpp delete mode 100644 src/taglib/tests/test_mpc.cpp delete mode 100644 src/taglib/tests/test_mpeg.cpp delete mode 100644 src/taglib/tests/test_ogg.cpp delete mode 100644 src/taglib/tests/test_oggflac.cpp delete mode 100644 src/taglib/tests/test_opus.cpp delete mode 100644 src/taglib/tests/test_propertymap.cpp delete mode 100644 src/taglib/tests/test_riff.cpp delete mode 100644 src/taglib/tests/test_s3m.cpp delete mode 100644 src/taglib/tests/test_string.cpp delete mode 100644 src/taglib/tests/test_synchdata.cpp delete mode 100644 src/taglib/tests/test_trueaudio.cpp delete mode 100644 src/taglib/tests/test_wav.cpp delete mode 100644 src/taglib/tests/test_wavpack.cpp delete mode 100644 src/taglib/tests/test_xiphcomment.cpp delete mode 100644 src/taglib/tests/test_xm.cpp delete mode 100644 src/taglib/tests/utils.h diff --git a/src/taglib/AUTHORS b/src/taglib/AUTHORS deleted file mode 100644 index e996d94..0000000 --- a/src/taglib/AUTHORS +++ /dev/null @@ -1,17 +0,0 @@ -Scott Wheeler - Author, maintainer -Lukas Lalinsky - Implementation of multiple new file formats, many bug fixes, maintainer -Ismael Orenstein - Xing header implementation -Allan Sandfeld Jensen - FLAC metadata implementation -Teemu Tervo - Numerous bug reports and fixes -Mathias Panzenböck - Mod, S3M, IT and XM metadata implementations -Tsuda Kageyu - A lot of fixes and improvements, i.e. memory copy reduction etc. - -Please send all patches and questions to taglib-devel@kde.org rather than to -individual developers! diff --git a/src/taglib/CMakeLists.txt b/src/taglib/CMakeLists.txt deleted file mode 100644 index 317ffa1..0000000 --- a/src/taglib/CMakeLists.txt +++ /dev/null @@ -1,120 +0,0 @@ -project(taglib) - -cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) - -option(ENABLE_STATIC "Make static version of libtag" OFF) -if(ENABLE_STATIC) - add_definitions(-DTAGLIB_STATIC) - set(BUILD_SHARED_LIBS OFF) -else() - set(BUILD_SHARED_LIBS ON) -endif() -OPTION(ENABLE_STATIC_RUNTIME "Visual Studio, link with runtime statically" OFF) - -option(VISIBILITY_HIDDEN "Build with -fvisibility=hidden" OFF) -if(VISIBILITY_HIDDEN) - add_definitions (-fvisibility=hidden) -endif() - -option(BUILD_TESTS "Build the test suite" OFF) -option(BUILD_EXAMPLES "Build the examples" OFF) - -option(NO_ITUNES_HACKS "Disable workarounds for iTunes bugs" OFF) - -add_definitions(-DHAVE_CONFIG_H) -set(TESTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/") - -## the following are directories where stuff will be installed to -set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)") -set(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Base directory for executables and libraries" FORCE) -set(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" CACHE PATH "The subdirectory to the binaries prefix (default prefix/bin)" FORCE) -set(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib${LIB_SUFFIX})" FORCE) -set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The subdirectory to the header prefix" FORCE) - -if(APPLE) - option(BUILD_FRAMEWORK "Build an OS X framework" OFF) - set(FRAMEWORK_INSTALL_DIR "/Library/Frameworks" CACHE STRING "Directory to install frameworks to.") -endif() - -if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") -endif() -if (MSVC AND ENABLE_STATIC_RUNTIME) - foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) - string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") - endforeach(flag_var) -endif() - -set(TAGLIB_LIB_MAJOR_VERSION "1") -set(TAGLIB_LIB_MINOR_VERSION "9") -set(TAGLIB_LIB_PATCH_VERSION "1") - -set(TAGLIB_LIB_VERSION_STRING "${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}.${TAGLIB_LIB_PATCH_VERSION}") - -# 1. If the library source code has changed at all since the last update, then increment revision. -# 2. If any interfaces have been added, removed, or changed since the last update, increment current, and set revision to 0. -# 3. If any interfaces have been added since the last public release, then increment age. -# 4. If any interfaces have been removed since the last public release, then set age to 0. -set(TAGLIB_SOVERSION_CURRENT 15) -set(TAGLIB_SOVERSION_REVISION 0) -set(TAGLIB_SOVERSION_AGE 14) - -math(EXPR TAGLIB_SOVERSION_MAJOR "${TAGLIB_SOVERSION_CURRENT} - ${TAGLIB_SOVERSION_AGE}") -math(EXPR TAGLIB_SOVERSION_MINOR "${TAGLIB_SOVERSION_AGE}") -math(EXPR TAGLIB_SOVERSION_PATCH "${TAGLIB_SOVERSION_REVISION}") - -include(ConfigureChecks.cmake) - -if(NOT WIN32) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/taglib-config.cmake ${CMAKE_CURRENT_BINARY_DIR}/taglib-config ) - install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/taglib-config DESTINATION ${BIN_INSTALL_DIR}) -endif() - -if(WIN32) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/taglib-config.cmd.cmake ${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd ) - install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd DESTINATION ${BIN_INSTALL_DIR}) -endif() - -if(NOT WIN32 AND NOT BUILD_FRAMEWORK) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/taglib.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/taglib.pc ) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/taglib.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) -endif() - -include_directories(${CMAKE_CURRENT_BINARY_DIR}) -configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) - -if(WITH_ASF) - set(TAGLIB_WITH_ASF TRUE) -endif() -if(WITH_MP4) - set(TAGLIB_WITH_MP4 TRUE) -endif() - -option(TRACE_IN_RELEASE "Output debug messages even in release mode" OFF) -if(TRACE_IN_RELEASE) - set(TRACE_IN_RELEASE TRUE) -endif() - -configure_file(taglib/taglib_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/taglib_config.h) - -add_subdirectory(taglib) -add_subdirectory(bindings) -if(BUILD_TESTS) - enable_testing() - add_subdirectory(tests) -endif(BUILD_TESTS) -add_subdirectory(examples) - -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.cmake ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) -file(COPY doc/taglib.png DESTINATION doc) -add_custom_target(docs doxygen) - -# uninstall target -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - IMMEDIATE @ONLY) - -add_custom_target(uninstall - COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") diff --git a/src/taglib/COPYING.LGPL b/src/taglib/COPYING.LGPL deleted file mode 100644 index 4362b49..0000000 --- a/src/taglib/COPYING.LGPL +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/src/taglib/COPYING.MPL b/src/taglib/COPYING.MPL deleted file mode 100644 index 7714141..0000000 --- a/src/taglib/COPYING.MPL +++ /dev/null @@ -1,470 +0,0 @@ - MOZILLA PUBLIC LICENSE - Version 1.1 - - --------------- - -1. Definitions. - - 1.0.1. "Commercial Use" means distribution or otherwise making the - Covered Code available to a third party. - - 1.1. "Contributor" means each entity that creates or contributes to - the creation of Modifications. - - 1.2. "Contributor Version" means the combination of the Original - Code, prior Modifications used by a Contributor, and the Modifications - made by that particular Contributor. - - 1.3. "Covered Code" means the Original Code or Modifications or the - combination of the Original Code and Modifications, in each case - including portions thereof. - - 1.4. "Electronic Distribution Mechanism" means a mechanism generally - accepted in the software development community for the electronic - transfer of data. - - 1.5. "Executable" means Covered Code in any form other than Source - Code. - - 1.6. "Initial Developer" means the individual or entity identified - as the Initial Developer in the Source Code notice required by Exhibit - A. - - 1.7. "Larger Work" means a work which combines Covered Code or - portions thereof with code not governed by the terms of this License. - - 1.8. "License" means this document. - - 1.8.1. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed herein. - - 1.9. "Modifications" means any addition to or deletion from the - substance or structure of either the Original Code or any previous - Modifications. When Covered Code is released as a series of files, a - Modification is: - A. Any addition to or deletion from the contents of a file - containing Original Code or previous Modifications. - - B. Any new file that contains any part of the Original Code or - previous Modifications. - - 1.10. "Original Code" means Source Code of computer software code - which is described in the Source Code notice required by Exhibit A as - Original Code, and which, at the time of its release under this - License is not already Covered Code governed by this License. - - 1.10.1. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, process, - and apparatus claims, in any patent Licensable by grantor. - - 1.11. "Source Code" means the preferred form of the Covered Code for - making modifications to it, including all modules it contains, plus - any associated interface definition files, scripts used to control - compilation and installation of an Executable, or source code - differential comparisons against either the Original Code or another - well known, available Covered Code of the Contributor's choice. The - Source Code can be in a compressed or archival form, provided the - appropriate decompression or de-archiving software is widely available - for no charge. - - 1.12. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms of, this - License or a future version of this License issued under Section 6.1. - For legal entities, "You" includes any entity which controls, is - controlled by, or is under common control with You. For purposes of - this definition, "control" means (a) the power, direct or indirect, - to cause the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty percent - (50%) of the outstanding shares or beneficial ownership of such - entity. - -2. Source Code License. - - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, royalty-free, - non-exclusive license, subject to third party intellectual property - claims: - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer to use, reproduce, - modify, display, perform, sublicense and distribute the Original - Code (or portions thereof) with or without Modifications, and/or - as part of a Larger Work; and - - (b) under Patents Claims infringed by the making, using or - selling of Original Code, to make, have made, use, practice, - sell, and offer for sale, and/or otherwise dispose of the - Original Code (or portions thereof). - - (c) the licenses granted in this Section 2.1(a) and (b) are - effective on the date Initial Developer first distributes - Original Code under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: 1) for code that You delete from the Original Code; 2) - separate from the Original Code; or 3) for infringements caused - by: i) the modification of the Original Code or ii) the - combination of the Original Code with other software or devices. - - 2.2. Contributor Grant. - Subject to third party intellectual property claims, each Contributor - hereby grants You a world-wide, royalty-free, non-exclusive license - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor, to use, reproduce, modify, - display, perform, sublicense and distribute the Modifications - created by such Contributor (or portions thereof) either on an - unmodified basis, with other Modifications, as Covered Code - and/or as part of a Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either alone - and/or in combination with its Contributor Version (or portions - of such combination), to make, use, sell, offer for sale, have - made, and/or otherwise dispose of: 1) Modifications made by that - Contributor (or portions thereof); and 2) the combination of - Modifications made by that Contributor with its Contributor - Version (or portions of such combination). - - (c) the licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first makes Commercial Use of - the Covered Code. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: 1) for any code that Contributor has deleted from the - Contributor Version; 2) separate from the Contributor Version; - 3) for infringements caused by: i) third party modifications of - Contributor Version or ii) the combination of Modifications made - by that Contributor with other software (except as part of the - Contributor Version) or other devices; or 4) under Patent Claims - infringed by Covered Code in the absence of Modifications made by - that Contributor. - -3. Distribution Obligations. - - 3.1. Application of License. - The Modifications which You create or to which You contribute are - governed by the terms of this License, including without limitation - Section 2.2. The Source Code version of Covered Code may be - distributed only under the terms of this License or a future version - of this License released under Section 6.1, and You must include a - copy of this License with every copy of the Source Code You - distribute. You may not offer or impose any terms on any Source Code - version that alters or restricts the applicable version of this - License or the recipients' rights hereunder. However, You may include - an additional document offering the additional rights described in - Section 3.5. - - 3.2. Availability of Source Code. - Any Modification which You create or to which You contribute must be - made available in Source Code form under the terms of this License - either on the same media as an Executable version or via an accepted - Electronic Distribution Mechanism to anyone to whom you made an - Executable version available; and if made available via Electronic - Distribution Mechanism, must remain available for at least twelve (12) - months after the date it initially became available, or at least six - (6) months after a subsequent version of that particular Modification - has been made available to such recipients. You are responsible for - ensuring that the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a third party. - - 3.3. Description of Modifications. - You must cause all Covered Code to which You contribute to contain a - file documenting the changes You made to create that Covered Code and - the date of any change. You must include a prominent statement that - the Modification is derived, directly or indirectly, from Original - Code provided by the Initial Developer and including the name of the - Initial Developer in (a) the Source Code, and (b) in any notice in an - Executable version or related documentation in which You describe the - origin or ownership of the Covered Code. - - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If Contributor has knowledge that a license under a third party's - intellectual property rights is required to exercise the rights - granted by such Contributor under Sections 2.1 or 2.2, - Contributor must include a text file with the Source Code - distribution titled "LEGAL" which describes the claim and the - party making the claim in sufficient detail that a recipient will - know whom to contact. If Contributor obtains such knowledge after - the Modification is made available as described in Section 3.2, - Contributor shall promptly modify the LEGAL file in all copies - Contributor makes available thereafter and shall take other steps - (such as notifying appropriate mailing lists or newsgroups) - reasonably calculated to inform those who received the Covered - Code that new knowledge has been obtained. - - (b) Contributor APIs. - If Contributor's Modifications include an application programming - interface and Contributor has knowledge of patent licenses which - are reasonably necessary to implement that API, Contributor must - also include this information in the LEGAL file. - - (c) Representations. - Contributor represents that, except as disclosed pursuant to - Section 3.4(a) above, Contributor believes that Contributor's - Modifications are Contributor's original creation(s) and/or - Contributor has sufficient rights to grant the rights conveyed by - this License. - - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each file of the Source - Code. If it is not possible to put such notice in a particular Source - Code file due to its structure, then You must include such notice in a - location (such as a relevant directory) where a user would be likely - to look for such a notice. If You created one or more Modification(s) - You may add your name as a Contributor to the notice described in - Exhibit A. You must also duplicate this License in any documentation - for the Source Code where You describe recipients' rights or ownership - rights relating to Covered Code. You may choose to offer, and to - charge a fee for, warranty, support, indemnity or liability - obligations to one or more recipients of Covered Code. However, You - may do so only on Your own behalf, and not on behalf of the Initial - Developer or any Contributor. You must make it absolutely clear than - any such warranty, support, indemnity or liability obligation is - offered by You alone, and You hereby agree to indemnify the Initial - Developer and every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of warranty, - support, indemnity or liability terms You offer. - - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form only if the - requirements of Section 3.1-3.5 have been met for that Covered Code, - and if You include a notice stating that the Source Code version of - the Covered Code is available under the terms of this License, - including a description of how and where You have fulfilled the - obligations of Section 3.2. The notice must be conspicuously included - in any notice in an Executable version, related documentation or - collateral in which You describe recipients' rights relating to the - Covered Code. You may distribute the Executable version of Covered - Code or ownership rights under a license of Your choice, which may - contain terms different from this License, provided that You are in - compliance with the terms of this License and that the license for the - Executable version does not attempt to limit or alter the recipient's - rights in the Source Code version from the rights set forth in this - License. If You distribute the Executable version under a different - license You must make it absolutely clear that any terms which differ - from this License are offered by You alone, not by the Initial - Developer or any Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred by - the Initial Developer or such Contributor as a result of any such - terms You offer. - - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code with other code - not governed by the terms of this License and distribute the Larger - Work as a single product. In such a case, You must make sure the - requirements of this License are fulfilled for the Covered Code. - -4. Inability to Comply Due to Statute or Regulation. - - If it is impossible for You to comply with any of the terms of this - License with respect to some or all of the Covered Code due to - statute, judicial order, or regulation then You must: (a) comply with - the terms of this License to the maximum extent possible; and (b) - describe the limitations and the code they affect. Such description - must be included in the LEGAL file described in Section 3.4 and must - be included with all distributions of the Source Code. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Application of this License. - - This License applies to code to which the Initial Developer has - attached the notice in Exhibit A and to related Covered Code. - -6. Versions of the License. - - 6.1. New Versions. - Netscape Communications Corporation ("Netscape") may publish revised - and/or new versions of the License from time to time. Each version - will be given a distinguishing version number. - - 6.2. Effect of New Versions. - Once Covered Code has been published under a particular version of the - License, You may always continue to use it under the terms of that - version. You may also choose to use such Covered Code under the terms - of any subsequent version of the License published by Netscape. No one - other than Netscape has the right to modify the terms applicable to - Covered Code created under this License. - - 6.3. Derivative Works. - If You create or use a modified version of this License (which you may - only do in order to apply it to code which is not already Covered Code - governed by this License), You must (a) rename Your license so that - the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", - "MPL", "NPL" or any confusingly similar phrase do not appear in your - license (except to note that your license differs from this License) - and (b) otherwise make it clear that Your version of the license - contains terms which differ from the Mozilla Public License and - Netscape Public License. (Filling in the name of the Initial - Developer, Original Code or Contributor in the notice described in - Exhibit A shall not of themselves be deemed to be modifications of - this License.) - -7. DISCLAIMER OF WARRANTY. - - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF - DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. - THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE - IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, - YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE - COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER - OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -8. TERMINATION. - - 8.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to cure - such breach within 30 days of becoming aware of the breach. All - sublicenses to the Covered Code which are properly granted shall - survive any termination of this License. Provisions which, by their - nature, must remain in effect beyond the termination of this License - shall survive. - - 8.2. If You initiate litigation by asserting a patent infringement - claim (excluding declatory judgment actions) against Initial Developer - or a Contributor (the Initial Developer or Contributor against whom - You file such action is referred to as "Participant") alleging that: - - (a) such Participant's Contributor Version directly or indirectly - infringes any patent, then any and all rights granted by such - Participant to You under Sections 2.1 and/or 2.2 of this License - shall, upon 60 days notice from Participant terminate prospectively, - unless if within 60 days after receipt of notice You either: (i) - agree in writing to pay Participant a mutually agreeable reasonable - royalty for Your past and future use of Modifications made by such - Participant, or (ii) withdraw Your litigation claim with respect to - the Contributor Version against such Participant. If within 60 days - of notice, a reasonable royalty and payment arrangement are not - mutually agreed upon in writing by the parties or the litigation claim - is not withdrawn, the rights granted by Participant to You under - Sections 2.1 and/or 2.2 automatically terminate at the expiration of - the 60 day notice period specified above. - - (b) any software, hardware, or device, other than such Participant's - Contributor Version, directly or indirectly infringes any patent, then - any rights granted to You by such Participant under Sections 2.1(b) - and 2.2(b) are revoked effective as of the date You first made, used, - sold, distributed, or had made, Modifications made by that - Participant. - - 8.3. If You assert a patent infringement claim against Participant - alleging that such Participant's Contributor Version directly or - indirectly infringes any patent where such claim is resolved (such as - by license or settlement) prior to the initiation of patent - infringement litigation, then the reasonable value of the licenses - granted by such Participant under Sections 2.1 or 2.2 shall be taken - into account in determining the amount or value of any payment or - license. - - 8.4. In the event of termination under Sections 8.1 or 8.2 above, - all end user license agreements (excluding distributors and resellers) - which have been validly granted by You or any distributor hereunder - prior to termination shall survive termination. - -9. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL - DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, - OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR - ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY - CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, - WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY - RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW - PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE - EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO - THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -10. U.S. GOVERNMENT END USERS. - - The Covered Code is a "commercial item," as that term is defined in - 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer - software" and "commercial computer software documentation," as such - terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 - C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), - all U.S. Government End Users acquire Covered Code with only those - rights set forth herein. - -11. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed by - California law provisions (except to the extent applicable law, if - any, provides otherwise), excluding its conflict-of-law provisions. - With respect to disputes in which at least one party is a citizen of, - or an entity chartered or registered to do business in the United - States of America, any litigation relating to this License shall be - subject to the jurisdiction of the Federal Courts of the Northern - District of California, with venue lying in Santa Clara County, - California, with the losing party responsible for costs, including - without limitation, court costs and reasonable attorneys' fees and - expenses. The application of the United Nations Convention on - Contracts for the International Sale of Goods is expressly excluded. - Any law or regulation which provides that the language of a contract - shall be construed against the drafter shall not apply to this - License. - -12. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or indirectly, - out of its utilization of rights under this License and You agree to - work with Initial Developer and Contributors to distribute such - responsibility on an equitable basis. Nothing herein is intended or - shall be deemed to constitute any admission of liability. - -13. MULTIPLE-LICENSED CODE. - - Initial Developer may designate portions of the Covered Code as - "Multiple-Licensed". "Multiple-Licensed" means that the Initial - Developer permits you to utilize portions of the Covered Code under - Your choice of the NPL or the alternative licenses, if any, specified - by the Initial Developer in the file described in Exhibit A. - -EXHIBIT A -Mozilla Public License. - - ``The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - - The Original Code is ______________________________________. - - The Initial Developer of the Original Code is ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. - - Contributor(s): ______________________________________. - - Alternatively, the contents of this file may be used under the terms - of the _____ license (the "[___] License"), in which case the - provisions of [______] License are applicable instead of those - above. If you wish to allow use of your version of this file only - under the terms of the [____] License and not to allow others to use - your version of this file under the MPL, indicate your decision by - deleting the provisions above and replace them with the notice and - other provisions required by the [___] License. If you do not delete - the provisions above, a recipient may use your version of this file - under either the MPL or the [___] License." - - [NOTE: The text of this Exhibit A may differ slightly from the text of - the notices in the Source Code files of the Original Code. You should - use the text of this Exhibit A rather than the text found in the - Original Code Source Code for Your Modifications.] - diff --git a/src/taglib/ConfigureChecks.cmake b/src/taglib/ConfigureChecks.cmake deleted file mode 100644 index b0f164a..0000000 --- a/src/taglib/ConfigureChecks.cmake +++ /dev/null @@ -1,226 +0,0 @@ -include(CheckIncludeFile) -include(CheckIncludeFiles) -include(CheckSymbolExists) -include(CheckFunctionExists) -include(CheckLibraryExists) -include(CheckTypeSize) -include(CheckCXXSourceCompiles) -include(TestBigEndian) - -# Check if the size of integral types are suitable. - -check_type_size("short" SIZEOF_SHORT) -if(NOT ${SIZEOF_SHORT} EQUAL 2) - MESSAGE(FATAL_ERROR "TagLib requires that short is 16-bit wide.") -endif() - -check_type_size("int" SIZEOF_INT) -if(NOT ${SIZEOF_INT} EQUAL 4) - MESSAGE(FATAL_ERROR "TagLib requires that int is 32-bit wide.") -endif() - -check_type_size("long long" SIZEOF_LONGLONG) -if(NOT ${SIZEOF_LONGLONG} EQUAL 8) - MESSAGE(FATAL_ERROR "TagLib requires that long long is 64-bit wide.") -endif() - -check_type_size("wchar_t" SIZEOF_WCHAR_T) -if(${SIZEOF_WCHAR_T} LESS 2) - MESSAGE(FATAL_ERROR "TagLib requires that wchar_t is sufficient to store a UTF-16 char.") -endif() - -# Determine the CPU byte order. - -test_big_endian(IS_BIG_ENDIAN) - -if(NOT IS_BIG_ENDIAN) - set(SYSTEM_BYTEORDER 1) -else() - set(SYSTEM_BYTEORDER 2) -endif() - -# Determine which kind of atomic operations your compiler supports. - -check_cxx_source_compiles(" - #include - int main() { - std::atomic x; - x.fetch_add(1); - x.fetch_sub(1); - return 0; - } -" HAVE_STD_ATOMIC) - -if(NOT HAVE_STD_ATOMIC) - check_cxx_source_compiles(" - #include - int main() { - boost::atomic x(1); - x.fetch_add(1); - x.fetch_sub(1); - return 0; - } - " HAVE_BOOST_ATOMIC) - - if(NOT HAVE_BOOST_ATOMIC) - check_cxx_source_compiles(" - int main() { - volatile int x; - __sync_add_and_fetch(&x, 1); - int y = __sync_sub_and_fetch(&x, 1); - return 0; - } - " HAVE_GCC_ATOMIC) - - if(NOT HAVE_GCC_ATOMIC) - check_cxx_source_compiles(" - #include - int main() { - volatile int32_t x; - OSAtomicIncrement32Barrier(&x); - int32_t y = OSAtomicDecrement32Barrier(&x); - return 0; - } - " HAVE_MAC_ATOMIC) - - if(NOT HAVE_MAC_ATOMIC) - check_cxx_source_compiles(" - #include - int main() { - volatile LONG x; - InterlockedIncrement(&x); - LONG y = InterlockedDecrement(&x); - return 0; - } - " HAVE_WIN_ATOMIC) - - if(NOT HAVE_WIN_ATOMIC) - check_cxx_source_compiles(" - #include - int main() { - volatile int x; - __sync_add_and_fetch(&x, 1); - int y = __sync_sub_and_fetch(&x, 1); - return 0; - } - " HAVE_IA64_ATOMIC) - endif() - endif() - endif() - endif() -endif() - -# Determine which kind of byte swap functions your compiler supports. - -# GCC's __builtin_bswap* should be checked individually -# because some of them can be missing depends on the GCC version. -check_cxx_source_compiles(" - int main() { - __builtin_bswap16(0); - return 0; - } -" HAVE_GCC_BYTESWAP_16) - -check_cxx_source_compiles(" - int main() { - __builtin_bswap32(0); - return 0; - } -" HAVE_GCC_BYTESWAP_32) - -check_cxx_source_compiles(" - int main() { - __builtin_bswap64(0); - return 0; - } -" HAVE_GCC_BYTESWAP_64) - -if(NOT HAVE_GCC_BYTESWAP_16 OR NOT HAVE_GCC_BYTESWAP_32 OR NOT HAVE_GCC_BYTESWAP_64) - check_cxx_source_compiles(" - #include - int main() { - __bswap_16(0); - __bswap_32(0); - __bswap_64(0); - return 0; - } - " HAVE_GLIBC_BYTESWAP) - - if(NOT HAVE_GLIBC_BYTESWAP) - check_cxx_source_compiles(" - #include - int main() { - _byteswap_ushort(0); - _byteswap_ulong(0); - _byteswap_uint64(0); - return 0; - } - " HAVE_MSC_BYTESWAP) - - if(NOT HAVE_MSC_BYTESWAP) - check_cxx_source_compiles(" - #include - int main() { - OSSwapInt16(0); - OSSwapInt32(0); - OSSwapInt64(0); - return 0; - } - " HAVE_MAC_BYTESWAP) - - if(NOT HAVE_MAC_BYTESWAP) - check_cxx_source_compiles(" - #include - int main() { - swap16(0); - swap32(0); - swap64(0); - return 0; - } - " HAVE_OPENBSD_BYTESWAP) - endif() - endif() - endif() -endif() - -# Determine whether your compiler supports some safer version of sprintf. - -check_cxx_source_compiles(" - #include - int main() { char buf[20]; snprintf(buf, 20, \"%d\", 1); return 0; } -" HAVE_SNPRINTF) - -if(NOT HAVE_SNPRINTF) - check_cxx_source_compiles(" - #include - int main() { char buf[20]; sprintf_s(buf, \"%d\", 1); return 0; } - " HAVE_SPRINTF_S) -endif() - -# Determine whether your compiler supports codecvt. - -check_cxx_source_compiles(" - #include - int main() { - std::codecvt_utf8_utf16 x; - return 0; - } -" HAVE_STD_CODECVT) - -# Check for libz using the cmake supplied FindZLIB.cmake - -find_package(ZLIB) -if(ZLIB_FOUND) - set(HAVE_ZLIB 1) -else() - set(HAVE_ZLIB 0) -endif() - - -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) - -find_package(CppUnit) -if(NOT CppUnit_FOUND AND BUILD_TESTS) - message(STATUS "CppUnit not found, disabling tests.") - set(BUILD_TESTS OFF) -endif() diff --git a/src/taglib/Doxyfile.cmake b/src/taglib/Doxyfile.cmake deleted file mode 100644 index 6da30bb..0000000 --- a/src/taglib/Doxyfile.cmake +++ /dev/null @@ -1,210 +0,0 @@ -# Doxyfile 1.3.4 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = TagLib -PROJECT_NUMBER = ${TAGLIB_LIB_VERSION_STRING} -OUTPUT_DIRECTORY = doc -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -DISTRIBUTE_GROUP_DOC = NO -TAB_SIZE = 4 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = YES -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = NO -EXTRACT_LOCAL_CLASSES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = YES -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -GENERATE_TODOLIST = NO -GENERATE_TESTLIST = NO -GENERATE_BUGLIST = NO -GENERATE_DEPRECATEDLIST= NO -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = NO -WARN_IF_DOC_ERROR = YES -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = @CMAKE_SOURCE_DIR@/taglib -FILE_PATTERNS = *.h \ - *.hh \ - *.H -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = @CMAKE_SOURCE_DIR@/doc/api-header.html -HTML_FOOTER = @CMAKE_SOURCE_DIR@/doc/api-footer.html -HTML_STYLESHEET = @CMAKE_SOURCE_DIR@/doc/taglib-api.css -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = YES -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = letter -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = DO_NOT_DOCUMENT \ - DOXYGEN \ - WITH_MP4 \ - WITH_ASF -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::addtions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = YES -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = YES -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 0 -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::addtions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO diff --git a/src/taglib/INSTALL b/src/taglib/INSTALL deleted file mode 100644 index 9e6e807..0000000 --- a/src/taglib/INSTALL +++ /dev/null @@ -1,157 +0,0 @@ -TagLib Installation -=================== - -TagLib uses the CMake build system. As a user, you will most likely want to -build TagLib in release mode and install it into a system-wide location. -This can be done using the following commands: - - cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_RELEASE_TYPE=Release . - make - sudo make install - -In order to build the included examples, use the BUILD_EXAMPLES option: - - cmake -DBUILD_EXAMPLES=ON [...] - -See http://www.cmake.org/cmake/help/runningcmake.html for generic help on -running CMake. - -Mac OS X --------- - -On Mac OS X, you might want to build a framework that can be easily integrated -into your application. If you set the BUILD_FRAMEWORK option on, it will compile -TagLib as a framework. For example, the following command can be used to build -an Universal Binary framework with Mac OS X 10.4 as the deployment target: - - cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_FRAMEWORK=ON \ - -DCMAKE_C_COMPILER=/usr/bin/gcc-4.0 \ - -DCMAKE_CXX_COMPILER=/usr/bin/c++-4.0 \ - -DCMAKE_OSX_SYSROOT=/Developer/SDKs/MacOSX10.4u.sdk/ \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=10.4 \ - -DCMAKE_OSX_ARCHITECTURES="ppc;i386;x86_64" - -For a 10.6 Snow Leopard static library with both 32-bit and 64-bit code, use: - - cmake -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=10.6 \ - -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" \ - -DENABLE_STATIC=ON \ - -DCMAKE_INSTALL_PREFIX="" - -After 'make', and 'make install', add libtag.a to your XCode project, and add -the include folder to the project's User Header Search Paths. - -Windows -------- - -It's Windows ... Systems vary! -This means you need to adjust things to suit your system, especially paths. - -Tested with: - Microsoft Visual Studio 2010 - Gcc by mingw-w64.sf.net v4.6.3 (Strawberry Perl 32b) - MinGW32-4.8.0 - -Requirements: - 1. Tool chain, Build Environment, Whatever ya want to call it ... - Installed and working. - 2. CMake program. (Available at: www.cmake.org) - Installed and working. - -Optional: - 1. Zlib library. - Available in some Tool Chains, Not all. - Search the web, Take your choice. - -Useful configuration options used with CMake (GUI and/or Command line): - Any of the ZLIB_ variables may be used at the command line, ZLIB_ROOT is only - available on the Command line. - ZLIB_ROOT= Where to find ZLib's root directory. - Assumes parent of: \include and \lib. - ZLIB_INCLUDE_DIR= Where to find ZLib's Include directory. - ZLIB_LIBRARY= Where to find ZLib's Library. - CMAKE_INSTALL_PREFIX= Where to install Taglib. - CMAKE_BUILD_TYPE= Release, Debug, etc ... (Not available in MSVC) - -The easiest way is at the Command Prompt. - MSVS Command Prompt for MSVS Users. - (Batch file and/or Shortcuts are your friends) - - 1. Build the Makefiles: - Replace "GENERATOR" with your needs. - For MSVS : "Visual Studio X" where X is the single or two digit version. - For MinGW: "MinGW Makefiles" - - C:\GitRoot\taglib> cmake -G "GENERATOR" -DCMAKE_INSTALL_PREFIX=C:\Libraries\taglib - - Or use the CMake GUI: - 1. Open CMake GUI. - 2. Set Paths. - "Where is the source code" and "Where to build the binaries" - Example, Both would be: C:\GitRoot\taglib - 3. Tick: Advanced - 4. Select: Configure - 5. Select: Generator - 6. Tick: Use default native compilers - 7. Select: Finish - Wait until done. - 5. If using ZLib, Scroll down. - (to the bottom of the list of options ... should go over them all) - 1. Edit: ZLIB_INCLUDE_DIR - 2. Edit: ZLIB_LIBRARY - 6. Select: Generate - - 2. Build the project: - MSVS: - C:\GitRoot\taglib> msbuild all_build.vcxproj /p:Configuration=Release - OR (Depending on MSVS version or personal choice) - C:\GitRoot\taglib> devenv all_build.vcxproj /build Release - MinGW: - C:\GitRoot\taglib> gmake - OR (Depending on MinGW install) - C:\GitRoot\taglib> mingw32-make - - Or in the MSVS GUI: - 1. Open MSVS. - 2. Open taglib solution. - 3. Set build type to: Release (look in the tool bars) - 2. Hit F7 to build the solution. (project) - - 3. Install the project: - (Change 'install' to 'uninstall' to uninstall the project) - MSVS: - C:\GitRoot\taglib> msbuild install.vcxproj - OR (Depending on MSVC version or personal choice) - C:\GitRoot\taglib> devenv install.vcxproj - MinGW: - C:\GitRoot\taglib> gmake install - OR (Depending on MinGW install) - C:\GitRoot\taglib> mingw32-make install - - Or in the MSVS GUI: - 1. Open project. - 2. Open Solution Explorer. - 3. Right Click: INSTALL - 4. Select: Project Only - 5. Select: Build Only INSTALL - -To build a static library enable the following two options with CMake. - -DENABLE_STATIC=ON -DENABLE_STATIC_RUNTIME=ON - -Including ENABLE_STATIC_RUNTIME=ON indicates you want TagLib built using the -static runtime library, rather than the DLL form of the runtime. - -Unit Tests ----------- - -If you want to run the test suite to make sure TagLib works properly on your -system, you need to have cppunit installed. To build the tests, include -the option -DBUILD_TESTS=on when running cmake. - -The test suite has a custom target in the build system, so you can run -the tests using make: - - make check - diff --git a/src/taglib/NEWS b/src/taglib/NEWS deleted file mode 100644 index 72d41fb..0000000 --- a/src/taglib/NEWS +++ /dev/null @@ -1,189 +0,0 @@ -TagLib 1.9.1 (Oct 8, 2013) -========================== - - * Fixed binary incompatible change in TagLib::Map and TagLib::List. - * Fixed constructing String from ByteVector. - * Fixed compilation on MSVC with the /Zc:wchar_t- option. - * Fixed detecting of RIFF files with invalid chunk sizes. - * Added TagLib::MP4::PropertyMap::codec(). - -TagLib 1.9 (Oct 6, 2013) -======================== - - * Added support for the Ogg Opus file format. - * Added support for INFO tags in WAV files. - * Changed FileStream to use Windows file API. - * Included taglib-config.cmd script for Windows. - * New ID3v1::Tag methods for working directly with genre numbers. - * New MPEG::File methods for checking which tags are saved in the file. - * Added support for the PropertyMap API to ASF and MP4 files. - * Added MusicBrainz identifiers to the PropertyMap API. - * Allowed reading of MP4 cover art without an explicitly specified format. - * Better parsing of corrupted FLAC files. - * Fixed saving of PropertyMap comments without description into ID3v2 tags. - * Fixed crash when parsing certain XM files. - * Fixed compilation of unit test with clang. - * Better handling of files that can't be open or have read-only permissions. - * Improved atomic reference counting. - * New hookable API for debug messages. - * More complete Windows install instructions. - * Many smaller bug fixes and performance improvements. - -TagLib 1.8 (Sep 6, 2012) -======================== - -1.8: - - * Added support for OWNE ID3 frames. - * Changed key validation in the new PropertyMap API. - * ID3v1::Tag::setStringHandler will no londer delete the previous handler, - the caller is responsible for this. - * File objects will also no longer delete the passed IOStream objects. It - should be done in the caller code after the File object is no longer - used. - * Added ID3v2::Tag::setLatin1StringHandler for custom handling of - latin1-encoded text in ID3v2 frames. - * Fixed validation of ID3v2 frame IDs (IDs with '0' were ignored). - -1.8 BETA: - - * New API for accessing tags by name. - * New abstract I/O stream layer to allow custom I/O handlers. - * Support for writing ID3v2.3 tags. - * Support for various module file formats (MOD, S3M, IT, XM). - * Support for MP4 and ASF is now enabled by default. - * Started using atomic int operations for reference counting. - * Added methods for checking if WMA and MP4 files are DRM-protected. - * Added taglib_free to the C bindings. - * New method to allow removing pictures from FLAC files. - * Support for reading audio properties from ALAC and Musepack SV8 files. - * Added replay-gain information to Musepack audio properties. - * Support for APEv2 binary tags. - * Many AudioProperties subclasses now provide information about the total number of samples. - * Various small bug fixes. - -TagLib 1.7.2 (Apr 20, 2012) -=========================== - - * Fixed division by zero while parsing corrupted MP4 files (CVE-2012-2396). - * Fixed compilation on Haiku. - -TagLib 1.7.1 (Mar 17, 2012) -=========================== - - * Improved parsing of corrupted WMA, RIFF and OGG files. - * Fixed a memory leak in the WMA parser. - * Fixed a memory leak in the FLAC parser. - * Fixed a possible division by zero in the APE parser. - * Added detection of TTA2 files. - * Fixed saving of multiple identically named tags to Vorbis Comments. - -TagLib 1.7 (Mar 11, 2011) -========================= - -1.7: - - * Fixed memory leaks in the FLAC file format parser. - * Fixed bitrate calculation for WAV files. - -1.7 RC1: - - * Support for reading/writing tags from Monkey's Audio files. (BUG:210404) - * Support for reading/writing embedded pictures from WMA files. - * Support for reading/writing embedded pictures from FLAC files (BUG:218696). - * Implemented APE::Tag::isEmpty() to check for all APE tags, not just the - basic ones. - * Added reading of WAV audio length. (BUG:116033) - * Exposed FLAC MD5 signature of the uncompressed audio stream via - FLAC::Properties::signature(). (BUG:160172) - * Added function ByteVector::toHex() for hex-encoding of byte vectors. - * WavPack reader now tries to get the audio length by finding the final - block, if the header doesn't have the information. (BUG:258016) - * Fixed a memory leak in the ID3v2.2 PIC frame parser. (BUG:257007) - * Fixed writing of RIFF files with even chunk sizes. (BUG:243954) - * Fixed compilation on MSVC 2010. - * Removed support for building using autoconf/automake. - * API docs can be now built using "make docs". - -TagLib 1.6.3 (Apr 17, 2010) -=========================== - - * Fixed definitions of the TAGLIB_WITH_MP4 and TAGLIB_WITH_ASF macros. - * Fixed upgrading of ID3v2.3 genre frame with ID3v1 code 0 (Blues). - * New method `int String::toInt(bool *ok)` which can return whether the - conversion to a number was successfull. - * Fixed parsing of incorrectly written lengths in ID3v2 (affects mainly - compressed frames). (BUG:231075) - -TagLib 1.6.2 (Apr 9, 2010) -========================== - - * Read Vorbis Comments from the first FLAC metadata block, if there are - multipe ones. (BUG:211089) - * Fixed a memory leak in FileRef's OGA format detection. - * Fixed compilation with the Sun Studio compiler. (BUG:215225) - * Handle WM/TrackNumber attributes with DWORD content in WMA files. - (BUG:218526) - * More strict check if something is a valid MP4 file. (BUG:216819) - * Correctly save MP4 int-pair atoms with flags set to 0. - * Fixed compilation of the test runner on Windows. - * Store ASF attributes larger than 64k in the metadata library object. - * Ignore trailing non-data atoms when parsing MP4 covr atoms. - * Don't upgrade ID3v2.2 frame TDA to TDRC. (BUG:228968) - -TagLib 1.6.1 (Oct 31, 2009) -=========================== - - * Better detection of the audio codec of .oga files in FileRef. - * Fixed saving of Vorbis comments to Ogg FLAC files. TagLib tried to - include the Vorbis framing bit, which is only correct for Ogg Vorbis. - * Public symbols now have explicitly set visibility to "default" on GCC. - * Added missing exports for static ID3v1 functions. - * Fixed a typo in taglib_c.pc - * Fixed a failing test on ppc64. - * Support for binary 'covr' atom in MP4 files. TagLib 1.6 treated them - as text atoms, which corrupted them in some cases. - * Fixed ID3v1-style genre to string conversion in MP4 files. - -TagLib 1.6 (Sep 13, 2009) -========================= - -1.6: - - * New CMake option to build a static version - ENABLE_STATIC. - * Added support for disabling dllimport/dllexport on Windows using the - TAGLIB_STATIC macro. - * Support for parsing the obsolete 'gnre' MP4 atom. - * New cpp macros TAGLIB_WITH_MP4 and TAGLIB_WITH_ASF to determin if - TagLib was built with MP4/ASF support. - -1.6 RC1: - - * Split Ogg packets larger than 64k into multiple pages. (BUG:171957) - * TagLib can now use FLAC padding block. (BUG:107659) - * ID3v2.2 frames are now not incorrectly saved. (BUG:176373) - * Support for ID3v2.2 PIC frames. (BUG:167786) - * Fixed a bug in ByteVectorList::split(). - * XiphComment::year() now falls back to YEAR if DATE doesn't exist - and XiphComment::year() falls back to TRACKNUM if TRACKNUMBER doesn't - exist. (BUG:144396) - * Improved ID3v2.3 genre parsing. (BUG:188578) - * Better checking of corrupted ID3v2 APIC data. (BUG:168382) - * Bitrate calculating using the Xing header now uses floating point - numbers. (BUG:172556) - * New TagLib::String method rfind(). - * Added support for MP4 file format with iTunes-style metadata [optional]. - * Added support for ASF (WMA) file format [optional]. - * Fixed crash when saving a Locator APEv2 tag. (BUG:169810) - * Fixed a possible crash in the non-const version of String::operator[] - and in String::operator+=. (BUG:169389) - * Added support for PRIV ID3v2 frames. - * Empty ID3v2 genres are no longer treated as numeric ID3v1 genres. - * Added support for the POPM (rating/playcount) ID3v2 frame. - * Generic RIFF file format support: - * Support for AIFF files with ID3v2 tags. - * Support for WAV files with ID3v2 tags. - * Fixed crash on handling unsupported ID3v2 frames, e.g. on encrypted - frames. (BUG:161721) - * Fixed overflow while calculating bitrate of FLAC files with a very - high bitrate. diff --git a/src/taglib/bindings/CMakeLists.txt b/src/taglib/bindings/CMakeLists.txt deleted file mode 100644 index d019843..0000000 --- a/src/taglib/bindings/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(c) diff --git a/src/taglib/bindings/README b/src/taglib/bindings/README deleted file mode 100644 index bfbd44a..0000000 --- a/src/taglib/bindings/README +++ /dev/null @@ -1,6 +0,0 @@ -There are a few other people that have done bindings externally that I have -been made aware of. I have not personally reviewed these bindings, but I'm -listing them here so that those who find them useful are able to find them: - -http://developer.kde.org/~wheeler/taglib.html#bindings - diff --git a/src/taglib/bindings/c/CMakeLists.txt b/src/taglib/bindings/c/CMakeLists.txt deleted file mode 100644 index 2d9dafc..0000000 --- a/src/taglib/bindings/c/CMakeLists.txt +++ /dev/null @@ -1,68 +0,0 @@ -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/toolkit - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/asf - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/vorbis - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/flac - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/flac - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpc - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mp4 - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg/id3v2 - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg/id3v2/frames - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/wavpack - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/speex - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/trueaudio -) - -set(tag_c_HDRS tag_c.h) - -add_library(tag_c tag_c.cpp ${tag_c_HDRS}) - -target_link_libraries(tag_c tag) -set_target_properties(tag_c PROPERTIES PUBLIC_HEADER "${tag_c_HDRS}") -if(BUILD_FRAMEWORK) - set_target_properties(tag_c PROPERTIES FRAMEWORK TRUE) -endif() - -# On Solaris we need to explicitly add the C++ standard and runtime -# libraries to the libs used by the C bindings, because those C bindings -# themselves won't pull in the C++ libs -- and if a C application is -# using the C bindings then we get link errors. -check_library_exists(Crun __RTTI___ "" HAVE_CRUN_LIB) -if(HAVE_CRUN_LIB) - # Which libraries to link depends critically on which - # STL version is going to be used by your application - # and which runtime is in use. While Crun is pretty much - # the only game in town, the three available STLs -- Cstd, - # stlport4 and stdcxx -- make this a mess. The KDE-Solaris - # team supports stdcxx (Apache RogueWave stdcxx 4.1.3). - - # According to http://bugs.kde.org/show_bug.cgi?id=215225 the library can have the following two names: - find_library(ROGUEWAVE_STDCXX_LIBRARY NAMES stdcxx4 stdcxx) - if(NOT ROGUEWAVE_STDCXX_LIBRARY) - message(FATAL_ERROR "Did not find supported STL library (tried stdcxx4 and stdcxx)") - endif() - target_link_libraries(tag_c ${ROGUEWAVE_STDCXX_LIBRARY} Crun) -endif() - -set_target_properties(tag_c PROPERTIES - VERSION 0.0.0 - SOVERSION 0 - DEFINE_SYMBOL MAKE_TAGLIB_C_LIB - INSTALL_NAME_DIR ${LIB_INSTALL_DIR} -) -install(TARGETS tag_c - FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} - LIBRARY DESTINATION ${LIB_INSTALL_DIR} - RUNTIME DESTINATION ${BIN_INSTALL_DIR} - ARCHIVE DESTINATION ${LIB_INSTALL_DIR} - PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR}/taglib -) - -if(NOT WIN32 AND NOT BUILD_FRAMEWORK) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/taglib_c.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) -endif() - diff --git a/src/taglib/bindings/c/tag_c.cpp b/src/taglib/bindings/c/tag_c.cpp deleted file mode 100644 index 2ae8c7d..0000000 --- a/src/taglib/bindings/c/tag_c.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * - * USA * - ***************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tag_c.h" - -using namespace TagLib; - -static List strings; -static bool unicodeStrings = true; -static bool stringManagementEnabled = true; - -void taglib_set_strings_unicode(BOOL unicode) -{ - unicodeStrings = bool(unicode); -} - -void taglib_set_string_management_enabled(BOOL management) -{ - stringManagementEnabled = bool(management); -} - -void taglib_free(void* pointer) -{ - free(pointer); -} - -//////////////////////////////////////////////////////////////////////////////// -// TagLib::File wrapper -//////////////////////////////////////////////////////////////////////////////// - -TagLib_File *taglib_file_new(const char *filename) -{ - return reinterpret_cast(FileRef::create(filename)); -} - -TagLib_File *taglib_file_new_type(const char *filename, TagLib_File_Type type) -{ - switch(type) { - case TagLib_File_MPEG: - return reinterpret_cast(new MPEG::File(filename)); - case TagLib_File_OggVorbis: - return reinterpret_cast(new Ogg::Vorbis::File(filename)); - case TagLib_File_FLAC: - return reinterpret_cast(new FLAC::File(filename)); - case TagLib_File_MPC: - return reinterpret_cast(new MPC::File(filename)); - case TagLib_File_OggFlac: - return reinterpret_cast(new Ogg::FLAC::File(filename)); - case TagLib_File_WavPack: - return reinterpret_cast(new WavPack::File(filename)); - case TagLib_File_Speex: - return reinterpret_cast(new Ogg::Speex::File(filename)); - case TagLib_File_TrueAudio: - return reinterpret_cast(new TrueAudio::File(filename)); - case TagLib_File_MP4: - return reinterpret_cast(new MP4::File(filename)); - case TagLib_File_ASF: - return reinterpret_cast(new ASF::File(filename)); - default: - return 0; - } - - return 0; -} - -void taglib_file_free(TagLib_File *file) -{ - delete reinterpret_cast(file); -} - -BOOL taglib_file_is_valid(const TagLib_File *file) -{ - return reinterpret_cast(file)->isValid(); -} - -TagLib_Tag *taglib_file_tag(const TagLib_File *file) -{ - const File *f = reinterpret_cast(file); - return reinterpret_cast(f->tag()); -} - -const TagLib_AudioProperties *taglib_file_audioproperties(const TagLib_File *file) -{ - const File *f = reinterpret_cast(file); - return reinterpret_cast(f->audioProperties()); -} - -BOOL taglib_file_save(TagLib_File *file) -{ - return reinterpret_cast(file)->save(); -} - -//////////////////////////////////////////////////////////////////////////////// -// TagLib::Tag wrapper -//////////////////////////////////////////////////////////////////////////////// - -char *taglib_tag_title(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = ::strdup(t->title().toCString(unicodeStrings)); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -char *taglib_tag_artist(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = ::strdup(t->artist().toCString(unicodeStrings)); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -char *taglib_tag_album(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = ::strdup(t->album().toCString(unicodeStrings)); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -char *taglib_tag_comment(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = ::strdup(t->comment().toCString(unicodeStrings)); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -char *taglib_tag_genre(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = ::strdup(t->genre().toCString(unicodeStrings)); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -unsigned int taglib_tag_year(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - return t->year(); -} - -unsigned int taglib_tag_track(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - return t->track(); -} - -void taglib_tag_set_title(TagLib_Tag *tag, const char *title) -{ - Tag *t = reinterpret_cast(tag); - t->setTitle(String(title, unicodeStrings ? String::UTF8 : String::Latin1)); -} - -void taglib_tag_set_artist(TagLib_Tag *tag, const char *artist) -{ - Tag *t = reinterpret_cast(tag); - t->setArtist(String(artist, unicodeStrings ? String::UTF8 : String::Latin1)); -} - -void taglib_tag_set_album(TagLib_Tag *tag, const char *album) -{ - Tag *t = reinterpret_cast(tag); - t->setAlbum(String(album, unicodeStrings ? String::UTF8 : String::Latin1)); -} - -void taglib_tag_set_comment(TagLib_Tag *tag, const char *comment) -{ - Tag *t = reinterpret_cast(tag); - t->setComment(String(comment, unicodeStrings ? String::UTF8 : String::Latin1)); -} - -void taglib_tag_set_genre(TagLib_Tag *tag, const char *genre) -{ - Tag *t = reinterpret_cast(tag); - t->setGenre(String(genre, unicodeStrings ? String::UTF8 : String::Latin1)); -} - -void taglib_tag_set_year(TagLib_Tag *tag, unsigned int year) -{ - Tag *t = reinterpret_cast(tag); - t->setYear(year); -} - -void taglib_tag_set_track(TagLib_Tag *tag, unsigned int track) -{ - Tag *t = reinterpret_cast(tag); - t->setTrack(track); -} - -void taglib_tag_free_strings() -{ - if(!stringManagementEnabled) - return; - - for(List::Iterator it = strings.begin(); it != strings.end(); ++it) - free(*it); - strings.clear(); -} - -//////////////////////////////////////////////////////////////////////////////// -// TagLib::AudioProperties wrapper -//////////////////////////////////////////////////////////////////////////////// - -int taglib_audioproperties_length(const TagLib_AudioProperties *audioProperties) -{ - const AudioProperties *p = reinterpret_cast(audioProperties); - return p->length(); -} - -int taglib_audioproperties_bitrate(const TagLib_AudioProperties *audioProperties) -{ - const AudioProperties *p = reinterpret_cast(audioProperties); - return p->bitrate(); -} - -int taglib_audioproperties_samplerate(const TagLib_AudioProperties *audioProperties) -{ - const AudioProperties *p = reinterpret_cast(audioProperties); - return p->sampleRate(); -} - -int taglib_audioproperties_channels(const TagLib_AudioProperties *audioProperties) -{ - const AudioProperties *p = reinterpret_cast(audioProperties); - return p->channels(); -} - -void taglib_id3v2_set_default_text_encoding(TagLib_ID3v2_Encoding encoding) -{ - String::Type type = String::Latin1; - - switch(encoding) - { - case TagLib_ID3v2_Latin1: - type = String::Latin1; - break; - case TagLib_ID3v2_UTF16: - type = String::UTF16; - break; - case TagLib_ID3v2_UTF16BE: - type = String::UTF16BE; - break; - case TagLib_ID3v2_UTF8: - type = String::UTF8; - break; - } - - ID3v2::FrameFactory::instance()->setDefaultTextEncoding(type); -} diff --git a/src/taglib/bindings/c/tag_c.h b/src/taglib/bindings/c/tag_c.h deleted file mode 100644 index 2e8b752..0000000 --- a/src/taglib/bindings/c/tag_c.h +++ /dev/null @@ -1,299 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * - * USA * - ***************************************************************************/ - -#ifndef TAGLIB_TAG_C -#define TAGLIB_TAG_C - -/* Do not include this in the main TagLib documentation. */ -#ifndef DO_NOT_DOCUMENT - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(TAGLIB_STATIC) -#define TAGLIB_C_EXPORT -#elif defined(_WIN32) || defined(_WIN64) -#ifdef MAKE_TAGLIB_C_LIB -#define TAGLIB_C_EXPORT __declspec(dllexport) -#else -#define TAGLIB_C_EXPORT __declspec(dllimport) -#endif -#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1) -#define TAGLIB_C_EXPORT __attribute__ ((visibility("default"))) -#else -#define TAGLIB_C_EXPORT -#endif - -#ifndef BOOL -#define BOOL int -#endif - -/******************************************************************************* - * [ TagLib C Binding ] - * - * This is an interface to TagLib's "simple" API, meaning that you can read and - * modify media files in a generic, but not specialized way. This is a rough - * representation of TagLib::File and TagLib::Tag, for which the documentation - * is somewhat more complete and worth consulting. - *******************************************************************************/ - -/* - * These are used for type provide some type safety to the C API (as opposed to - * using void *, but pointers to them are simply cast to the corresponding C++ - * types in the implementation. - */ - -typedef struct { int dummy; } TagLib_File; -typedef struct { int dummy; } TagLib_Tag; -typedef struct { int dummy; } TagLib_AudioProperties; - -/*! - * By default all strings coming into or out of TagLib's C API are in UTF8. - * However, it may be desirable for TagLib to operate on Latin1 (ISO-8859-1) - * strings in which case this should be set to FALSE. - */ -TAGLIB_C_EXPORT void taglib_set_strings_unicode(BOOL unicode); - -/*! - * TagLib can keep track of strings that are created when outputting tag values - * and clear them using taglib_tag_clear_strings(). This is enabled by default. - * However if you wish to do more fine grained management of strings, you can do - * so by setting \a management to FALSE. - */ -TAGLIB_C_EXPORT void taglib_set_string_management_enabled(BOOL management); - -/*! - * Explicitly free a string returned from TagLib - */ -TAGLIB_C_EXPORT void taglib_free(void* pointer); - -/******************************************************************************* - * File API - ******************************************************************************/ - -typedef enum { - TagLib_File_MPEG, - TagLib_File_OggVorbis, - TagLib_File_FLAC, - TagLib_File_MPC, - TagLib_File_OggFlac, - TagLib_File_WavPack, - TagLib_File_Speex, - TagLib_File_TrueAudio, - TagLib_File_MP4, - TagLib_File_ASF -} TagLib_File_Type; - -/*! - * Creates a TagLib file based on \a filename. TagLib will try to guess the file - * type. - * - * \returns NULL if the file type cannot be determined or the file cannot - * be opened. - */ -TAGLIB_C_EXPORT TagLib_File *taglib_file_new(const char *filename); - -/*! - * Creates a TagLib file based on \a filename. Rather than attempting to guess - * the type, it will use the one specified by \a type. - */ -TAGLIB_C_EXPORT TagLib_File *taglib_file_new_type(const char *filename, TagLib_File_Type type); - -/*! - * Frees and closes the file. - */ -TAGLIB_C_EXPORT void taglib_file_free(TagLib_File *file); - -/*! - * Returns true if the file is open and readble and valid information for - * the Tag and / or AudioProperties was found. - */ - -TAGLIB_C_EXPORT BOOL taglib_file_is_valid(const TagLib_File *file); - -/*! - * Returns a pointer to the tag associated with this file. This will be freed - * automatically when the file is freed. - */ -TAGLIB_C_EXPORT TagLib_Tag *taglib_file_tag(const TagLib_File *file); - -/*! - * Returns a pointer to the the audio properties associated with this file. This - * will be freed automatically when the file is freed. - */ -TAGLIB_C_EXPORT const TagLib_AudioProperties *taglib_file_audioproperties(const TagLib_File *file); - -/*! - * Saves the \a file to disk. - */ -TAGLIB_C_EXPORT BOOL taglib_file_save(TagLib_File *file); - -/****************************************************************************** - * Tag API - ******************************************************************************/ - -/*! - * Returns a string with this tag's title. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_title(const TagLib_Tag *tag); - -/*! - * Returns a string with this tag's artist. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_artist(const TagLib_Tag *tag); - -/*! - * Returns a string with this tag's album name. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_album(const TagLib_Tag *tag); - -/*! - * Returns a string with this tag's comment. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_comment(const TagLib_Tag *tag); - -/*! - * Returns a string with this tag's genre. - * - * \note By default this string should be UTF8 encoded and its memory should be - * freed using taglib_tag_free_strings(). - */ -TAGLIB_C_EXPORT char *taglib_tag_genre(const TagLib_Tag *tag); - -/*! - * Returns the tag's year or 0 if year is not set. - */ -TAGLIB_C_EXPORT unsigned int taglib_tag_year(const TagLib_Tag *tag); - -/*! - * Returns the tag's track number or 0 if track number is not set. - */ -TAGLIB_C_EXPORT unsigned int taglib_tag_track(const TagLib_Tag *tag); - -/*! - * Sets the tag's title. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_title(TagLib_Tag *tag, const char *title); - -/*! - * Sets the tag's artist. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_artist(TagLib_Tag *tag, const char *artist); - -/*! - * Sets the tag's album. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_album(TagLib_Tag *tag, const char *album); - -/*! - * Sets the tag's comment. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_comment(TagLib_Tag *tag, const char *comment); - -/*! - * Sets the tag's genre. - * - * \note By default this string should be UTF8 encoded. - */ -TAGLIB_C_EXPORT void taglib_tag_set_genre(TagLib_Tag *tag, const char *genre); - -/*! - * Sets the tag's year. 0 indicates that this field should be cleared. - */ -TAGLIB_C_EXPORT void taglib_tag_set_year(TagLib_Tag *tag, unsigned int year); - -/*! - * Sets the tag's track number. 0 indicates that this field should be cleared. - */ -TAGLIB_C_EXPORT void taglib_tag_set_track(TagLib_Tag *tag, unsigned int track); - -/*! - * Frees all of the strings that have been created by the tag. - */ -TAGLIB_C_EXPORT void taglib_tag_free_strings(void); - -/****************************************************************************** - * Audio Properties API - ******************************************************************************/ - -/*! - * Returns the length of the file in seconds. - */ -TAGLIB_C_EXPORT int taglib_audioproperties_length(const TagLib_AudioProperties *audioProperties); - -/*! - * Returns the bitrate of the file in kb/s. - */ -TAGLIB_C_EXPORT int taglib_audioproperties_bitrate(const TagLib_AudioProperties *audioProperties); - -/*! - * Returns the sample rate of the file in Hz. - */ -TAGLIB_C_EXPORT int taglib_audioproperties_samplerate(const TagLib_AudioProperties *audioProperties); - -/*! - * Returns the number of channels in the audio stream. - */ -TAGLIB_C_EXPORT int taglib_audioproperties_channels(const TagLib_AudioProperties *audioProperties); - -/******************************************************************************* - * Special convenience ID3v2 functions - *******************************************************************************/ - -typedef enum { - TagLib_ID3v2_Latin1, - TagLib_ID3v2_UTF16, - TagLib_ID3v2_UTF16BE, - TagLib_ID3v2_UTF8 -} TagLib_ID3v2_Encoding; - -/*! - * This sets the default encoding for ID3v2 frames that are written to tags. - */ - -TAGLIB_C_EXPORT void taglib_id3v2_set_default_text_encoding(TagLib_ID3v2_Encoding encoding); - -#ifdef __cplusplus -} -#endif -#endif /* DO_NOT_DOCUMENT */ -#endif diff --git a/src/taglib/bindings/c/taglib_c.pc.cmake b/src/taglib/bindings/c/taglib_c.pc.cmake deleted file mode 100644 index 61764fc..0000000 --- a/src/taglib/bindings/c/taglib_c.pc.cmake +++ /dev/null @@ -1,12 +0,0 @@ -prefix=${CMAKE_INSTALL_PREFIX} -exec_prefix=${CMAKE_INSTALL_PREFIX} -libdir=${LIB_INSTALL_DIR} -includedir=${INCLUDE_INSTALL_DIR} - - -Name: TagLib C Bindings -Description: Audio meta-data library (C bindings) -Requires: taglib -Version: ${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}.${TAGLIB_LIB_PATCH_VERSION} -Libs: -L${LIB_INSTALL_DIR} -ltag_c -Cflags: -I${INCLUDE_INSTALL_DIR}/taglib diff --git a/src/taglib/cmake/modules/FindCppUnit.cmake b/src/taglib/cmake/modules/FindCppUnit.cmake deleted file mode 100644 index adaaeb6..0000000 --- a/src/taglib/cmake/modules/FindCppUnit.cmake +++ /dev/null @@ -1,69 +0,0 @@ -# - Try to find the libcppunit libraries -# Once done this will define -# -# CppUnit_FOUND - system has libcppunit -# CPPUNIT_INCLUDE_DIR - the libcppunit include directory -# CPPUNIT_LIBRARIES - libcppunit library - -include (MacroEnsureVersion) - -if(NOT CPPUNIT_MIN_VERSION) - SET(CPPUNIT_MIN_VERSION 1.12.0) -endif(NOT CPPUNIT_MIN_VERSION) - -FIND_PROGRAM(CPPUNIT_CONFIG_EXECUTABLE cppunit-config ) - -IF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - - # in cache already - SET(CppUnit_FOUND TRUE) - -ELSE(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - - SET(CPPUNIT_INCLUDE_DIR) - SET(CPPUNIT_LIBRARIES) - - IF(CPPUNIT_CONFIG_EXECUTABLE) - EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_CFLAGS) - EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_LIBRARIES) - EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_INSTALLED_VERSION) - STRING(REGEX REPLACE "-I(.+)" "\\1" CPPUNIT_CFLAGS "${CPPUNIT_CFLAGS}") - ELSE(CPPUNIT_CONFIG_EXECUTABLE) - # in case win32 needs to find it the old way? - FIND_PATH(CPPUNIT_CFLAGS cppunit/TestRunner.h PATHS /usr/include /usr/local/include ) - FIND_LIBRARY(CPPUNIT_LIBRARIES NAMES cppunit PATHS /usr/lib /usr/local/lib ) - # how can we find cppunit version? - MESSAGE (STATUS "Ensure you cppunit installed version is at least ${CPPUNIT_MIN_VERSION}") - SET (CPPUNIT_INSTALLED_VERSION ${CPPUNIT_MIN_VERSION}) - ENDIF(CPPUNIT_CONFIG_EXECUTABLE) - - SET(CPPUNIT_INCLUDE_DIR ${CPPUNIT_CFLAGS} "${CPPUNIT_CFLAGS}/cppunit") - -ENDIF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - -IF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - - SET(CppUnit_FOUND TRUE) - - if(NOT CppUnit_FIND_QUIETLY) - MESSAGE (STATUS "Found cppunit: ${CPPUNIT_LIBRARIES}") - endif(NOT CppUnit_FIND_QUIETLY) - - IF(CPPUNIT_CONFIG_EXECUTABLE) - EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_INSTALLED_VERSION) - ENDIF(CPPUNIT_CONFIG_EXECUTABLE) - - macro_ensure_version( ${CPPUNIT_MIN_VERSION} ${CPPUNIT_INSTALLED_VERSION} CPPUNIT_INSTALLED_VERSION_OK ) - - IF(NOT CPPUNIT_INSTALLED_VERSION_OK) - MESSAGE ("** CppUnit version is too old: found ${CPPUNIT_INSTALLED_VERSION} installed, ${CPPUNIT_MIN_VERSION} or major is required") - SET(CppUnit_FOUND FALSE) - ENDIF(NOT CPPUNIT_INSTALLED_VERSION_OK) - -ELSE(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - - SET(CppUnit_FOUND FALSE CACHE BOOL "Not found cppunit library") - -ENDIF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - -MARK_AS_ADVANCED(CPPUNIT_INCLUDE_DIR CPPUNIT_LIBRARIES) diff --git a/src/taglib/cmake/modules/MacroEnsureVersion.cmake b/src/taglib/cmake/modules/MacroEnsureVersion.cmake deleted file mode 100644 index c6df537..0000000 --- a/src/taglib/cmake/modules/MacroEnsureVersion.cmake +++ /dev/null @@ -1,71 +0,0 @@ -# This macro compares version numbers of the form "x.y.z" -# MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) -# will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION -# where both have to be in a 3-part-version format, leading and trailing -# text is ok, e.g. -# MACRO_ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK) -# which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system - -# Copyright (c) 2006, David Faure, -# -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -MACRO(MACRO_ENSURE_VERSION requested_version found_version var_too_old) - - # parse the parts of the version string - STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_major_vers "${requested_version}") - STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" req_minor_vers "${requested_version}") - STRING(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_patch_vers "${requested_version}") - - STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") - STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" found_minor_vers "${found_version}") - STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_patch_vers "${found_version}") - - # compute an overall version number which can be compared at once - MATH(EXPR req_vers_num "${req_major_vers}*10000 + ${req_minor_vers}*100 + ${req_patch_vers}") - MATH(EXPR found_vers_num "${found_major_vers}*10000 + ${found_minor_vers}*100 + ${found_patch_vers}") - - if (found_vers_num LESS req_vers_num) - set( ${var_too_old} FALSE ) - else (found_vers_num LESS req_vers_num) - set( ${var_too_old} TRUE ) - endif (found_vers_num LESS req_vers_num) - -ENDMACRO(MACRO_ENSURE_VERSION) - - -# This macro compares version numbers of the form "x.y" -# MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) -# will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION -# where both have to be in a 2-part-version format, leading and trailing -# text is ok, e.g. -# MACRO_ENSURE_VERSION( "0.5" "foo 0.6" VERSION_OK) -# which means 0.5 is required and "foo 0.6" is what was found on the system - -# Copyright (c) 2006, David Faure, -# Copyright (c) 2007, Pino Toscano, -# -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -MACRO(MACRO_ENSURE_VERSION2 requested_version found_version var_too_old) - - # parse the parts of the version string - STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+" "\\1" req_major_vers "${requested_version}") - STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)" "\\1" req_minor_vers "${requested_version}") - - STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") - STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+).*" "\\1" found_minor_vers "${found_version}") - - # compute an overall version number which can be compared at once - MATH(EXPR req_vers_num "${req_major_vers}*100 + ${req_minor_vers}") - MATH(EXPR found_vers_num "${found_major_vers}*100 + ${found_minor_vers}") - - if (found_vers_num LESS req_vers_num) - set( ${var_too_old} FALSE ) - else (found_vers_num LESS req_vers_num) - set( ${var_too_old} TRUE ) - endif (found_vers_num LESS req_vers_num) - -ENDMACRO(MACRO_ENSURE_VERSION2) diff --git a/src/taglib/cmake_uninstall.cmake.in b/src/taglib/cmake_uninstall.cmake.in deleted file mode 100644 index 72e030f..0000000 --- a/src/taglib/cmake_uninstall.cmake.in +++ /dev/null @@ -1,21 +0,0 @@ -if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") - message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") -endif() - -file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) -string(REGEX REPLACE "\n" ";" files "${files}") -foreach (file ${files}) - message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") - if (EXISTS "$ENV{DESTDIR}${file}") - execute_process( - COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}" - OUTPUT_VARIABLE rm_out - RESULT_VARIABLE rm_retval - ) - if(NOT ${rm_retval} EQUAL 0) - message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") - endif () - else () - message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") - endif () -endforeach() diff --git a/src/taglib/config.h.cmake b/src/taglib/config.h.cmake deleted file mode 100644 index f8dcbbd..0000000 --- a/src/taglib/config.h.cmake +++ /dev/null @@ -1,37 +0,0 @@ -/* config.h. Generated by cmake from config.h.cmake */ - -/* Indicates the byte order of your target system */ -/* 1 if little-endian, 2 if big-endian. */ -#cmakedefine SYSTEM_BYTEORDER ${SYSTEM_BYTEORDER} - -/* Defined if your compiler supports some byte swap functions */ -#cmakedefine HAVE_GCC_BYTESWAP_16 1 -#cmakedefine HAVE_GCC_BYTESWAP_32 1 -#cmakedefine HAVE_GCC_BYTESWAP_64 1 -#cmakedefine HAVE_GLIBC_BYTESWAP 1 -#cmakedefine HAVE_MSC_BYTESWAP 1 -#cmakedefine HAVE_MAC_BYTESWAP 1 -#cmakedefine HAVE_OPENBSD_BYTESWAP 1 - -/* Defined if your compiler supports codecvt */ -#cmakedefine HAVE_STD_CODECVT 1 - -/* Defined if your compiler supports some atomic operations */ -#cmakedefine HAVE_STD_ATOMIC 1 -#cmakedefine HAVE_BOOST_ATOMIC 1 -#cmakedefine HAVE_GCC_ATOMIC 1 -#cmakedefine HAVE_MAC_ATOMIC 1 -#cmakedefine HAVE_WIN_ATOMIC 1 -#cmakedefine HAVE_IA64_ATOMIC 1 - -/* Defined if your compiler supports some safer version of sprintf */ -#cmakedefine HAVE_SNPRINTF 1 -#cmakedefine HAVE_SPRINTF_S 1 - -/* Defined if you have libz */ -#cmakedefine HAVE_ZLIB 1 - -/* Indicates whether debug messages are shown even in release mode */ -#cmakedefine TRACE_IN_RELEASE 1 - -#cmakedefine TESTS_DIR "@TESTS_DIR@" diff --git a/src/taglib/doc/README b/src/taglib/doc/README deleted file mode 100644 index b2ebd36..0000000 --- a/src/taglib/doc/README +++ /dev/null @@ -1 +0,0 @@ -Run "make docs" in the parent directory to generate the TagLib API documentation. diff --git a/src/taglib/doc/api-footer.html b/src/taglib/doc/api-footer.html deleted file mode 100644 index 9b151ee..0000000 --- a/src/taglib/doc/api-footer.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/taglib/doc/api-header.html b/src/taglib/doc/api-header.html deleted file mode 100644 index ab133c2..0000000 --- a/src/taglib/doc/api-header.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - $title ($projectname) - - - - - -
- - - - - - -
- - -
- - - - - -

TagLib $projectnumber ($title)

- -
-
-
- -
diff --git a/src/taglib/doc/taglib-api.css b/src/taglib/doc/taglib-api.css deleted file mode 100644 index 3fa820e..0000000 --- a/src/taglib/doc/taglib-api.css +++ /dev/null @@ -1,395 +0,0 @@ -body { - font-family: sans-serif; - background: white; - color: black; - margin: 0px; - padding: 15px; -} - -a:link { - font-weight: bold; - text-decoration: none; - color: gray; -} - -a:visited { - font-weight: bold; - text-decoration: none; - color: gray; -} - -a:hover { - color: #cccccc; - text-decoration: underline; -} - -a:active { - color: #cccccc; - text-decoration: underline; -} - -img { - border-style: none; -} - -h1 { - font-family: sans-serif; -} - -h2 { - font-family: sans-serif; -} - -h3 { - font-family: sans-serif; -} - -/* container */ - -#container { - position: absolute; - border-width: thin; - border-style: solid; - width: 95%; -} - -/* intro */ - -#intro { - padding: 5px; - margin: 0px; - background: #cccccc; - border-width: medium; - border-style: solid; -} - -#intro h1 { - margin: 5px; - padding: 5px; -} - -/* links */ - -#links { - font-size: x-small; - vertical-align: bottom; -} - -#links a { - border-width: thin; - border-style: dotted; - border-color: white; - /* margin: 0px 10px 0px 0px; */ - margin: 1px; - padding: 3px; - line-height: 230% -} - -#links a:hover { - color: black; - text-decoration: underline; -} - -#links h3 { - outline-width: thin; - border-style: solid; - padding: 2px; - margin: 3px 0px 3px 0px; -} - -/* menu */ - -#menu h3 { - text-align: center; -} - -/* text */ - -#text { - margin: 0px; - padding: 5px 5px 0px 5px; - float: left; -} - -#text h3 { - border-width: thin; - border-style: solid; - padding: 2px; - margin: 3px 0px 3px 0px; -} - -#text li { - margin: 0px 0px 10px 0px; -} - -#text ul { - margin: 5px; - padding: 0px 0px 0px 20px; -} - -#leftcolumn { - float: left; - width: 300px; - margin: 0px 10px 0px 0px; - padding: 0px; -} - -#rightcolumn { - float: right; - width: 210px; - margin: 0px; - padding: 0px; -} - -/* vspacer */ - -.vspacer { - height: 10px; -} - -.silver { - border-width: thin; - border-color: black; - border-style: solid; - background: #cccccc; -} - -a.code { - text-decoration: none; - font-weight: normal; - color: #4444ee -} - -a.codeRef { - font-weight: normal; - color: #4444ee -} - -div.fragment { - width: 98%; - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - padding-left: 4px; - margin: 4px; -} - -div.ah { - background-color: black; - font-weight: bold; color: #ffffff; - margin-bottom: 3px; - margin-top: 3px -} - -#text td { - width: auto; -} - -div.memdoc { - margin-top: 0px; - margin-bottom: 20px; - padding: 10px 10px 10px 40px; -} - -div.memproto { - border: thin solid black; - background-color: #f2f2ff; - width: 100%; - margin-top: 20px; - padding-top: 10px; - padding-bottom: 10px; -} - -td.paramtype { - color: #602020; -} - -table.memname { - font-weight: bold; -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold -} - -div.groupText { - margin-left: 16px; - font-style: italic; - font-size: smaller -} - -body { - background: white; - color: black; - margin-right: 20px; - margin-left: 20px; -} - -td.indexkey { - background-color: #eeeeff; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} - -td.indexvalue { - background-color: #eeeeff; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} - -tr.memlist { - background-color: #f0f0f0; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -.mdTable { - border: 1px solid #868686; - background-color: #f2f2ff; -} - -.mdRow { - padding: 8px 20px; -} - -.mdescLeft { - font-size: smaller; - font-family: Arial, Helvetica, sans-serif; - background-color: #FAFAFA; - padding-left: 8px; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; -} - -.mdescRight { - font-size: smaller; - font-family: Arial, Helvetica, sans-serif; - font-style: italic; - background-color: #FAFAFA; - padding-left: 4px; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; - padding-bottom: 0px; - padding-right: 8px; -} - -.memItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-style: solid; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-family: Geneva, Arial, Helvetica, sans-serif; - font-size: 12px; -} - -.memItemRight { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-style: solid; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-family: Geneva, Arial, Helvetica, sans-serif; - font-size: 13px; -} - -.search { - color: #0000ee; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #eeeeff; -} - -td.tiny { - font-size: 75%; -} diff --git a/src/taglib/doc/taglib.png b/src/taglib/doc/taglib.png deleted file mode 100644 index 2791cc887670ef22450bb7f35686912c8ebf1af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2748 zcmeHJ`!^Ge8(;2WY-L&`>?<+KB}AdomW>SC3yDgZEawX$K{m4<5!+inxP@llC zU1rZ5-~s?5U5@7osNJD|;vWb8e;w%B$_m}xeu<33;sJX^M8(7#3n_E~Stj{7*=WNgz zTf6i2SO-TZ9G>8O!PU*(<0A1A>9Uu%kFTG9Kwwbtm8&74Vd0TcH=-#wV`6{16&FuU zNK8sjrKhFe&iMTfBQq;ICpYhI{=LGY;*!$)56W2O6_r&FA63^puC1$o^0c9`srgw; zYg_wsc1LGd_a8mIFZ%iiUJkx~!{H7Mza4r1;UjNs{NEFwCa0!nX6NQVFDx!Ce_2^w z`}SQR{IULXb8GuoK}4+#03eZ#L0S=R@K%a8TnN62-U#cQ zxshDVk#FbxU`Lz@(~J1&+eu_Ot!Zb!u*!iy;VrIT89^4V-MpyV4f}5Z6)S#xz44_nH)ZwLEX1m@h{jx#s^%-I12Uo{L;lYU>S6TgGhdGB z-86#$!MWVF=DePxCFXUv3MhxFgQId@QM>wAZS7>TD&n;AB}hM;sMl-S_gyQtOMwwaMxEZ(SGTen$NAH(Dr;;wTMLm2rm%dEFDtTox@-@yo_8=#PTFHV7~^?_z$R zxYn}=x)!a^d?VBXN`@a&+4V)@HnEI?SU4HG803Max{73rO=A^u6V+|LA$#@%CB=*IUN&JV>%TnPaWua;K8=X) zpSvd-Td5$wDKjt8&kuf+pJ>TL+qB&R?R2y>PS1{tx#f1xCAyl)A(-a{^sG4}pTUpl ztg3d6gXi+mVt)PemeH1eoYGiIzLX?oAlxv0CO2Tt2$3mtQ6CBPvdnoJ@5=iiQW;6p zc>9sOuYQ&Ylk4RZvdLE0c#sqmBw7x|aAJkrfxun-y0rEm@2t7Il^velx+l*`Qw)L2 z)`j*t2l*aEy9oZ)V-~)2jw||+ifBAL3^{cV3xm5QqFn!1=#fWOGe<@0y>#7aOb9Jd z!s*C3e4j~aj#e^~#w3Az7ur%2)4Wbpj*fhVUN6Wxbu4;*IfD{0% zQoa$@Udr-hi3Y79kklmJ=+Y4wsH+lFP@NgTzB48X%f#J#Nl6_S`s?6_dSO6N;J+5P zu^UPj*dEX5-;B6#=a%-SM}qHPr}dZ-ykfMyaF`YuAyW>Vm7?dh$lnh8;Nq`WWR{&b zBBsfxt^F7=KRqz~+RzDK#!s)vj zsatPb7)ztssHyH0VO`s+bIM6K6o8->F0jXseoN3oW9__3hbWIj{JeF=U4}s5lSVi# zw#t+TqrY&FE*YfDoD}>?lf~0)V&KF4hJpzmTg#Ul{||Qvj_p^UPjnwVWj4Ru^F)Xv zLGjvWoABrk%7>zpsxf$<+mDnCq9BWrcdZYyA%PApFWC2Z%3WSOK?QL$I3(B|F3WH? z4WfZQyeVn5U4GqoK{c)PD!)VUOcm3K|6JJ^PhZK+@oaI_KdM+%MOa|b23AVKQInP^ zYGNnIs!l>mJ>D7==NK<_P6bJ}Z}6~cAe#><8Q*GOw&NI@heJfQF$9%LP_DFP-r zcOWM=?B30%IXuiaEYmisp4m}nFn(~G&yB}u3|IbQ*v^zb9NK<*e+SU)oHl8-*H!25p8|uzA|G3m GsDA+=UdN#T diff --git a/src/taglib/examples/CMakeLists.txt b/src/taglib/examples/CMakeLists.txt deleted file mode 100644 index 17d4bd6..0000000 --- a/src/taglib/examples/CMakeLists.txt +++ /dev/null @@ -1,50 +0,0 @@ -if(BUILD_EXAMPLES) -INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../taglib - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/toolkit - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ape - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v1 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2 - ${CMAKE_CURRENT_SOURCE_DIR}/../bindings/c/ ) - -if(ENABLE_STATIC) - add_definitions(-DTAGLIB_STATIC) -endif(ENABLE_STATIC) - -########### next target ############### - -ADD_EXECUTABLE(tagreader tagreader.cpp) - -TARGET_LINK_LIBRARIES(tagreader tag ) - - -########### next target ############### - -ADD_EXECUTABLE(tagreader_c tagreader_c.c) - -TARGET_LINK_LIBRARIES(tagreader_c tag_c ) - - -########### next target ############### - -ADD_EXECUTABLE(tagwriter tagwriter.cpp) - -TARGET_LINK_LIBRARIES(tagwriter tag ) - - -########### next target ############### - -ADD_EXECUTABLE(framelist framelist.cpp) - -TARGET_LINK_LIBRARIES(framelist tag ) - - -########### next target ############### - -ADD_EXECUTABLE(strip-id3v1 strip-id3v1.cpp) - -TARGET_LINK_LIBRARIES(strip-id3v1 tag ) - - -endif(BUILD_EXAMPLES) - diff --git a/src/taglib/examples/framelist.cpp b/src/taglib/examples/framelist.cpp deleted file mode 100644 index 679aa39..0000000 --- a/src/taglib/examples/framelist.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#include - -#include - -#include -#include -#include - -#include - -#include - -using namespace std; -using namespace TagLib; - -int main(int argc, char *argv[]) -{ - // process the command line args - - - for(int i = 1; i < argc; i++) { - - cout << "******************** \"" << argv[i] << "\"********************" << endl; - - MPEG::File f(argv[i]); - - ID3v2::Tag *id3v2tag = f.ID3v2Tag(); - - if(id3v2tag) { - - cout << "ID3v2." - << id3v2tag->header()->majorVersion() - << "." - << id3v2tag->header()->revisionNumber() - << ", " - << id3v2tag->header()->tagSize() - << " bytes in tag" - << endl; - - ID3v2::FrameList::ConstIterator it = id3v2tag->frameList().begin(); - for(; it != id3v2tag->frameList().end(); it++) - cout << (*it)->frameID() << " - \"" << (*it)->toString() << "\"" << endl; - } - else - cout << "file does not have a valid id3v2 tag" << endl; - - cout << endl << "ID3v1" << endl; - - ID3v1::Tag *id3v1tag = f.ID3v1Tag(); - - if(id3v1tag) { - cout << "title - \"" << id3v1tag->title() << "\"" << endl; - cout << "artist - \"" << id3v1tag->artist() << "\"" << endl; - cout << "album - \"" << id3v1tag->album() << "\"" << endl; - cout << "year - \"" << id3v1tag->year() << "\"" << endl; - cout << "comment - \"" << id3v1tag->comment() << "\"" << endl; - cout << "track - \"" << id3v1tag->track() << "\"" << endl; - cout << "genre - \"" << id3v1tag->genre() << "\"" << endl; - } - else - cout << "file does not have a valid id3v1 tag" << endl; - - APE::Tag *ape = f.APETag(); - - cout << endl << "APE" << endl; - - if(ape) { - for(APE::ItemListMap::ConstIterator it = ape->itemListMap().begin(); - it != ape->itemListMap().end(); ++it) - { - if((*it).second.type() != APE::Item::Binary) - cout << (*it).first << " - \"" << (*it).second.toString() << "\"" << endl; - else - cout << (*it).first << " - Binary data (" << (*it).second.binaryData().size() << " bytes)" << endl; - } - } - else - cout << "file does not have a valid APE tag" << endl; - - cout << endl; - } -} diff --git a/src/taglib/examples/strip-id3v1.cpp b/src/taglib/examples/strip-id3v1.cpp deleted file mode 100644 index ab36d71..0000000 --- a/src/taglib/examples/strip-id3v1.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -using namespace TagLib; - -int main(int argc, char *argv[]) -{ - for(int i = 1; i < argc; i++) { - - std::cout << "******************** Stripping ID3v1 Tag From: \"" << argv[i] << "\"********************" << std::endl; - - MPEG::File f(argv[i]); - f.strip(MPEG::File::ID3v1); - } -} diff --git a/src/taglib/examples/tagreader.cpp b/src/taglib/examples/tagreader.cpp deleted file mode 100644 index cc978eb..0000000 --- a/src/taglib/examples/tagreader.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -#include -#include -#include - -using namespace std; - -TagLib::String formatSeconds(int seconds) -{ - char secondsString[3]; - sprintf(secondsString, "%02i", seconds); - return secondsString; -} - -int main(int argc, char *argv[]) -{ - for(int i = 1; i < argc; i++) { - - cout << "******************** \"" << argv[i] << "\" ********************" << endl; - - TagLib::FileRef f(argv[i]); - - if(!f.isNull() && f.tag()) { - - TagLib::Tag *tag = f.tag(); - - cout << "-- TAG (basic) --" << endl; - cout << "title - \"" << tag->title() << "\"" << endl; - cout << "artist - \"" << tag->artist() << "\"" << endl; - cout << "album - \"" << tag->album() << "\"" << endl; - cout << "year - \"" << tag->year() << "\"" << endl; - cout << "comment - \"" << tag->comment() << "\"" << endl; - cout << "track - \"" << tag->track() << "\"" << endl; - cout << "genre - \"" << tag->genre() << "\"" << endl; - - TagLib::PropertyMap tags = f.file()->properties(); - - unsigned int longest = 0; - for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { - if (i->first.size() > longest) { - longest = i->first.size(); - } - } - - cout << "-- TAG (properties) --" << endl; - for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { - for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j) { - cout << left << std::setw(longest) << i->first << " - " << '"' << *j << '"' << endl; - } - } - - } - - if(!f.isNull() && f.audioProperties()) { - - TagLib::AudioProperties *properties = f.audioProperties(); - - int seconds = properties->length() % 60; - int minutes = (properties->length() - seconds) / 60; - - cout << "-- AUDIO --" << endl; - cout << "bitrate - " << properties->bitrate() << endl; - cout << "sample rate - " << properties->sampleRate() << endl; - cout << "channels - " << properties->channels() << endl; - cout << "length - " << minutes << ":" << formatSeconds(seconds) << endl; - } - } - return 0; -} diff --git a/src/taglib/examples/tagreader_c.c b/src/taglib/examples/tagreader_c.c deleted file mode 100644 index 0436992..0000000 --- a/src/taglib/examples/tagreader_c.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#ifndef FALSE -#define FALSE 0 -#endif - -int main(int argc, char *argv[]) -{ - int i; - int seconds; - int minutes; - TagLib_File *file; - TagLib_Tag *tag; - const TagLib_AudioProperties *properties; - - taglib_set_strings_unicode(FALSE); - - for(i = 1; i < argc; i++) { - printf("******************** \"%s\" ********************\n", argv[i]); - - file = taglib_file_new(argv[i]); - - if(file == NULL) - break; - - tag = taglib_file_tag(file); - properties = taglib_file_audioproperties(file); - - if(tag != NULL) { - printf("-- TAG --\n"); - printf("title - \"%s\"\n", taglib_tag_title(tag)); - printf("artist - \"%s\"\n", taglib_tag_artist(tag)); - printf("album - \"%s\"\n", taglib_tag_album(tag)); - printf("year - \"%i\"\n", taglib_tag_year(tag)); - printf("comment - \"%s\"\n", taglib_tag_comment(tag)); - printf("track - \"%i\"\n", taglib_tag_track(tag)); - printf("genre - \"%s\"\n", taglib_tag_genre(tag)); - } - - if(properties != NULL) { - seconds = taglib_audioproperties_length(properties) % 60; - minutes = (taglib_audioproperties_length(properties) - seconds) / 60; - - printf("-- AUDIO --\n"); - printf("bitrate - %i\n", taglib_audioproperties_bitrate(properties)); - printf("sample rate - %i\n", taglib_audioproperties_samplerate(properties)); - printf("channels - %i\n", taglib_audioproperties_channels(properties)); - printf("length - %i:%02i\n", minutes, seconds); - } - - taglib_tag_free_strings(); - taglib_file_free(file); - } - - return 0; -} diff --git a/src/taglib/examples/tagwriter.cpp b/src/taglib/examples/tagwriter.cpp deleted file mode 100644 index 63163fb..0000000 --- a/src/taglib/examples/tagwriter.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright (C) 2004 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -using namespace std; - -bool isArgument(const char *s) -{ - return strlen(s) == 2 && s[0] == '-'; -} - -bool isFile(const char *s) -{ - struct stat st; -#ifdef _WIN32 - return ::stat(s, &st) == 0 && (st.st_mode & (S_IFREG)); -#else - return ::stat(s, &st) == 0 && (st.st_mode & (S_IFREG | S_IFLNK)); -#endif -} - -void usage() -{ - cout << endl; - cout << "Usage: tagwriter " << endl; - cout << endl; - cout << "Where the valid fields are:" << endl; - cout << " -t " << endl; - cout << " -a <artist>" << endl; - cout << " -A <album>" << endl; - cout << " -c <comment>" << endl; - cout << " -g <genre>" << endl; - cout << " -y <year>" << endl; - cout << " -T <track>" << endl; - cout << endl; - - exit(1); -} - -int main(int argc, char *argv[]) -{ - TagLib::List<TagLib::FileRef> fileList; - - while(argc > 0 && isFile(argv[argc - 1])) { - - TagLib::FileRef f(argv[argc - 1]); - - if(!f.isNull() && f.tag()) - fileList.append(f); - - argc--; - } - - if(fileList.isEmpty()) - usage(); - - for(int i = 1; i < argc - 1; i += 2) { - - if(isArgument(argv[i]) && i + 1 < argc && !isArgument(argv[i + 1])) { - - char field = argv[i][1]; - TagLib::String value = argv[i + 1]; - - TagLib::List<TagLib::FileRef>::Iterator it; - for(it = fileList.begin(); it != fileList.end(); ++it) { - - TagLib::Tag *t = (*it).tag(); - - switch (field) { - case 't': - t->setTitle(value); - break; - case 'a': - t->setArtist(value); - break; - case 'A': - t->setAlbum(value); - break; - case 'c': - t->setComment(value); - break; - case 'g': - t->setGenre(value); - break; - case 'y': - t->setYear(value.toInt()); - break; - case 'T': - t->setTrack(value.toInt()); - break; - default: - usage(); - break; - } - } - } - else - usage(); - } - - TagLib::List<TagLib::FileRef>::Iterator it; - for(it = fileList.begin(); it != fileList.end(); ++it) - (*it).file()->save(); - - return 0; -} diff --git a/src/taglib/taglib-config.cmake b/src/taglib/taglib-config.cmake deleted file mode 100644 index 2c2d2db..0000000 --- a/src/taglib/taglib-config.cmake +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh - -usage() -{ - echo "usage: $0 [OPTIONS]" -cat << EOH - -options: - [--libs] - [--cflags] - [--version] - [--prefix] -EOH - exit 1; -} - -prefix=${CMAKE_INSTALL_PREFIX} -exec_prefix=${CMAKE_INSTALL_PREFIX} -libdir=${LIB_INSTALL_DIR} -includedir=${INCLUDE_INSTALL_DIR} - -flags="" - -if test $# -eq 0 ; then - usage -fi - -while test $# -gt 0 -do - case $1 in - --libs) - flags="$flags -L$libdir -ltag" - ;; - --cflags) - flags="$flags -I$includedir/taglib" - ;; - --version) - echo ${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}.${TAGLIB_LIB_PATCH_VERSION} - ;; - --prefix) - echo $prefix - ;; - *) - echo "$0: unknown option $1" - echo - usage - ;; - esac - shift -done - -if test -n "$flags" -then - echo $flags -fi diff --git a/src/taglib/taglib-config.cmd.cmake b/src/taglib/taglib-config.cmd.cmake deleted file mode 100644 index 3e2b1cd..0000000 --- a/src/taglib/taglib-config.cmd.cmake +++ /dev/null @@ -1,36 +0,0 @@ -@echo off -goto beginning - * - * It is what it is, you can do with it as you please. - * - * Just don't blame me if it teaches your computer to smoke! - * - * -Enjoy - * fh :)_~ - * -:beginning -if /i "%1#" == "--libs#" goto doit -if /i "%1#" == "--cflags#" goto doit -if /i "%1#" == "--version#" goto doit -if /i "%1#" == "--prefix#" goto doit - -echo "usage: %0 [OPTIONS]" -echo [--libs] -echo [--cflags] -echo [--version] -echo [--prefix] -goto theend - - * - * NOTE: Windows does not assume libraries are prefixed with 'lib'. - * NOTE: If '-llibtag' is the last element, it is easily appended in the users installation/makefile process - * to allow for static, shared or debug builds. - * It would be preferable if the top level CMakeLists.txt provided the library name during config. ?? -:doit -if /i "%1#" == "--libs#" echo -L${LIB_INSTALL_DIR} -llibtag -if /i "%1#" == "--cflags#" echo -I${INCLUDE_INSTALL_DIR}/taglib -if /i "%1#" == "--version#" echo ${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}.${TAGLIB_LIB_PATCH_VERSION} -if /i "%1#" == "--prefix#" echo ${CMAKE_INSTALL_PREFIX} - -:theend - diff --git a/src/taglib/taglib.pc.cmake b/src/taglib/taglib.pc.cmake deleted file mode 100644 index 909b8fc..0000000 --- a/src/taglib/taglib.pc.cmake +++ /dev/null @@ -1,11 +0,0 @@ -prefix=${CMAKE_INSTALL_PREFIX} -exec_prefix=${CMAKE_INSTALL_PREFIX} -libdir=${LIB_INSTALL_DIR} -includedir=${INCLUDE_INSTALL_DIR} - -Name: TagLib -Description: Audio meta-data library -Requires: -Version: ${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}.${TAGLIB_LIB_PATCH_VERSION} -Libs: -L${LIB_INSTALL_DIR} -ltag -Cflags: -I${INCLUDE_INSTALL_DIR}/taglib diff --git a/src/taglib/taglib/CMakeLists.txt b/src/taglib/taglib/CMakeLists.txt deleted file mode 100644 index 23fa60d..0000000 --- a/src/taglib/taglib/CMakeLists.txt +++ /dev/null @@ -1,335 +0,0 @@ -set(CMAKE_INCLUDE_CURRENT_DIR ON) -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/toolkit - ${CMAKE_CURRENT_SOURCE_DIR}/asf - ${CMAKE_CURRENT_SOURCE_DIR}/mpeg - ${CMAKE_CURRENT_SOURCE_DIR}/ogg - ${CMAKE_CURRENT_SOURCE_DIR}/ogg/flac - ${CMAKE_CURRENT_SOURCE_DIR}/flac - ${CMAKE_CURRENT_SOURCE_DIR}/mpc - ${CMAKE_CURRENT_SOURCE_DIR}/mp4 - ${CMAKE_CURRENT_SOURCE_DIR}/ogg/vorbis - ${CMAKE_CURRENT_SOURCE_DIR}/ogg/speex - ${CMAKE_CURRENT_SOURCE_DIR}/ogg/opus - ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v2 - ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v2/frames - ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v1 - ${CMAKE_CURRENT_SOURCE_DIR}/ape - ${CMAKE_CURRENT_SOURCE_DIR}/wavpack - ${CMAKE_CURRENT_SOURCE_DIR}/trueaudio - ${CMAKE_CURRENT_SOURCE_DIR}/riff - ${CMAKE_CURRENT_SOURCE_DIR}/riff/aiff - ${CMAKE_CURRENT_SOURCE_DIR}/riff/wav - ${CMAKE_CURRENT_SOURCE_DIR}/mod - ${CMAKE_CURRENT_SOURCE_DIR}/s3m - ${CMAKE_CURRENT_SOURCE_DIR}/it - ${CMAKE_CURRENT_SOURCE_DIR}/xm -) - -if(ZLIB_FOUND) - include_directories(${ZLIB_INCLUDE_DIR}) -endif() - -set(tag_HDRS - tag.h - fileref.h - audioproperties.h - taglib_export.h - ${CMAKE_BINARY_DIR}/taglib_config.h - toolkit/taglib.h - toolkit/tstring.h - toolkit/tlist.h - toolkit/tlist.tcc - toolkit/tstringlist.h - toolkit/tbytevector.h - toolkit/tbytevectorlist.h - toolkit/tbytevectorstream.h - toolkit/tiostream.h - toolkit/tfile.h - toolkit/tfilestream.h - toolkit/tmap.h - toolkit/tmap.tcc - toolkit/tpropertymap.h - toolkit/trefcounter.h - toolkit/tdebuglistener.h - mpeg/mpegfile.h - mpeg/mpegproperties.h - mpeg/mpegheader.h - mpeg/xingheader.h - mpeg/id3v1/id3v1tag.h - mpeg/id3v1/id3v1genres.h - mpeg/id3v2/id3v2extendedheader.h - mpeg/id3v2/id3v2frame.h - mpeg/id3v2/id3v2header.h - mpeg/id3v2/id3v2synchdata.h - mpeg/id3v2/id3v2footer.h - mpeg/id3v2/id3v2framefactory.h - mpeg/id3v2/id3v2tag.h - mpeg/id3v2/frames/attachedpictureframe.h - mpeg/id3v2/frames/commentsframe.h - mpeg/id3v2/frames/generalencapsulatedobjectframe.h - mpeg/id3v2/frames/ownershipframe.h - mpeg/id3v2/frames/popularimeterframe.h - mpeg/id3v2/frames/privateframe.h - mpeg/id3v2/frames/relativevolumeframe.h - mpeg/id3v2/frames/textidentificationframe.h - mpeg/id3v2/frames/uniquefileidentifierframe.h - mpeg/id3v2/frames/unknownframe.h - mpeg/id3v2/frames/unsynchronizedlyricsframe.h - mpeg/id3v2/frames/urllinkframe.h - ogg/oggfile.h - ogg/oggpage.h - ogg/oggpageheader.h - ogg/xiphcomment.h - ogg/vorbis/vorbisfile.h - ogg/vorbis/vorbisproperties.h - ogg/flac/oggflacfile.h - ogg/speex/speexfile.h - ogg/speex/speexproperties.h - ogg/opus/opusfile.h - ogg/opus/opusproperties.h - flac/flacfile.h - flac/flacpicture.h - flac/flacproperties.h - flac/flacmetadatablock.h - ape/apefile.h - ape/apeproperties.h - ape/apetag.h - ape/apefooter.h - ape/apeitem.h - mpc/mpcfile.h - mpc/mpcproperties.h - wavpack/wavpackfile.h - wavpack/wavpackproperties.h - trueaudio/trueaudiofile.h - trueaudio/trueaudioproperties.h - riff/rifffile.h - riff/aiff/aifffile.h - riff/aiff/aiffproperties.h - riff/wav/wavfile.h - riff/wav/wavproperties.h - riff/wav/infotag.h - asf/asffile.h - asf/asfproperties.h - asf/asftag.h - asf/asfattribute.h - asf/asfpicture.h - mp4/mp4file.h - mp4/mp4atom.h - mp4/mp4tag.h - mp4/mp4item.h - mp4/mp4properties.h - mp4/mp4coverart.h - mod/modfilebase.h - mod/modfile.h - mod/modtag.h - mod/modproperties.h - it/itfile.h - it/itproperties.h - s3m/s3mfile.h - s3m/s3mproperties.h - xm/xmfile.h - xm/xmproperties.h -) - -set(mpeg_SRCS - mpeg/mpegfile.cpp - mpeg/mpegproperties.cpp - mpeg/mpegheader.cpp - mpeg/xingheader.cpp -) - -set(id3v1_SRCS - mpeg/id3v1/id3v1tag.cpp - mpeg/id3v1/id3v1genres.cpp -) - -set(id3v2_SRCS - mpeg/id3v2/id3v2framefactory.cpp - mpeg/id3v2/id3v2synchdata.cpp - mpeg/id3v2/id3v2tag.cpp - mpeg/id3v2/id3v2header.cpp - mpeg/id3v2/id3v2frame.cpp - mpeg/id3v2/id3v2footer.cpp - mpeg/id3v2/id3v2extendedheader.cpp - ) - -set(frames_SRCS - mpeg/id3v2/frames/attachedpictureframe.cpp - mpeg/id3v2/frames/commentsframe.cpp - mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp - mpeg/id3v2/frames/ownershipframe.cpp - mpeg/id3v2/frames/popularimeterframe.cpp - mpeg/id3v2/frames/privateframe.cpp - mpeg/id3v2/frames/relativevolumeframe.cpp - mpeg/id3v2/frames/textidentificationframe.cpp - mpeg/id3v2/frames/uniquefileidentifierframe.cpp - mpeg/id3v2/frames/unknownframe.cpp - mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp - mpeg/id3v2/frames/urllinkframe.cpp -) - -set(ogg_SRCS - ogg/oggfile.cpp - ogg/oggpage.cpp - ogg/oggpageheader.cpp - ogg/xiphcomment.cpp -) - -set(vorbis_SRCS - ogg/vorbis/vorbisfile.cpp - ogg/vorbis/vorbisproperties.cpp -) - -set(flacs_SRCS - flac/flacfile.cpp - flac/flacpicture.cpp - flac/flacproperties.cpp - flac/flacmetadatablock.cpp - flac/flacunknownmetadatablock.cpp -) - -set(oggflacs_SRCS - ogg/flac/oggflacfile.cpp -) - -set(mpc_SRCS - mpc/mpcfile.cpp - mpc/mpcproperties.cpp -) - -set(mp4_SRCS - mp4/mp4file.cpp - mp4/mp4atom.cpp - mp4/mp4tag.cpp - mp4/mp4item.cpp - mp4/mp4properties.cpp - mp4/mp4coverart.cpp -) - -set(ape_SRCS - ape/apetag.cpp - ape/apefooter.cpp - ape/apeitem.cpp - ape/apefile.cpp - ape/apeproperties.cpp -) - -set(wavpack_SRCS - wavpack/wavpackfile.cpp - wavpack/wavpackproperties.cpp -) - -set(speex_SRCS - ogg/speex/speexfile.cpp - ogg/speex/speexproperties.cpp -) - -set(opus_SRCS - ogg/opus/opusfile.cpp - ogg/opus/opusproperties.cpp -) - -set(trueaudio_SRCS - trueaudio/trueaudiofile.cpp - trueaudio/trueaudioproperties.cpp -) - -set(asf_SRCS - asf/asftag.cpp - asf/asffile.cpp - asf/asfproperties.cpp - asf/asfattribute.cpp - asf/asfpicture.cpp -) - -set(riff_SRCS - riff/rifffile.cpp -) - -set(aiff_SRCS - riff/aiff/aifffile.cpp - riff/aiff/aiffproperties.cpp -) - -set(wav_SRCS - riff/wav/wavfile.cpp - riff/wav/wavproperties.cpp - riff/wav/infotag.cpp -) - -set(mod_SRCS - mod/modfilebase.cpp - mod/modfile.cpp - mod/modtag.cpp - mod/modproperties.cpp -) - -set(s3m_SRCS - s3m/s3mfile.cpp - s3m/s3mproperties.cpp -) - -set(it_SRCS - it/itfile.cpp - it/itproperties.cpp -) - -set(xm_SRCS - xm/xmfile.cpp - xm/xmproperties.cpp -) - -set(toolkit_SRCS - toolkit/tstring.cpp - toolkit/tstringlist.cpp - toolkit/tbytevector.cpp - toolkit/tbytevectorlist.cpp - toolkit/tbytevectorstream.cpp - toolkit/tiostream.cpp - toolkit/tfile.cpp - toolkit/tfilestream.cpp - toolkit/tdebug.cpp - toolkit/tpropertymap.cpp - toolkit/trefcounter.cpp - toolkit/tdebuglistener.cpp - toolkit/unicode.cpp -) - -set(tag_LIB_SRCS - ${mpeg_SRCS} ${id3v1_SRCS} ${id3v2_SRCS} ${frames_SRCS} ${ogg_SRCS} - ${vorbis_SRCS} ${oggflacs_SRCS} ${mpc_SRCS} ${ape_SRCS} ${toolkit_SRCS} ${flacs_SRCS} - ${wavpack_SRCS} ${speex_SRCS} ${trueaudio_SRCS} ${riff_SRCS} ${aiff_SRCS} ${wav_SRCS} - ${asf_SRCS} ${mp4_SRCS} ${mod_SRCS} ${s3m_SRCS} ${it_SRCS} ${xm_SRCS} ${opus_SRCS} - tag.cpp - tagunion.cpp - fileref.cpp - audioproperties.cpp -) - -add_library(tag ${tag_LIB_SRCS} ${tag_HDRS}) - -if(ZLIB_FOUND) - target_link_libraries(tag ${ZLIB_LIBRARIES}) -endif() - -set_target_properties(tag PROPERTIES - VERSION ${TAGLIB_SOVERSION_MAJOR}.${TAGLIB_SOVERSION_MINOR}.${TAGLIB_SOVERSION_PATCH} - SOVERSION ${TAGLIB_SOVERSION_MAJOR} - INSTALL_NAME_DIR ${LIB_INSTALL_DIR} - DEFINE_SYMBOL MAKE_TAGLIB_LIB - LINK_INTERFACE_LIBRARIES "" - PUBLIC_HEADER "${tag_HDRS}" -) -if(BUILD_FRAMEWORK) - set_target_properties(tag PROPERTIES FRAMEWORK TRUE) -endif() - -install(TARGETS tag - FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} - LIBRARY DESTINATION ${LIB_INSTALL_DIR} - RUNTIME DESTINATION ${BIN_INSTALL_DIR} - ARCHIVE DESTINATION ${LIB_INSTALL_DIR} - PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR}/taglib -) - diff --git a/src/taglib/taglib/ape/ape-tag-format.txt b/src/taglib/taglib/ape/ape-tag-format.txt deleted file mode 100644 index 21ff1c8..0000000 --- a/src/taglib/taglib/ape/ape-tag-format.txt +++ /dev/null @@ -1,170 +0,0 @@ -================================================================================ -= APE Tag Specification, Version 2.000 -================================================================================ - -Original Content (C) 2004, Frank Klemm <frank.klemm@elster.offl.uni-jena.de> -Formatting / Editing (C) 2004, Scott Wheeler <wheeler@kde.org> - -================================================================================ -= Contents -================================================================================ - -1 - APE Tag General Structure -2 - APE Tag Header / Footer Format -3 - APE Tag Flags -4 - APE Tag Item Format -5 - APE Tag Item Supported Keys -6 - APE Tag Item Content -7 - Data Types -7.1 - Data Types / UTF-8 -7.2 - Data Types / Dates -7.3 - Data Types / Timestamps - -================================================================================ -= 1 - APE Tag General Structure -================================================================================ - -Member of Basic Components of SV8 Stream Note: - -It is strongly recommended that the data size be stored in the tags. The size -should normally be in the roughly one kilobyte, never more than 8 kilobytes. - -Larger data should be stored externally using link entries. Linked data is much -easier to process by normal programs, so for instance JPEG data should not be -included inside the audio file. - -APE Tag Version 2.000 (with header, recommended): - -/================================\ -| APE Tag Header | 32 bytes | -|-------------------|------------| -| APE Tag Item 1 | > 10 bytes | -| APE Tag Item 2 | > 10 bytes | -| APE Tag Item n-1 | > 10 bytes | -| APE Tag Item n | > 10 bytes | -|-------------------|------------| -| APE Tag Footer | 32 bytes | -\================================/ - - -APE tag items should be sorted ascending by size. When streaming, parts of the -APE tag may be dropped to reduce the danger of drop outs between tracks. This -is not required, but is strongly recommended. It would be desirable for the i -tems to be sorted by importance / size, but this is not feasible. This -convention should only be broken when adding less important small items and it -is not desirable to rewrite the entire tag. An APE tag at the end of a file -(the recommended location) must have at least a footer; an APE tag at the -beginning of a file (strongly discouraged) must have at least a header. - -APE Tag Version 1.000 (without header, deprecated) - -/================================\ -| APE Tag Item 1 | > 10 bytes | -| APE Tag Item 2 | > 10 bytes | -| APE Tag Item n-1 | > 10 bytes | -| APE Tag Item n | > 10 bytes | -|-------------------|------------| -| APE Tag Footer | 32 bytes | -\================================/ - -================================================================================ -= 2 - APE Tag Header / Footer Format -================================================================================ - -Contains number, length and attributes of all tag items - -Header and Footer are different in 1 bit in the Tags Flags to distinguish -between them. - -Member of APE Tag 2.0 - -/===========================================================================\ -| Preamble | 8 bytes | { 'A', 'P', 'E', 'T', 'A', 'G', 'E', 'X' } | -|----------------|---------|------------------------------------------------| -| Version Number | 4 bytes | 1000 = Version 1.000, 2000 = Version 2.000 | -|----------------|---------|------------------------------------------------| -| Tag Size | 4 bytes | Tag size in bytes including footer and all tag | -| | | items excluding the header (for 1.000 | -| | | compatibility) | -|----------------|---------|------------------------------------------------| -| Item Count | 4 bytes | Number of items in the tag | -|----------------|---------|------------------------------------------------| -| Tag Flags | 4 bytes | Global flags | -|----------------|---------|------------------------------------------------| -| Reserved | 8 bytes | Must be zeroed | -\===========================================================================/ - -================================================================================ -= 3 - APE Tag Flags -================================================================================ - -The general flag structure for either items or headers / footers is the same. -Bits 31, 30 and 29 are specific to headers / footers, whereas 2 through 0 are -item specific. - -Note: APE Tags from Version 1.0 do not use any of the following. All flags in -that version are zeroed and ignored when reading. - -/=================================================================\ -| Contains Header | Bit 31 | 1 - has header | 0 - no header | -|-----------------|-------------|---------------------------------| -| Contains Footer | Bit 30 | 1 - has footer | 0 - no footer | -|-----------------|-------------|---------------------------------| -| Is Header | Bit 29 | 1 - is header | 0 - is footer | -|-----------------|-------------|---------------------------------| -| Undefined | Bits 28 - 3 | Undefined, must be zeroed | -|-----------------|-------------|---------------------------------| -| Encoding | Bits 2 - 1 | 00 - UTF-8 | -| | | 01 - Binary Data * | -| | | 10 - External Reference ** | -| | | 11 - Reserved | -|-----------------|-------------|---------------------------------| -| Read Only | Bit 0 | 1 - read only | 0 - read/write | -\=================================================================/ - - (*) Should be ignored by tools for editing text values -(**) Allowed external reference formats: - - http://host/directory/filename.ext - - ftp://host/directory/filename.ext - - filename.ext - - /directory/filename.ext - - DRIVE:/directory/filename.ext - - Note: External references are also UTF-8 encoded. - -================================================================================ -= 4 - APE Tag Item Format -================================================================================ - -APE Tag Items are stored as key-value pairs. APE Tags Item Key are case -sensitive, however it is illegal to use keys which only differ in case and -it is recommended that tag reading not be case sensitive. - -Every key can only occur (at most) once. It is not possible to repeat a key -to signify updated contents. - -Tags can be partially or completely repeated in the streaming format. This -makes it possible to display an artist and / or title if it was missed at the -beginning of the stream. It is recommended that the important information like -artist, album and title should occur approximately every 2 minutes in the -stream and again 5 to 10 seconds before the end. However, care should be tak -en not to replicate this information too often or during passages with high -bitrate demands to avoid unnecessary drop-outs. - -/==============================================================================\ -| Content Size | 4 bytes | Length of the value in bytes | -|----------------|---------------|---------------------------------------------| -| Flags | 4 bytes | Item flags | -|----------------|---------------|---------------------------------------------| -| Key | 2 - 255 bytes | Item key | -|----------------|---------------|---------------------------------------------| -| Key Terminator | 1 byte | Null byte that indicates the end of the key | -|----------------|---------------|---------------------------------------------| -| Value | variable | Content (formatted according to the flags) | -\==============================================================================/ - -================================================================================ - -Sections 5 - 7 haven't yet been converted from: - -http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html diff --git a/src/taglib/taglib/ape/apefile.cpp b/src/taglib/taglib/ape/apefile.cpp deleted file mode 100644 index 3cb9d9a..0000000 --- a/src/taglib/taglib/ape/apefile.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - (original WavPack implementation) - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include <tagunion.h> -#include <id3v1tag.h> -#include <tpropertymap.h> - -#include "apefile.h" - -#include "apetag.h" -#include "apefooter.h" - -using namespace TagLib; - -namespace -{ - enum { ApeAPEIndex = 0, ApeID3v1Index = 1 }; -} - -class APE::File::FilePrivate -{ -public: - FilePrivate() : - APELocation(-1), - APESize(0), - ID3v1Location(-1), - properties(0), - hasAPE(false), - hasID3v1(false) {} - - ~FilePrivate() - { - delete properties; - } - - long APELocation; - uint APESize; - - long ID3v1Location; - - TagUnion tag; - - Properties *properties; - - // These indicate whether the file *on disk* has these tags, not if - // this data structure does. This is used in computing offsets. - - bool hasAPE; - bool hasID3v1; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -APE::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -APE::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -APE::File::~File() -{ - delete d; -} - -TagLib::Tag *APE::File::tag() const -{ - return &d->tag; -} - -PropertyMap APE::File::properties() const -{ - if(d->hasAPE) - return d->tag.access<APE::Tag>(ApeAPEIndex, false)->properties(); - if(d->hasID3v1) - return d->tag.access<ID3v1::Tag>(ApeID3v1Index, false)->properties(); - return PropertyMap(); -} - -void APE::File::removeUnsupportedProperties(const StringList &properties) -{ - if(d->hasAPE) - d->tag.access<APE::Tag>(ApeAPEIndex, false)->removeUnsupportedProperties(properties); - if(d->hasID3v1) - d->tag.access<ID3v1::Tag>(ApeID3v1Index, false)->removeUnsupportedProperties(properties); -} - -PropertyMap APE::File::setProperties(const PropertyMap &properties) -{ - if(d->hasID3v1) - d->tag.access<ID3v1::Tag>(ApeID3v1Index, false)->setProperties(properties); - return d->tag.access<APE::Tag>(ApeAPEIndex, true)->setProperties(properties); -} - -APE::Properties *APE::File::audioProperties() const -{ - return d->properties; -} - -bool APE::File::save() -{ - if(readOnly()) { - debug("APE::File::save() -- File is read only."); - return false; - } - - // Update ID3v1 tag - - if(ID3v1Tag()) { - if(d->hasID3v1) { - seek(d->ID3v1Location); - writeBlock(ID3v1Tag()->render()); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - writeBlock(ID3v1Tag()->render()); - d->hasID3v1 = true; - } - } - else { - if(d->hasID3v1) { - removeBlock(d->ID3v1Location, 128); - d->hasID3v1 = false; - if(d->hasAPE) { - if(d->APELocation > d->ID3v1Location) - d->APELocation -= 128; - } - } - } - - // Update APE tag - - if(APETag()) { - if(d->hasAPE) - insert(APETag()->render(), d->APELocation, d->APESize); - else { - if(d->hasID3v1) { - insert(APETag()->render(), d->ID3v1Location, 0); - d->APESize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - d->APELocation = d->ID3v1Location; - d->ID3v1Location += d->APESize; - } - else { - seek(0, End); - d->APELocation = tell(); - writeBlock(APETag()->render()); - d->APESize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - } - } - } - else { - if(d->hasAPE) { - removeBlock(d->APELocation, d->APESize); - d->hasAPE = false; - if(d->hasID3v1) { - if(d->ID3v1Location > d->APELocation) { - d->ID3v1Location -= d->APESize; - } - } - } - } - - return true; -} - -ID3v1::Tag *APE::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(ApeID3v1Index, create); -} - -APE::Tag *APE::File::APETag(bool create) -{ - return d->tag.access<APE::Tag>(ApeAPEIndex, create); -} - -void APE::File::strip(int tags) -{ - if(tags & ID3v1) { - d->tag.set(ApeID3v1Index, 0); - APETag(true); - } - - if(tags & APE) { - d->tag.set(ApeAPEIndex, 0); - - if(!ID3v1Tag()) - APETag(true); - } -} - -bool APE::File::hasAPETag() const -{ - return d->hasAPE; -} - -bool APE::File::hasID3v1Tag() const -{ - return d->hasID3v1; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void APE::File::read(bool readProperties, Properties::ReadStyle /* propertiesStyle */) -{ - // Look for an ID3v1 tag - - d->ID3v1Location = findID3v1(); - - if(d->ID3v1Location >= 0) { - d->tag.set(ApeID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - d->hasID3v1 = true; - } - - // Look for an APE tag - - d->APELocation = findAPE(); - - if(d->APELocation >= 0) { - d->tag.set(ApeAPEIndex, new APE::Tag(this, d->APELocation)); - d->APESize = APETag()->footer()->completeTagSize(); - d->APELocation = d->APELocation + APETag()->footer()->size() - d->APESize; - d->hasAPE = true; - } - - if(!d->hasID3v1) - APETag(true); - - // Look for APE audio properties - - if(readProperties) { - d->properties = new Properties(this); - } -} - -long APE::File::findAPE() -{ - if(!isValid()) - return -1; - - if(d->hasID3v1) - seek(-160, End); - else - seek(-32, End); - - long p = tell(); - - if(readBlock(8) == APE::Tag::fileIdentifier()) - return p; - - return -1; -} - -long APE::File::findID3v1() -{ - if(!isValid()) - return -1; - - seek(-128, End); - long p = tell(); - - if(readBlock(3) == ID3v1::Tag::fileIdentifier()) - return p; - - return -1; -} diff --git a/src/taglib/taglib/ape/apefile.h b/src/taglib/taglib/ape/apefile.h deleted file mode 100644 index f7b509f..0000000 --- a/src/taglib/taglib/ape/apefile.h +++ /dev/null @@ -1,229 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - (original WavPack implementation) - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEFILE_H -#define TAGLIB_APEFILE_H - -#include "tfile.h" -#include "taglib_export.h" -#include "apeproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of APE metadata - - /*! - * This is implementation of APE metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. - */ - - namespace APE { - - //! An implementation of TagLib::File with APE specific methods - - /*! - * This implements and provides an interface for APE files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to APE files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches APE tags. - APE = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs an APE file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an APE file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains both an APE and an ID3v1 tag, only APE - * will be converted to the PropertyMap. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties. Forwards to the actual Tag's - * removeUnsupportedProperties() function. - */ - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * Creates an APEv2 tag if necessary. A pontentially existing ID3v1 - * tag will be updated as well. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the APE::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - * - * \note According to the official Monkey's Audio SDK, an APE file - * can only have either ID3V1 or APE tags, so a parameter is used here. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an APE tag. Use hasAPETag() to check if the file - * on disk actually has an APE tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasAPETag() - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an APE tag. - * - * \see APETag() - */ - bool hasAPETag() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findID3v1(); - long findAPE(); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/ape/apefooter.cpp b/src/taglib/taglib/ape/apefooter.cpp deleted file mode 100644 index 539832b..0000000 --- a/src/taglib/taglib/ape/apefooter.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - (C) 2002 - 2008 by Scott Wheeler (id3v2header.cpp) - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <iostream> -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> - -#include "apefooter.h" - -using namespace TagLib; -using namespace APE; - -class APE::Footer::FooterPrivate -{ -public: - FooterPrivate() : version(0), - footerPresent(true), - headerPresent(false), - isHeader(false), - itemCount(0), - tagSize(0) {} - - ~FooterPrivate() {} - - uint version; - - bool footerPresent; - bool headerPresent; - - bool isHeader; - - uint itemCount; - uint tagSize; - - static const uint size = 32; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -TagLib::uint APE::Footer::size() -{ - return FooterPrivate::size; -} - -ByteVector APE::Footer::fileIdentifier() -{ - return ByteVector::fromCString("APETAGEX"); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -APE::Footer::Footer() -{ - d = new FooterPrivate; -} - -APE::Footer::Footer(const ByteVector &data) -{ - d = new FooterPrivate; - parse(data); -} - -APE::Footer::~Footer() -{ - delete d; -} - -TagLib::uint APE::Footer::version() const -{ - return d->version; -} - -bool APE::Footer::headerPresent() const -{ - return d->headerPresent; -} - -bool APE::Footer::footerPresent() const -{ - return d->footerPresent; -} - -bool APE::Footer::isHeader() const -{ - return d->isHeader; -} - -void APE::Footer::setHeaderPresent(bool b) const -{ - d->headerPresent = b; -} - -TagLib::uint APE::Footer::itemCount() const -{ - return d->itemCount; -} - -void APE::Footer::setItemCount(uint s) -{ - d->itemCount = s; -} - -TagLib::uint APE::Footer::tagSize() const -{ - return d->tagSize; -} - -TagLib::uint APE::Footer::completeTagSize() const -{ - if(d->headerPresent) - return d->tagSize + d->size; - else - return d->tagSize; -} - -void APE::Footer::setTagSize(uint s) -{ - d->tagSize = s; -} - -void APE::Footer::setData(const ByteVector &data) -{ - parse(data); -} - -ByteVector APE::Footer::renderFooter() const -{ - return render(false); -} - -ByteVector APE::Footer::renderHeader() const -{ - if (!d->headerPresent) return ByteVector(); - - return render(true); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void APE::Footer::parse(const ByteVector &data) -{ - if(data.size() < size()) - return; - - // The first eight bytes, data[0..7], are the File Identifier, "APETAGEX". - - // Read the version number - - d->version = data.toUInt(8, false); - - // Read the tag size - - d->tagSize = data.toUInt(12, false); - - // Read the item count - - d->itemCount = data.toUInt(16, false); - - // Read the flags - - std::bitset<32> flags(TAGLIB_CONSTRUCT_BITSET(data.toUInt(20, false))); - - d->headerPresent = flags[31]; - d->footerPresent = !flags[30]; - d->isHeader = flags[29]; - -} - -ByteVector APE::Footer::render(bool isHeader) const -{ - ByteVector v; - - // add the file identifier -- "APETAGEX" - - v.append(fileIdentifier()); - - // add the version number -- we always render a 2.000 tag regardless of what - // the tag originally was. - - v.append(ByteVector::fromUInt(2000, false)); - - // add the tag size - - v.append(ByteVector::fromUInt(d->tagSize, false)); - - // add the item count - - v.append(ByteVector::fromUInt(d->itemCount, false)); - - // render and add the flags - - std::bitset<32> flags; - - flags[31] = d->headerPresent; - flags[30] = false; // footer is always present - flags[29] = isHeader; - - v.append(ByteVector::fromUInt(flags.to_ulong(), false)); - - // add the reserved 64bit - - v.append(ByteVector::fromLongLong(0)); - - return v; -} diff --git a/src/taglib/taglib/ape/apefooter.h b/src/taglib/taglib/ape/apefooter.h deleted file mode 100644 index 080f930..0000000 --- a/src/taglib/taglib/ape/apefooter.h +++ /dev/null @@ -1,173 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEFOOTER_H -#define TAGLIB_APEFOOTER_H - -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace APE { - - //! An implementation of APE footers - - /*! - * This class implements APE footers (and headers). It attempts to follow, both - * semantically and programatically, the structure specified in - * the APE v2.0 standard. The API is based on the properties of APE footer and - * headers specified there. - */ - - class TAGLIB_EXPORT Footer - { - public: - /*! - * Constructs an empty APE footer. - */ - Footer(); - - /*! - * Constructs an APE footer based on \a data. parse() is called - * immediately. - */ - Footer(const ByteVector &data); - - /*! - * Destroys the footer. - */ - virtual ~Footer(); - - /*! - * Returns the version number. (Note: This is the 1000 or 2000.) - */ - uint version() const; - - /*! - * Returns true if a header is present in the tag. - */ - bool headerPresent() const; - - /*! - * Returns true if a footer is present in the tag. - */ - bool footerPresent() const; - - /*! - * Returns true this is actually the header. - */ - bool isHeader() const; - - /*! - * Sets whether the header should be rendered or not - */ - void setHeaderPresent(bool b) const; - - /*! - * Returns the number of items in the tag. - */ - uint itemCount() const; - - /*! - * Set the item count to \a s. - * \see itemCount() - */ - void setItemCount(uint s); - - /*! - * Returns the tag size in bytes. This is the size of the frame content and footer. - * The size of the \e entire tag will be this plus the header size, if present. - * - * \see completeTagSize() - */ - uint tagSize() const; - - /*! - * Returns the tag size, including if present, the header - * size. - * - * \see tagSize() - */ - uint completeTagSize() const; - - /*! - * Set the tag size to \a s. - * \see tagSize() - */ - void setTagSize(uint s); - - /*! - * Returns the size of the footer. Presently this is always 32 bytes. - */ - static uint size(); - - /*! - * Returns the string used to identify an APE tag inside of a file. - * Presently this is always "APETAGEX". - */ - static ByteVector fileIdentifier(); - - /*! - * Sets the data that will be used as the footer. 32 bytes, - * starting from \a data will be used. - */ - void setData(const ByteVector &data); - - /*! - * Renders the footer back to binary format. - */ - ByteVector renderFooter() const; - - /*! - * Renders the header corresponding to the footer. If headerPresent is - * set to false, it returns an empty ByteVector. - */ - ByteVector renderHeader() const; - - protected: - /*! - * Called by setData() to parse the footer data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - /*! - * Called by renderFooter and renderHeader - */ - ByteVector render(bool isHeader) const; - - private: - Footer(const Footer &); - Footer &operator=(const Footer &); - - class FooterPrivate; - FooterPrivate *d; - }; - - } -} - -#endif diff --git a/src/taglib/taglib/ape/apeitem.cpp b/src/taglib/taglib/ape/apeitem.cpp deleted file mode 100644 index 3490173..0000000 --- a/src/taglib/taglib/ape/apeitem.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <tdebug.h> - -#include "apeitem.h" - -using namespace TagLib; -using namespace APE; - -class APE::Item::ItemPrivate -{ -public: - ItemPrivate() : type(Text), readOnly(false) {} - - Item::ItemTypes type; - String key; - ByteVector value; - StringList text; - bool readOnly; -}; - -APE::Item::Item() -{ - d = new ItemPrivate; -} - -APE::Item::Item(const String &key, const String &value) -{ - d = new ItemPrivate; - d->key = key; - d->text.append(value); -} - -APE::Item::Item(const String &key, const StringList &values) -{ - d = new ItemPrivate; - d->key = key; - d->text = values; -} - -APE::Item::Item(const String &key, const ByteVector &value, bool binary) -{ - d = new ItemPrivate; - d->key = key; - if(binary) { - d->type = Binary; - d->value = value; - } - else - d->text.append(value); -} - -APE::Item::Item(const Item &item) -{ - d = new ItemPrivate(*item.d); -} - -APE::Item::~Item() -{ - delete d; -} - -Item &APE::Item::operator=(const Item &item) -{ - delete d; - d = new ItemPrivate(*item.d); - return *this; -} - -void APE::Item::setReadOnly(bool readOnly) -{ - d->readOnly = readOnly; -} - -bool APE::Item::isReadOnly() const -{ - return d->readOnly; -} - -void APE::Item::setType(APE::Item::ItemTypes val) -{ - d->type = val; -} - -APE::Item::ItemTypes APE::Item::type() const -{ - return d->type; -} - -String APE::Item::key() const -{ - return d->key; -} - -ByteVector APE::Item::binaryData() const -{ - return d->value; -} - -void APE::Item::setBinaryData(const ByteVector &value) -{ - d->type = Binary; - d->value = value; - d->text.clear(); -} - -ByteVector APE::Item::value() const -{ - // This seems incorrect as it won't be actually rendering the value to keep it - // up to date. - - return d->value; -} - -void APE::Item::setKey(const String &key) -{ - d->key = key; -} - -void APE::Item::setValue(const String &value) -{ - d->type = Text; - d->text = value; - d->value.clear(); -} - -void APE::Item::setValues(const StringList &value) -{ - d->type = Text; - d->text = value; - d->value.clear(); -} - -void APE::Item::appendValue(const String &value) -{ - d->type = Text; - d->text.append(value); - d->value.clear(); -} - -void APE::Item::appendValues(const StringList &values) -{ - d->type = Text; - d->text.append(values); - d->value.clear(); -} - -int APE::Item::size() const -{ - // SFB: Why is d->key.size() used when size() returns the length in UniChars and not UTF-8? - int result = 8 + d->key.size() /* d->key.data(String::UTF8).size() */ + 1; - switch (d->type) { - case Text: - if(d->text.size()) { - StringList::ConstIterator it = d->text.begin(); - - result += it->data(String::UTF8).size(); - it++; - for(; it != d->text.end(); ++it) - result += 1 + it->data(String::UTF8).size(); - } - break; - - case Binary: - case Locator: - result += d->value.size(); - break; - } - return result; -} - -StringList APE::Item::toStringList() const -{ - return d->text; -} - -StringList APE::Item::values() const -{ - return d->text; -} - -String APE::Item::toString() const -{ - if(d->type == Text && !isEmpty()) - return d->text.front(); - else - return String::null; -} - -bool APE::Item::isEmpty() const -{ - switch(d->type) { - case Text: - if(d->text.isEmpty()) - return true; - if(d->text.size() == 1 && d->text.front().isEmpty()) - return true; - return false; - case Binary: - case Locator: - return d->value.isEmpty(); - default: - return false; - } -} - -void APE::Item::parse(const ByteVector &data) -{ - // 11 bytes is the minimum size for an APE item - - if(data.size() < 11) { - debug("APE::Item::parse() -- no data in item"); - return; - } - - const uint valueLength = data.toUInt(0, false); - const uint flags = data.toUInt(4, false); - - d->key = String(data.mid(8), String::UTF8); - - const ByteVector value = data.mid(8 + d->key.size() + 1, valueLength); - - setReadOnly(flags & 1); - setType(ItemTypes((flags >> 1) & 3)); - - if(Text == d->type) - d->text = StringList(ByteVectorList::split(value, '\0'), String::UTF8); - else - d->value = value; -} - -ByteVector APE::Item::render() const -{ - ByteVector data; - TagLib::uint flags = ((d->readOnly) ? 1 : 0) | (d->type << 1); - ByteVector value; - - if(isEmpty()) - return data; - - if(d->type == Text) { - StringList::ConstIterator it = d->text.begin(); - - value.append(it->data(String::UTF8)); - it++; - for(; it != d->text.end(); ++it) { - value.append('\0'); - value.append(it->data(String::UTF8)); - } - d->value = value; - } - else - value.append(d->value); - - data.append(ByteVector::fromUInt(value.size(), false)); - data.append(ByteVector::fromUInt(flags, false)); - data.append(d->key.data(String::UTF8)); - data.append(ByteVector('\0')); - data.append(value); - - return data; -} diff --git a/src/taglib/taglib/ape/apeitem.h b/src/taglib/taglib/ape/apeitem.h deleted file mode 100644 index 0588d18..0000000 --- a/src/taglib/taglib/ape/apeitem.h +++ /dev/null @@ -1,219 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEITEM_H -#define TAGLIB_APEITEM_H - -#include "tbytevector.h" -#include "tstring.h" -#include "tstringlist.h" - -namespace TagLib { - - namespace APE { - - //! An implementation of APE-items - - /*! - * This class provides the features of items in the APEv2 standard. - */ - class TAGLIB_EXPORT Item - { - public: - /*! - * Enum of types an Item can have. The value of 3 is reserved. - */ - enum ItemTypes { - //! Item contains text information coded in UTF-8 - Text = 0, - //! Item contains binary information - Binary = 1, - //! Item is a locator of external stored information - Locator = 2 - }; - /*! - * Constructs an empty item. - */ - Item(); - - /*! - * Constructs a text item with \a key and \a value. - */ - // BIC: Remove this, StringList has a constructor from a single string - Item(const String &key, const String &value); - - /*! - * Constructs a text item with \a key and \a values. - */ - Item(const String &key, const StringList &values); - - /*! - * Constructs an item with \a key and \a value. - * If \a binary is true a Binary item will be created, otherwise \a value will be interpreted as text - */ - Item(const String &key, const ByteVector &value, bool binary); - - /*! - * Construct an item as a copy of \a item. - */ - Item(const Item &item); - - /*! - * Destroys the item. - */ - virtual ~Item(); - - /*! - * Copies the contents of \a item into this item. - */ - Item &operator=(const Item &item); - - /*! - * Returns the key. - */ - String key() const; - - /*! - * Returns the binary value. - * If the item type is not \a Binary, always returns an empty ByteVector. - */ - ByteVector binaryData() const; - - /*! - * Set the binary value to \a value - * The item's type will also be set to \a Binary - */ - void setBinaryData(const ByteVector &value); - -#ifndef DO_NOT_DOCUMENT - /* Remove in next binary incompatible release */ - ByteVector value() const; -#endif - - /*! - * Sets the key for the item to \a key. - */ - void setKey(const String &key); - - /*! - * Sets the text value of the item to \a value and clears any previous contents. - * - * \see toString() - */ - void setValue(const String &value); - - /*! - * Sets the text value of the item to the list of values in \a value and clears - * any previous contents. - * - * \see toStringList() - */ - void setValues(const StringList &values); - - /*! - * Appends \a value to create (or extend) the current list of text values. - * - * \see toString() - */ - void appendValue(const String &value); - - /*! - * Appends \a values to extend the current list of text values. - * - * \see toStringList() - */ - void appendValues(const StringList &values); - - /*! - * Returns the size of the full item. - */ - int size() const; - - /*! - * Returns the value as a single string. In case of multiple strings, - * the first is returned. If the data type is not \a Text, always returns - * an empty String. - */ - String toString() const; - -#ifndef DO_NOT_DOCUMENT - /* Remove in next binary incompatible release */ - StringList toStringList() const; -#endif - - /*! - * Returns the list of text values. If the data type is not \a Text, always - * returns an empty StringList. - */ - StringList values() const; - - /*! - * Render the item to a ByteVector. - */ - ByteVector render() const; - - /*! - * Parse the item from the ByteVector \a data. - */ - void parse(const ByteVector& data); - - /*! - * Set the item to read-only. - */ - void setReadOnly(bool readOnly); - - /*! - * Return true if the item is read-only. - */ - bool isReadOnly() const; - - /*! - * Sets the type of the item to \a type. - * - * \see ItemTypes - */ - void setType(ItemTypes type); - - /*! - * Returns the type of the item. - */ - ItemTypes type() const; - - /*! - * Returns if the item has any real content. - */ - bool isEmpty() const; - - private: - class ItemPrivate; - ItemPrivate *d; - }; - } - -} - -#endif - - diff --git a/src/taglib/taglib/ape/apeproperties.cpp b/src/taglib/taglib/ape/apeproperties.cpp deleted file mode 100644 index 4940ede..0000000 --- a/src/taglib/taglib/ape/apeproperties.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - (original WavPack implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <bitset> -#include "id3v2tag.h" -#include "apeproperties.h" -#include "apefile.h" - -using namespace TagLib; - -class APE::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(File *file, long streamLength) : - length(0), - bitrate(0), - sampleRate(0), - channels(0), - version(0), - bitsPerSample(0), - sampleFrames(0), - file(file), - streamLength(streamLength) {} - - int length; - int bitrate; - int sampleRate; - int channels; - int version; - int bitsPerSample; - uint sampleFrames; - File *file; - long streamLength; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -APE::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(file, file->length()); - read(); -} - -APE::Properties::~Properties() -{ - delete d; -} - -int APE::Properties::length() const -{ - return d->length; -} - -int APE::Properties::bitrate() const -{ - return d->bitrate; -} - -int APE::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int APE::Properties::channels() const -{ - return d->channels; -} - -int APE::Properties::version() const -{ - return d->version; -} - -int APE::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -TagLib::uint APE::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - - -void APE::Properties::read() -{ - // First we are searching the descriptor - long offset = findDescriptor(); - if(offset < 0) - return; - - // Then we read the header common for all versions of APE - d->file->seek(offset); - ByteVector commonHeader = d->file->readBlock(6); - if(!commonHeader.startsWith("MAC ")) - return; - d->version = commonHeader.toUShort(4, false); - - if(d->version >= 3980) { - analyzeCurrent(); - } - else { - analyzeOld(); - } -} - -long APE::Properties::findDescriptor() -{ - long ID3v2Location = findID3v2(); - long ID3v2OriginalSize = 0; - bool hasID3v2 = false; - if(ID3v2Location >= 0) { - ID3v2::Tag tag(d->file, ID3v2Location); - ID3v2OriginalSize = tag.header()->completeTagSize(); - if(tag.header()->tagSize() > 0) - hasID3v2 = true; - } - - long offset = 0; - if(hasID3v2) - offset = d->file->find("MAC ", ID3v2Location + ID3v2OriginalSize); - else - offset = d->file->find("MAC "); - - if(offset < 0) { - debug("APE::Properties::findDescriptor() -- APE descriptor not found"); - return -1; - } - - return offset; -} - -long APE::Properties::findID3v2() -{ - if(!d->file->isValid()) - return -1; - - d->file->seek(0); - - if(d->file->readBlock(3) == ID3v2::Header::fileIdentifier()) - return 0; - - return -1; -} - -void APE::Properties::analyzeCurrent() -{ - // Read the descriptor - d->file->seek(2, File::Current); - ByteVector descriptor = d->file->readBlock(44); - const uint descriptorBytes = descriptor.toUInt(0, false); - - if ((descriptorBytes - 52) > 0) - d->file->seek(descriptorBytes - 52, File::Current); - - // Read the header - ByteVector header = d->file->readBlock(24); - - // Get the APE info - d->channels = header.toShort(18, false); - d->sampleRate = header.toUInt(20, false); - d->bitsPerSample = header.toShort(16, false); - //d->compressionLevel = - - const uint totalFrames = header.toUInt(12, false); - const uint blocksPerFrame = header.toUInt(4, false); - const uint finalFrameBlocks = header.toUInt(8, false); - d->sampleFrames = totalFrames > 0 ? (totalFrames - 1) * blocksPerFrame + finalFrameBlocks : 0; - d->length = d->sampleRate > 0 ? d->sampleFrames / d->sampleRate : 0; - d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0; -} - -void APE::Properties::analyzeOld() -{ - ByteVector header = d->file->readBlock(26); - const uint totalFrames = header.toUInt(18, false); - - // Fail on 0 length APE files (catches non-finalized APE files) - if(totalFrames == 0) - return; - - const short compressionLevel = header.toShort(0, false); - uint blocksPerFrame; - if(d->version >= 3950) - blocksPerFrame = 73728 * 4; - else if(d->version >= 3900 || (d->version >= 3800 && compressionLevel == 4000)) - blocksPerFrame = 73728; - else - blocksPerFrame = 9216; - d->channels = header.toShort(4, false); - d->sampleRate = header.toUInt(6, false); - const uint finalFrameBlocks = header.toUInt(22, false); - const uint totalBlocks - = totalFrames > 0 ? (totalFrames - 1) * blocksPerFrame + finalFrameBlocks : 0; - d->length = totalBlocks / d->sampleRate; - d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0; -} - diff --git a/src/taglib/taglib/ape/apeproperties.h b/src/taglib/taglib/ape/apeproperties.h deleted file mode 100644 index f154ec3..0000000 --- a/src/taglib/taglib/ape/apeproperties.h +++ /dev/null @@ -1,99 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - (original WavPack implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEPROPERTIES_H -#define TAGLIB_APEPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace APE { - - class File; - - //! An implementation of audio property reading for APE - - /*! - * This reads the data from an APE stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of APE::Properties with the data read from the - * ByteVector \a data. - */ - Properties(File *f, ReadStyle style = Average); - - /*! - * Destroys this APE::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns number of bits per sample. - */ - int bitsPerSample() const; - uint sampleFrames() const; - - /*! - * Returns APE version. - */ - int version() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - long findDescriptor(); - long findID3v2(); - - void analyzeCurrent(); - void analyzeOld(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/ape/apetag.cpp b/src/taglib/taglib/ape/apetag.cpp deleted file mode 100644 index 664ee3a..0000000 --- a/src/taglib/taglib/ape/apetag.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef __SUNPRO_CC -// Sun Studio finds multiple specializations of Map because -// it considers specializations with and without class types -// to be different; this define forces Map to use only the -// specialization with the class keyword. -#define WANT_CLASS_INSTANTIATION_OF_MAP (1) -#endif - -#include <tfile.h> -#include <tstring.h> -#include <tmap.h> -#include <tpropertymap.h> - -#include "apetag.h" -#include "apefooter.h" -#include "apeitem.h" - -using namespace TagLib; -using namespace APE; - -class APE::Tag::TagPrivate -{ -public: - TagPrivate() : file(0), footerLocation(-1), tagLength(0) {} - - TagLib::File *file; - long footerLocation; - long tagLength; - - Footer footer; - - ItemListMap itemListMap; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -APE::Tag::Tag() : TagLib::Tag() -{ - d = new TagPrivate; -} - -APE::Tag::Tag(TagLib::File *file, long footerLocation) : TagLib::Tag() -{ - d = new TagPrivate; - d->file = file; - d->footerLocation = footerLocation; - - read(); -} - -APE::Tag::~Tag() -{ - delete d; -} - -ByteVector APE::Tag::fileIdentifier() -{ - return ByteVector::fromCString("APETAGEX"); -} - -String APE::Tag::title() const -{ - if(d->itemListMap["TITLE"].isEmpty()) - return String::null; - return d->itemListMap["TITLE"].toString(); -} - -String APE::Tag::artist() const -{ - if(d->itemListMap["ARTIST"].isEmpty()) - return String::null; - return d->itemListMap["ARTIST"].toString(); -} - -String APE::Tag::album() const -{ - if(d->itemListMap["ALBUM"].isEmpty()) - return String::null; - return d->itemListMap["ALBUM"].toString(); -} - -String APE::Tag::comment() const -{ - if(d->itemListMap["COMMENT"].isEmpty()) - return String::null; - return d->itemListMap["COMMENT"].toString(); -} - -String APE::Tag::genre() const -{ - if(d->itemListMap["GENRE"].isEmpty()) - return String::null; - return d->itemListMap["GENRE"].toString(); -} - -TagLib::uint APE::Tag::year() const -{ - if(d->itemListMap["YEAR"].isEmpty()) - return 0; - return d->itemListMap["YEAR"].toString().toInt(); -} - -TagLib::uint APE::Tag::track() const -{ - if(d->itemListMap["TRACK"].isEmpty()) - return 0; - return d->itemListMap["TRACK"].toString().toInt(); -} - -void APE::Tag::setTitle(const String &s) -{ - addValue("TITLE", s, true); -} - -void APE::Tag::setArtist(const String &s) -{ - addValue("ARTIST", s, true); -} - -void APE::Tag::setAlbum(const String &s) -{ - addValue("ALBUM", s, true); -} - -void APE::Tag::setComment(const String &s) -{ - addValue("COMMENT", s, true); -} - -void APE::Tag::setGenre(const String &s) -{ - addValue("GENRE", s, true); -} - -void APE::Tag::setYear(uint i) -{ - if(i <= 0) - removeItem("YEAR"); - else - addValue("YEAR", String::number(i), true); -} - -void APE::Tag::setTrack(uint i) -{ - if(i <= 0) - removeItem("TRACK"); - else - addValue("TRACK", String::number(i), true); -} - -// conversions of tag keys between what we use in PropertyMap and what's usual -// for APE tags -static const TagLib::uint keyConversionsSize = 5; //usual, APE -static const char *keyConversions[][2] = {{"TRACKNUMBER", "TRACK" }, - {"DATE", "YEAR" }, - {"ALBUMARTIST", "ALBUM ARTIST"}, - {"DISCNUMBER", "DISC" }, - {"REMIXER", "MIXARTIST" }}; - -PropertyMap APE::Tag::properties() const -{ - PropertyMap properties; - ItemListMap::ConstIterator it = itemListMap().begin(); - for(; it != itemListMap().end(); ++it) { - String tagName = it->first.upper(); - // if the item is Binary or Locator, or if the key is an invalid string, - // add to unsupportedData - if(it->second.type() != Item::Text || tagName.isNull()) - properties.unsupportedData().append(it->first); - else { - // Some tags need to be handled specially - for(uint i = 0; i < keyConversionsSize; ++i) - if(tagName == keyConversions[i][1]) - tagName = keyConversions[i][0]; - properties[tagName].append(it->second.toStringList()); - } - } - return properties; -} - -void APE::Tag::removeUnsupportedProperties(const StringList &properties) -{ - StringList::ConstIterator it = properties.begin(); - for(; it != properties.end(); ++it) - removeItem(*it); -} - -PropertyMap APE::Tag::setProperties(const PropertyMap &origProps) -{ - PropertyMap properties(origProps); // make a local copy that can be modified - - // see comment in properties() - for(uint i = 0; i < keyConversionsSize; ++i) - if(properties.contains(keyConversions[i][0])) { - properties.insert(keyConversions[i][1], properties[keyConversions[i][0]]); - properties.erase(keyConversions[i][0]); - } - - // first check if tags need to be removed completely - StringList toRemove; - ItemListMap::ConstIterator remIt = itemListMap().begin(); - for(; remIt != itemListMap().end(); ++remIt) { - String key = remIt->first.upper(); - // only remove if a) key is valid, b) type is text, c) key not contained in new properties - if(!key.isNull() && remIt->second.type() == APE::Item::Text && !properties.contains(key)) - toRemove.append(remIt->first); - } - - for (StringList::Iterator removeIt = toRemove.begin(); removeIt != toRemove.end(); removeIt++) - removeItem(*removeIt); - - // now sync in the "forward direction" - PropertyMap::ConstIterator it = properties.begin(); - PropertyMap invalid; - for(; it != properties.end(); ++it) { - const String &tagName = it->first; - if(!checkKey(tagName)) - invalid.insert(it->first, it->second); - else if(!(itemListMap().contains(tagName)) || !(itemListMap()[tagName].values() == it->second)) { - if(it->second.size() == 0) - removeItem(tagName); - else { - StringList::ConstIterator valueIt = it->second.begin(); - addValue(tagName, *valueIt, true); - ++valueIt; - for(; valueIt != it->second.end(); ++valueIt) - addValue(tagName, *valueIt, false); - } - } - } - return invalid; -} - -bool APE::Tag::checkKey(const String &key) -{ - if(key.size() < 2 || key.size() > 16) - return false; - for(String::ConstIterator it = key.begin(); it != key.end(); it++) - // only allow printable ASCII including space (32..127) - if (*it < 32 || *it >= 128) - return false; - String upperKey = key.upper(); - if (upperKey=="ID3" || upperKey=="TAG" || upperKey=="OGGS" || upperKey=="MP+") - return false; - return true; -} - -APE::Footer *APE::Tag::footer() const -{ - return &d->footer; -} - -const APE::ItemListMap& APE::Tag::itemListMap() const -{ - return d->itemListMap; -} - -void APE::Tag::removeItem(const String &key) -{ - Map<const String, Item>::Iterator it = d->itemListMap.find(key.upper()); - if(it != d->itemListMap.end()) - d->itemListMap.erase(it); -} - -void APE::Tag::addValue(const String &key, const String &value, bool replace) -{ - if(replace) - removeItem(key); - if(!key.isEmpty() && !value.isEmpty()) { - if(!replace && d->itemListMap.contains(key)) { - // Text items may contain more than one value - if(APE::Item::Text == d->itemListMap.begin()->second.type()) - d->itemListMap[key.upper()].appendValue(value); - // Binary or locator items may have only one value - else - setItem(key, Item(key, value)); - } - else - setItem(key, Item(key, value)); - } -} - -void APE::Tag::setData(const String &key, const ByteVector &value) -{ - removeItem(key); - if(!key.isEmpty() && !value.isEmpty()) - setItem(key, Item(key, value, true)); -} - -void APE::Tag::setItem(const String &key, const Item &item) -{ - if(!key.isEmpty()) - d->itemListMap.insert(key.upper(), item); -} - -bool APE::Tag::isEmpty() const -{ - return d->itemListMap.isEmpty(); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected methods -//////////////////////////////////////////////////////////////////////////////// - -void APE::Tag::read() -{ - if(d->file && d->file->isValid()) { - - d->file->seek(d->footerLocation); - d->footer.setData(d->file->readBlock(Footer::size())); - - if(d->footer.tagSize() <= Footer::size() || - d->footer.tagSize() > uint(d->file->length())) - return; - - d->file->seek(d->footerLocation + Footer::size() - d->footer.tagSize()); - parse(d->file->readBlock(d->footer.tagSize() - Footer::size())); - } -} - -ByteVector APE::Tag::render() const -{ - ByteVector data; - uint itemCount = 0; - - { - for(Map<const String, Item>::ConstIterator it = d->itemListMap.begin(); - it != d->itemListMap.end(); ++it) - { - data.append(it->second.render()); - itemCount++; - } - } - - d->footer.setItemCount(itemCount); - d->footer.setTagSize(data.size() + Footer::size()); - d->footer.setHeaderPresent(true); - - return d->footer.renderHeader() + data + d->footer.renderFooter(); -} - -void APE::Tag::parse(const ByteVector &data) -{ - uint pos = 0; - - // 11 bytes is the minimum size for an APE item - - for(uint i = 0; i < d->footer.itemCount() && pos <= data.size() - 11; i++) { - APE::Item item; - item.parse(data.mid(pos)); - - d->itemListMap.insert(item.key().upper(), item); - - pos += item.size(); - } -} diff --git a/src/taglib/taglib/ape/apetag.h b/src/taglib/taglib/ape/apetag.h deleted file mode 100644 index c1f12e2..0000000 --- a/src/taglib/taglib/ape/apetag.h +++ /dev/null @@ -1,208 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APETAG_H -#define TAGLIB_APETAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "tmap.h" -#include "tstring.h" -#include "taglib_export.h" - -#include "apeitem.h" - -namespace TagLib { - - class File; - - //! An implementation of the APE tagging format - - namespace APE { - - class Footer; - - /*! - * A mapping between a list of item names, or keys, and the associated item. - * - * \see APE::Tag::itemListMap() - */ - typedef Map<const String, Item> ItemListMap; - - - //! An APE tag implementation - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Create an APE tag with default values. - */ - Tag(); - - /*! - * Create an APE tag and parse the data in \a file with APE footer at - * \a tagOffset. - */ - Tag(TagLib::File *file, long footerLocation); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Renders the in memory values to a ByteVector suitable for writing to - * the file. - */ - ByteVector render() const; - - /*! - * Returns the string "APETAGEX" suitable for usage in locating the tag in a - * file. - */ - static ByteVector fileIdentifier(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - - /*! - * Implements the unified tag dictionary interface -- export function. - * APE tags are perfectly compatible with the dictionary interface because they - * support both arbitrary tag names and multiple values. Currently only - * APE items of type *Text* are handled by the dictionary interface; all *Binary* - * and *Locator* items will be put into the unsupportedData list and can be - * deleted on request using removeUnsupportedProperties(). The same happens - * to Text items if their key is invalid for PropertyMap (which should actually - * never happen). - * - * The only conversion done by this export function is to rename the APE tags - * TRACK to TRACKNUMBER, YEAR to DATE, and ALBUM ARTIST to ALBUMARTIST, respectively, - * in order to be compliant with the names used in other formats. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified tag dictionary interface -- import function. The same - * comments as for the export function apply; additionally note that the APE tag - * specification requires keys to have between 2 and 16 printable ASCII characters - * with the exception of the fixed strings "ID3", "TAG", "OGGS", and "MP+". - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Check if the given String is a valid APE tag key. - */ - static bool checkKey(const String&); - - /*! - * Returns a pointer to the tag's footer. - */ - Footer *footer() const; - - /*! - * Returns a reference to the item list map. This is an ItemListMap of - * all of the items in the tag. - * - * This is the most powerfull structure for accessing the items of the tag. - * - * APE tags are case-insensitive, all keys in this map have been converted - * to upper case. - * - * \warning You should not modify this data structure directly, instead - * use setItem() and removeItem(). - */ - const ItemListMap &itemListMap() const; - - /*! - * Removes the \a key item from the tag - */ - void removeItem(const String &key); - - /*! - * Adds to the text item specified by \a key the data \a value. If \a replace - * is true, then all of the other values on the same key will be removed - * first. If a binary item exists for \a key it will be removed first. - */ - void addValue(const String &key, const String &value, bool replace = true); - - /*! - * Set the binary data for the key specified by \a item to \a value - * This will convert the item to type \a Binary if it isn't already and - * all of the other values on the same key will be removed. - */ - void setData(const String &key, const ByteVector &value); - - /*! - * Sets the \a key item to the value of \a item. If an item with the \a key is already - * present, it will be replaced. - */ - void setItem(const String &key, const Item &item); - - /*! - * Returns true if the tag does not contain any data. - */ - bool isEmpty() const; - - protected: - - /*! - * Reads from the file specified in the constructor. - */ - void read(); - - /*! - * Parses the body of the tag in \a data. - */ - void parse(const ByteVector &data); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/asf/asfattribute.cpp b/src/taglib/taglib/asf/asfattribute.cpp deleted file mode 100644 index 4ee2d0a..0000000 --- a/src/taglib/taglib/asf/asfattribute.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "trefcounter.h" -#include "asfattribute.h" -#include "asffile.h" - -using namespace TagLib; - -class ASF::Attribute::AttributePrivate : public RefCounter -{ -public: - AttributePrivate() - : pictureValue(ASF::Picture::fromInvalid()), - stream(0), - language(0) {} - AttributeTypes type; - String stringValue; - ByteVector byteVectorValue; - ASF::Picture pictureValue; - union { - unsigned int intValue; - unsigned short shortValue; - unsigned long long longLongValue; - bool boolValue; - }; - int stream; - int language; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ASF::Attribute::Attribute() -{ - d = new AttributePrivate; - d->type = UnicodeType; -} - -ASF::Attribute::Attribute(const ASF::Attribute &other) - : d(other.d) -{ - d->ref(); -} - -ASF::Attribute &ASF::Attribute::operator=(const ASF::Attribute &other) -{ - if(d->deref()) - delete d; - d = other.d; - d->ref(); - return *this; -} - -ASF::Attribute::~Attribute() -{ - if(d->deref()) - delete d; -} - -ASF::Attribute::Attribute(const String &value) -{ - d = new AttributePrivate; - d->type = UnicodeType; - d->stringValue = value; -} - -ASF::Attribute::Attribute(const ByteVector &value) -{ - d = new AttributePrivate; - d->type = BytesType; - d->byteVectorValue = value; -} - -ASF::Attribute::Attribute(const ASF::Picture &value) -{ - d = new AttributePrivate; - d->type = BytesType; - d->pictureValue = value; -} - -ASF::Attribute::Attribute(unsigned int value) -{ - d = new AttributePrivate; - d->type = DWordType; - d->intValue = value; -} - -ASF::Attribute::Attribute(unsigned long long value) -{ - d = new AttributePrivate; - d->type = QWordType; - d->longLongValue = value; -} - -ASF::Attribute::Attribute(unsigned short value) -{ - d = new AttributePrivate; - d->type = WordType; - d->shortValue = value; -} - -ASF::Attribute::Attribute(bool value) -{ - d = new AttributePrivate; - d->type = BoolType; - d->boolValue = value; -} - -ASF::Attribute::AttributeTypes ASF::Attribute::type() const -{ - return d->type; -} - -String ASF::Attribute::toString() const -{ - return d->stringValue; -} - -ByteVector ASF::Attribute::toByteVector() const -{ - if(d->pictureValue.isValid()) - return d->pictureValue.render(); - return d->byteVectorValue; -} - -unsigned short ASF::Attribute::toBool() const -{ - return d->shortValue; -} - -unsigned short ASF::Attribute::toUShort() const -{ - return d->shortValue; -} - -unsigned int ASF::Attribute::toUInt() const -{ - return d->intValue; -} - -unsigned long long ASF::Attribute::toULongLong() const -{ - return d->longLongValue; -} - -ASF::Picture ASF::Attribute::toPicture() const -{ - return d->pictureValue; -} - -String ASF::Attribute::parse(ASF::File &f, int kind) -{ - uint size, nameLength; - String name; - d->pictureValue = Picture::fromInvalid(); - // extended content descriptor - if(kind == 0) { - nameLength = f.readWORD(); - name = f.readString(nameLength); - d->type = ASF::Attribute::AttributeTypes(f.readWORD()); - size = f.readWORD(); - } - // metadata & metadata library - else { - int temp = f.readWORD(); - // metadata library - if(kind == 2) { - d->language = temp; - } - d->stream = f.readWORD(); - nameLength = f.readWORD(); - d->type = ASF::Attribute::AttributeTypes(f.readWORD()); - size = f.readDWORD(); - name = f.readString(nameLength); - } - - if(kind != 2 && size > 65535) { - debug("ASF::Attribute::parse() -- Value larger than 64kB"); - } - - switch(d->type) { - case WordType: - d->shortValue = f.readWORD(); - break; - - case BoolType: - if(kind == 0) { - d->boolValue = f.readDWORD() == 1; - } - else { - d->boolValue = f.readWORD() == 1; - } - break; - - case DWordType: - d->intValue = f.readDWORD(); - break; - - case QWordType: - d->longLongValue = f.readQWORD(); - break; - - case UnicodeType: - d->stringValue = f.readString(size); - break; - - case BytesType: - case GuidType: - d->byteVectorValue = f.readBlock(size); - break; - } - - if(d->type == BytesType && name == "WM/Picture") { - d->pictureValue.parse(d->byteVectorValue); - if(d->pictureValue.isValid()) { - d->byteVectorValue.clear(); - } - } - - return name; -} - -int ASF::Attribute::dataSize() const -{ - switch (d->type) { - case WordType: - return 2; - case BoolType: - return 4; - case DWordType: - return 4; - case QWordType: - return 5; - case UnicodeType: - return d->stringValue.size() * 2 + 2; - case BytesType: - if(d->pictureValue.isValid()) - return d->pictureValue.dataSize(); - case GuidType: - return d->byteVectorValue.size(); - } - return 0; -} - -ByteVector ASF::Attribute::render(const String &name, int kind) const -{ - ByteVector data; - - switch (d->type) { - case WordType: - data.append(ByteVector::fromShort(d->shortValue, false)); - break; - - case BoolType: - if(kind == 0) { - data.append(ByteVector::fromUInt(d->boolValue ? 1 : 0, false)); - } - else { - data.append(ByteVector::fromShort(d->boolValue ? 1 : 0, false)); - } - break; - - case DWordType: - data.append(ByteVector::fromUInt(d->intValue, false)); - break; - - case QWordType: - data.append(ByteVector::fromLongLong(d->longLongValue, false)); - break; - - case UnicodeType: - data.append(File::renderString(d->stringValue)); - break; - - case BytesType: - if(d->pictureValue.isValid()) { - data.append(d->pictureValue.render()); - break; - } - case GuidType: - data.append(d->byteVectorValue); - break; - } - - if(kind == 0) { - data = File::renderString(name, true) + - ByteVector::fromShort((int)d->type, false) + - ByteVector::fromShort(data.size(), false) + - data; - } - else { - ByteVector nameData = File::renderString(name); - data = ByteVector::fromShort(kind == 2 ? d->language : 0, false) + - ByteVector::fromShort(d->stream, false) + - ByteVector::fromShort(nameData.size(), false) + - ByteVector::fromShort((int)d->type, false) + - ByteVector::fromUInt(data.size(), false) + - nameData + - data; - } - - return data; -} - -int ASF::Attribute::language() const -{ - return d->language; -} - -void ASF::Attribute::setLanguage(int value) -{ - d->language = value; -} - -int ASF::Attribute::stream() const -{ - return d->stream; -} - -void ASF::Attribute::setStream(int value) -{ - d->stream = value; -} - diff --git a/src/taglib/taglib/asf/asfattribute.h b/src/taglib/taglib/asf/asfattribute.h deleted file mode 100644 index 54eb0c7..0000000 --- a/src/taglib/taglib/asf/asfattribute.h +++ /dev/null @@ -1,203 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFATTRIBUTE_H -#define TAGLIB_ASFATTRIBUTE_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "asfpicture.h" - -namespace TagLib -{ - - namespace ASF - { - - class File; - class Picture; - - class TAGLIB_EXPORT Attribute - { - public: - - /*! - * Enum of types an Attribute can have. - */ - enum AttributeTypes { - UnicodeType = 0, - BytesType = 1, - BoolType = 2, - DWordType = 3, - QWordType = 4, - WordType = 5, - GuidType = 6 - }; - - /*! - * Constructs an empty attribute. - */ - Attribute(); - - /*! - * Constructs an attribute with \a key and a UnicodeType \a value. - */ - Attribute(const String &value); - - /*! - * Constructs an attribute with \a key and a BytesType \a value. - */ - Attribute(const ByteVector &value); - - /*! - * Constructs an attribute with \a key and a Picture \a value. - * - * This attribute is compatible with the ID3 frame, APIC. The ID3 specification for the APIC frame stipulates that, - * while there may be any number of APIC frames associated with a file, - * only one may be of type 1 and only one may be of type 2. - * - * The specification also states that the description of the picture can be no longer than 64 characters, but can be empty. - * WM/Picture attributes added with TagLib::ASF are not automatically validated to conform to ID3 specifications. - * You must add code in your application to perform validations if you want to maintain complete compatibility with ID3. - */ - Attribute(const Picture &value); - - /*! - * Constructs an attribute with \a key and a DWordType \a value. - */ - Attribute(unsigned int value); - - /*! - * Constructs an attribute with \a key and a QWordType \a value. - */ - Attribute(unsigned long long value); - - /*! - * Constructs an attribute with \a key and a WordType \a value. - */ - Attribute(unsigned short value); - - /*! - * Constructs an attribute with \a key and a BoolType \a value. - */ - Attribute(bool value); - - /*! - * Construct an attribute as a copy of \a other. - */ - Attribute(const Attribute &item); - - /*! - * Copies the contents of \a other into this item. - */ - ASF::Attribute &operator=(const Attribute &other); - - /*! - * Destroys the attribute. - */ - virtual ~Attribute(); - - /*! - * Returns type of the value. - */ - AttributeTypes type() const; - - /*! - * Returns the BoolType \a value. - */ - unsigned short toBool() const; - - /*! - * Returns the WordType \a value. - */ - unsigned short toUShort() const; - - /*! - * Returns the DWordType \a value. - */ - unsigned int toUInt() const; - - /*! - * Returns the QWordType \a value. - */ - unsigned long long toULongLong() const; - - /*! - * Returns the UnicodeType \a value. - */ - String toString() const; - - /*! - * Returns the BytesType \a value. - */ - ByteVector toByteVector() const; - - /*! - * Returns the Picture \a value. - */ - Picture toPicture() const; - - /*! - * Returns the language number, or 0 is no stream number was set. - */ - int language() const; - - /*! - * Sets the language number. - */ - void setLanguage(int value); - - /*! - * Returns the stream number, or 0 is no stream number was set. - */ - int stream() const; - - /*! - * Sets the stream number. - */ - void setStream(int value); - -#ifndef DO_NOT_DOCUMENT - /* THIS IS PRIVATE, DON'T TOUCH IT! */ - String parse(ASF::File &file, int kind = 0); -#endif - - //! Returns the size of the stored data - int dataSize() const; - - private: - friend class File; - - ByteVector render(const String &name, int kind = 0) const; - - class AttributePrivate; - AttributePrivate *d; - }; - } - -} - -#endif diff --git a/src/taglib/taglib/asf/asffile.cpp b/src/taglib/taglib/asf/asffile.cpp deleted file mode 100644 index 241998c..0000000 --- a/src/taglib/taglib/asf/asffile.cpp +++ /dev/null @@ -1,630 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <tstring.h> -#include "asffile.h" -#include "asftag.h" -#include "asfproperties.h" - -using namespace TagLib; - -class ASF::File::FilePrivate -{ -public: - FilePrivate(): - size(0), - tag(0), - properties(0), - contentDescriptionObject(0), - extendedContentDescriptionObject(0), - headerExtensionObject(0), - metadataObject(0), - metadataLibraryObject(0) {} - unsigned long long size; - ASF::Tag *tag; - ASF::Properties *properties; - List<ASF::File::BaseObject *> objects; - ASF::File::ContentDescriptionObject *contentDescriptionObject; - ASF::File::ExtendedContentDescriptionObject *extendedContentDescriptionObject; - ASF::File::HeaderExtensionObject *headerExtensionObject; - ASF::File::MetadataObject *metadataObject; - ASF::File::MetadataLibraryObject *metadataLibraryObject; -}; - -static ByteVector headerGuid("\x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C", 16); -static ByteVector filePropertiesGuid("\xA1\xDC\xAB\x8C\x47\xA9\xCF\x11\x8E\xE4\x00\xC0\x0C\x20\x53\x65", 16); -static ByteVector streamPropertiesGuid("\x91\x07\xDC\xB7\xB7\xA9\xCF\x11\x8E\xE6\x00\xC0\x0C\x20\x53\x65", 16); -static ByteVector contentDescriptionGuid("\x33\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C", 16); -static ByteVector extendedContentDescriptionGuid("\x40\xA4\xD0\xD2\x07\xE3\xD2\x11\x97\xF0\x00\xA0\xC9\x5E\xA8\x50", 16); -static ByteVector headerExtensionGuid("\xb5\x03\xbf_.\xa9\xcf\x11\x8e\xe3\x00\xc0\x0c Se", 16); -static ByteVector metadataGuid("\xEA\xCB\xF8\xC5\xAF[wH\204g\xAA\214D\xFAL\xCA", 16); -static ByteVector metadataLibraryGuid("\224\034#D\230\224\321I\241A\x1d\x13NEpT", 16); -static ByteVector contentEncryptionGuid("\xFB\xB3\x11\x22\x23\xBD\xD2\x11\xB4\xB7\x00\xA0\xC9\x55\xFC\x6E", 16); -static ByteVector extendedContentEncryptionGuid("\x14\xE6\x8A\x29\x22\x26 \x17\x4C\xB9\x35\xDA\xE0\x7E\xE9\x28\x9C", 16); -static ByteVector advancedContentEncryptionGuid("\xB6\x9B\x07\x7A\xA4\xDA\x12\x4E\xA5\xCA\x91\xD3\x8D\xC1\x1A\x8D", 16); - -class ASF::File::BaseObject -{ -public: - ByteVector data; - virtual ~BaseObject() {} - virtual ByteVector guid() = 0; - virtual void parse(ASF::File *file, unsigned int size); - virtual ByteVector render(ASF::File *file); -}; - -class ASF::File::UnknownObject : public ASF::File::BaseObject -{ - ByteVector myGuid; -public: - UnknownObject(const ByteVector &guid); - ByteVector guid(); -}; - -class ASF::File::FilePropertiesObject : public ASF::File::BaseObject -{ -public: - ByteVector guid(); - void parse(ASF::File *file, uint size); -}; - -class ASF::File::StreamPropertiesObject : public ASF::File::BaseObject -{ -public: - ByteVector guid(); - void parse(ASF::File *file, uint size); -}; - -class ASF::File::ContentDescriptionObject : public ASF::File::BaseObject -{ -public: - ByteVector guid(); - void parse(ASF::File *file, uint size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::ExtendedContentDescriptionObject : public ASF::File::BaseObject -{ -public: - ByteVectorList attributeData; - ByteVector guid(); - void parse(ASF::File *file, uint size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::MetadataObject : public ASF::File::BaseObject -{ -public: - ByteVectorList attributeData; - ByteVector guid(); - void parse(ASF::File *file, uint size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::MetadataLibraryObject : public ASF::File::BaseObject -{ -public: - ByteVectorList attributeData; - ByteVector guid(); - void parse(ASF::File *file, uint size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::HeaderExtensionObject : public ASF::File::BaseObject -{ -public: - List<ASF::File::BaseObject *> objects; - ~HeaderExtensionObject(); - ByteVector guid(); - void parse(ASF::File *file, uint size); - ByteVector render(ASF::File *file); -}; - -ASF::File::HeaderExtensionObject::~HeaderExtensionObject() -{ - for(unsigned int i = 0; i < objects.size(); i++) { - delete objects[i]; - } -} - -void ASF::File::BaseObject::parse(ASF::File *file, unsigned int size) -{ - data.clear(); - if (size > 24 && size <= (unsigned int)(file->length())) - data = file->readBlock(size - 24); - else - data = ByteVector::null; -} - -ByteVector ASF::File::BaseObject::render(ASF::File * /*file*/) -{ - return guid() + ByteVector::fromLongLong(data.size() + 24, false) + data; -} - -ASF::File::UnknownObject::UnknownObject(const ByteVector &guid) : myGuid(guid) -{ -} - -ByteVector ASF::File::UnknownObject::guid() -{ - return myGuid; -} - -ByteVector ASF::File::FilePropertiesObject::guid() -{ - return filePropertiesGuid; -} - -void ASF::File::FilePropertiesObject::parse(ASF::File *file, uint size) -{ - BaseObject::parse(file, size); - file->d->properties->setLength( - (int)(data.toLongLong(40, false) / 10000000L - data.toLongLong(56, false) / 1000L)); -} - -ByteVector ASF::File::StreamPropertiesObject::guid() -{ - return streamPropertiesGuid; -} - -void ASF::File::StreamPropertiesObject::parse(ASF::File *file, uint size) -{ - BaseObject::parse(file, size); - file->d->properties->setChannels(data.toShort(56, false)); - file->d->properties->setSampleRate(data.toUInt(58, false)); - file->d->properties->setBitrate(data.toUInt(62, false) * 8 / 1000); -} - -ByteVector ASF::File::ContentDescriptionObject::guid() -{ - return contentDescriptionGuid; -} - -void ASF::File::ContentDescriptionObject::parse(ASF::File *file, uint /*size*/) -{ - file->d->contentDescriptionObject = this; - int titleLength = file->readWORD(); - int artistLength = file->readWORD(); - int copyrightLength = file->readWORD(); - int commentLength = file->readWORD(); - int ratingLength = file->readWORD(); - file->d->tag->setTitle(file->readString(titleLength)); - file->d->tag->setArtist(file->readString(artistLength)); - file->d->tag->setCopyright(file->readString(copyrightLength)); - file->d->tag->setComment(file->readString(commentLength)); - file->d->tag->setRating(file->readString(ratingLength)); -} - -ByteVector ASF::File::ContentDescriptionObject::render(ASF::File *file) -{ - ByteVector v1 = file->renderString(file->d->tag->title()); - ByteVector v2 = file->renderString(file->d->tag->artist()); - ByteVector v3 = file->renderString(file->d->tag->copyright()); - ByteVector v4 = file->renderString(file->d->tag->comment()); - ByteVector v5 = file->renderString(file->d->tag->rating()); - data.clear(); - data.append(ByteVector::fromShort(v1.size(), false)); - data.append(ByteVector::fromShort(v2.size(), false)); - data.append(ByteVector::fromShort(v3.size(), false)); - data.append(ByteVector::fromShort(v4.size(), false)); - data.append(ByteVector::fromShort(v5.size(), false)); - data.append(v1); - data.append(v2); - data.append(v3); - data.append(v4); - data.append(v5); - return BaseObject::render(file); -} - -ByteVector ASF::File::ExtendedContentDescriptionObject::guid() -{ - return extendedContentDescriptionGuid; -} - -void ASF::File::ExtendedContentDescriptionObject::parse(ASF::File *file, uint /*size*/) -{ - file->d->extendedContentDescriptionObject = this; - int count = file->readWORD(); - while(count--) { - ASF::Attribute attribute; - String name = attribute.parse(*file); - file->d->tag->addAttribute(name, attribute); - } -} - -ByteVector ASF::File::ExtendedContentDescriptionObject::render(ASF::File *file) -{ - data.clear(); - data.append(ByteVector::fromShort(attributeData.size(), false)); - data.append(attributeData.toByteVector(ByteVector::null)); - return BaseObject::render(file); -} - -ByteVector ASF::File::MetadataObject::guid() -{ - return metadataGuid; -} - -void ASF::File::MetadataObject::parse(ASF::File *file, uint /*size*/) -{ - file->d->metadataObject = this; - int count = file->readWORD(); - while(count--) { - ASF::Attribute attribute; - String name = attribute.parse(*file, 1); - file->d->tag->addAttribute(name, attribute); - } -} - -ByteVector ASF::File::MetadataObject::render(ASF::File *file) -{ - data.clear(); - data.append(ByteVector::fromShort(attributeData.size(), false)); - data.append(attributeData.toByteVector(ByteVector::null)); - return BaseObject::render(file); -} - -ByteVector ASF::File::MetadataLibraryObject::guid() -{ - return metadataLibraryGuid; -} - -void ASF::File::MetadataLibraryObject::parse(ASF::File *file, uint /*size*/) -{ - file->d->metadataLibraryObject = this; - int count = file->readWORD(); - while(count--) { - ASF::Attribute attribute; - String name = attribute.parse(*file, 2); - file->d->tag->addAttribute(name, attribute); - } -} - -ByteVector ASF::File::MetadataLibraryObject::render(ASF::File *file) -{ - data.clear(); - data.append(ByteVector::fromShort(attributeData.size(), false)); - data.append(attributeData.toByteVector(ByteVector::null)); - return BaseObject::render(file); -} - -ByteVector ASF::File::HeaderExtensionObject::guid() -{ - return headerExtensionGuid; -} - -void ASF::File::HeaderExtensionObject::parse(ASF::File *file, uint /*size*/) -{ - file->d->headerExtensionObject = this; - file->seek(18, File::Current); - long long dataSize = file->readDWORD(); - long long dataPos = 0; - while(dataPos < dataSize) { - ByteVector guid = file->readBlock(16); - if(guid.size() != 16) { - file->setValid(false); - break; - } - bool ok; - long long size = file->readQWORD(&ok); - if(!ok) { - file->setValid(false); - break; - } - BaseObject *obj; - if(guid == metadataGuid) { - obj = new MetadataObject(); - } - else if(guid == metadataLibraryGuid) { - obj = new MetadataLibraryObject(); - } - else { - obj = new UnknownObject(guid); - } - obj->parse(file, (unsigned int)size); - objects.append(obj); - dataPos += size; - } -} - -ByteVector ASF::File::HeaderExtensionObject::render(ASF::File *file) -{ - data.clear(); - for(unsigned int i = 0; i < objects.size(); i++) { - data.append(objects[i]->render(file)); - } - data = ByteVector("\x11\xD2\xD3\xAB\xBA\xA9\xcf\x11\x8E\xE6\x00\xC0\x0C\x20\x53\x65\x06\x00", 18) + ByteVector::fromUInt(data.size(), false) + data; - return BaseObject::render(file); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ASF::File::File(FileName file, bool readProperties, Properties::ReadStyle propertiesStyle) - : TagLib::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -ASF::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle propertiesStyle) - : TagLib::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -ASF::File::~File() -{ - for(unsigned int i = 0; i < d->objects.size(); i++) { - delete d->objects[i]; - } - if(d->tag) { - delete d->tag; - } - if(d->properties) { - delete d->properties; - } - delete d; -} - -ASF::Tag *ASF::File::tag() const -{ - return d->tag; -} - -PropertyMap ASF::File::properties() const -{ - return d->tag->properties(); -} - -void ASF::File::removeUnsupportedProperties(const StringList &properties) -{ - d->tag->removeUnsupportedProperties(properties); -} - -PropertyMap ASF::File::setProperties(const PropertyMap &properties) -{ - return d->tag->setProperties(properties); -} - -ASF::Properties *ASF::File::audioProperties() const -{ - return d->properties; -} - -void ASF::File::read(bool /*readProperties*/, Properties::ReadStyle /*propertiesStyle*/) -{ - if(!isValid()) - return; - - ByteVector guid = readBlock(16); - if(guid != headerGuid) { - debug("ASF: Not an ASF file."); - setValid(false); - return; - } - - d->tag = new ASF::Tag(); - d->properties = new ASF::Properties(); - - bool ok; - d->size = readQWORD(&ok); - if(!ok) { - setValid(false); - return; - } - int numObjects = readDWORD(&ok); - if(!ok) { - setValid(false); - return; - } - seek(2, Current); - - for(int i = 0; i < numObjects; i++) { - ByteVector guid = readBlock(16); - if(guid.size() != 16) { - setValid(false); - break; - } - long size = (long)readQWORD(&ok); - if(!ok) { - setValid(false); - break; - } - BaseObject *obj; - if(guid == filePropertiesGuid) { - obj = new FilePropertiesObject(); - } - else if(guid == streamPropertiesGuid) { - obj = new StreamPropertiesObject(); - } - else if(guid == contentDescriptionGuid) { - obj = new ContentDescriptionObject(); - } - else if(guid == extendedContentDescriptionGuid) { - obj = new ExtendedContentDescriptionObject(); - } - else if(guid == headerExtensionGuid) { - obj = new HeaderExtensionObject(); - } - else { - if(guid == contentEncryptionGuid || - guid == extendedContentEncryptionGuid || - guid == advancedContentEncryptionGuid) { - d->properties->setEncrypted(true); - } - obj = new UnknownObject(guid); - } - obj->parse(this, size); - d->objects.append(obj); - } -} - -bool ASF::File::save() -{ - if(readOnly()) { - debug("ASF::File::save() -- File is read only."); - return false; - } - - if(!isValid()) { - debug("ASF::File::save() -- Trying to save invalid file."); - return false; - } - - if(!d->contentDescriptionObject) { - d->contentDescriptionObject = new ContentDescriptionObject(); - d->objects.append(d->contentDescriptionObject); - } - if(!d->extendedContentDescriptionObject) { - d->extendedContentDescriptionObject = new ExtendedContentDescriptionObject(); - d->objects.append(d->extendedContentDescriptionObject); - } - if(!d->headerExtensionObject) { - d->headerExtensionObject = new HeaderExtensionObject(); - d->objects.append(d->headerExtensionObject); - } - if(!d->metadataObject) { - d->metadataObject = new MetadataObject(); - d->headerExtensionObject->objects.append(d->metadataObject); - } - if(!d->metadataLibraryObject) { - d->metadataLibraryObject = new MetadataLibraryObject(); - d->headerExtensionObject->objects.append(d->metadataLibraryObject); - } - - ASF::AttributeListMap::ConstIterator it = d->tag->attributeListMap().begin(); - for(; it != d->tag->attributeListMap().end(); it++) { - const String &name = it->first; - const AttributeList &attributes = it->second; - bool inExtendedContentDescriptionObject = false; - bool inMetadataObject = false; - for(unsigned int j = 0; j < attributes.size(); j++) { - const Attribute &attribute = attributes[j]; - bool largeValue = attribute.dataSize() > 65535; - if(!inExtendedContentDescriptionObject && !largeValue && attribute.language() == 0 && attribute.stream() == 0) { - d->extendedContentDescriptionObject->attributeData.append(attribute.render(name)); - inExtendedContentDescriptionObject = true; - } - else if(!inMetadataObject && !largeValue && attribute.language() == 0 && attribute.stream() != 0) { - d->metadataObject->attributeData.append(attribute.render(name, 1)); - inMetadataObject = true; - } - else { - d->metadataLibraryObject->attributeData.append(attribute.render(name, 2)); - } - } - } - - ByteVector data; - for(unsigned int i = 0; i < d->objects.size(); i++) { - data.append(d->objects[i]->render(this)); - } - data = headerGuid + ByteVector::fromLongLong(data.size() + 30, false) + ByteVector::fromUInt(d->objects.size(), false) + ByteVector("\x01\x02", 2) + data; - insert(data, 0, (TagLib::ulong)d->size); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -int ASF::File::readBYTE(bool *ok) -{ - ByteVector v = readBlock(1); - if(v.size() != 1) { - if(ok) *ok = false; - return 0; - } - if(ok) *ok = true; - return v[0]; -} - -int ASF::File::readWORD(bool *ok) -{ - ByteVector v = readBlock(2); - if(v.size() != 2) { - if(ok) *ok = false; - return 0; - } - if(ok) *ok = true; - return v.toUShort(false); -} - -unsigned int ASF::File::readDWORD(bool *ok) -{ - ByteVector v = readBlock(4); - if(v.size() != 4) { - if(ok) *ok = false; - return 0; - } - if(ok) *ok = true; - return v.toUInt(false); -} - -long long ASF::File::readQWORD(bool *ok) -{ - ByteVector v = readBlock(8); - if(v.size() != 8) { - if(ok) *ok = false; - return 0; - } - if(ok) *ok = true; - return v.toLongLong(false); -} - -String ASF::File::readString(int length) -{ - ByteVector data = readBlock(length); - unsigned int size = data.size(); - while (size >= 2) { - if(data[size - 1] != '\0' || data[size - 2] != '\0') { - break; - } - size -= 2; - } - if(size != data.size()) { - data.resize(size); - } - return String(data, String::UTF16LE); -} - -ByteVector ASF::File::renderString(const String &str, bool includeLength) -{ - ByteVector data = str.data(String::UTF16LE) + ByteVector::fromShort(0, false); - if(includeLength) { - data = ByteVector::fromShort(data.size(), false) + data; - } - return data; -} - diff --git a/src/taglib/taglib/asf/asffile.h b/src/taglib/taglib/asf/asffile.h deleted file mode 100644 index 5ccf2fd..0000000 --- a/src/taglib/taglib/asf/asffile.h +++ /dev/null @@ -1,148 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFFILE_H -#define TAGLIB_ASFFILE_H - -#include "tag.h" -#include "tfile.h" -#include "taglib_export.h" -#include "asfproperties.h" -#include "asftag.h" - -namespace TagLib { - - //! An implementation of ASF (WMA) metadata - namespace ASF { - - /*! - * This implements and provides an interface for ASF files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to ASF files. - */ - class TAGLIB_EXPORT File : public TagLib::File - { - public: - - /*! - * Constructs an ASF file from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an ASF file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to the ASF tag of the file. - * - * ASF::Tag implements the tag interface, so this serves as the - * reimplementation of TagLib::File::tag(). - * - * \note The Tag <b>is still</b> owned by the ASF::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - virtual Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties. Forwards to the actual Tag's - * removeUnsupportedProperties() function. - */ - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the ASF audio properties for this file. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - private: - int readBYTE(bool *ok = 0); - int readWORD(bool *ok = 0); - unsigned int readDWORD(bool *ok = 0); - long long readQWORD(bool *ok = 0); - static ByteVector renderString(const String &str, bool includeLength = false); - String readString(int len); - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - friend class Attribute; - friend class Picture; - - class BaseObject; - class UnknownObject; - class FilePropertiesObject; - class StreamPropertiesObject; - class ContentDescriptionObject; - class ExtendedContentDescriptionObject; - class HeaderExtensionObject; - class MetadataObject; - class MetadataLibraryObject; - - class FilePrivate; - FilePrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/asf/asfpicture.cpp b/src/taglib/taglib/asf/asfpicture.cpp deleted file mode 100644 index 999f920..0000000 --- a/src/taglib/taglib/asf/asfpicture.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Anton Sergunov - email : setosha@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "trefcounter.h" -#include "asfattribute.h" -#include "asffile.h" -#include "asfpicture.h" - -using namespace TagLib; - -class ASF::Picture::PicturePrivate : public RefCounter -{ -public: - bool valid; - Type type; - String mimeType; - String description; - ByteVector picture; -}; - -//////////////////////////////////////////////////////////////////////////////// -// Picture class members -//////////////////////////////////////////////////////////////////////////////// - -ASF::Picture::Picture() -{ - d = new PicturePrivate(); - d->valid = true; -} - -ASF::Picture::Picture(const Picture& other) - : d(other.d) -{ - d->ref(); -} - -ASF::Picture::~Picture() -{ - if(d->deref()) - delete d; -} - -bool ASF::Picture::isValid() const -{ - return d->valid; -} - -String ASF::Picture::mimeType() const -{ - return d->mimeType; -} - -void ASF::Picture::setMimeType(const String &value) -{ - d->mimeType = value; -} - -ASF::Picture::Type ASF::Picture::type() const -{ - return d->type; -} - -void ASF::Picture::setType(const ASF::Picture::Type& t) -{ - d->type = t; -} - -String ASF::Picture::description() const -{ - return d->description; -} - -void ASF::Picture::setDescription(const String &desc) -{ - d->description = desc; -} - -ByteVector ASF::Picture::picture() const -{ - return d->picture; -} - -void ASF::Picture::setPicture(const ByteVector &p) -{ - d->picture = p; -} - -int ASF::Picture::dataSize() const -{ - return - 9 + (d->mimeType.length() + d->description.length()) * 2 + - d->picture.size(); -} - -ASF::Picture& ASF::Picture::operator=(const ASF::Picture& other) -{ - if(other.d != d) { - if(d->deref()) - delete d; - d = other.d; - d->ref(); - } - return *this; -} - -ByteVector ASF::Picture::render() const -{ - if(!isValid()) - return ByteVector::null; - return - ByteVector((char)d->type) + - ByteVector::fromUInt(d->picture.size(), false) + - ASF::File::renderString(d->mimeType) + - ASF::File::renderString(d->description) + - d->picture; -} - -void ASF::Picture::parse(const ByteVector& bytes) -{ - d->valid = false; - if(bytes.size() < 9) - return; - int pos = 0; - d->type = (Type)bytes[0]; ++pos; - const uint dataLen = bytes.toUInt(pos, false); pos+=4; - - const ByteVector nullStringTerminator(2, 0); - - int endPos = bytes.find(nullStringTerminator, pos, 2); - if(endPos < 0) - return; - d->mimeType = String(bytes.mid(pos, endPos - pos), String::UTF16LE); - pos = endPos+2; - - endPos = bytes.find(nullStringTerminator, pos, 2); - if(endPos < 0) - return; - d->description = String(bytes.mid(pos, endPos - pos), String::UTF16LE); - pos = endPos+2; - - if(dataLen + pos != bytes.size()) - return; - - d->picture = bytes.mid(pos, dataLen); - d->valid = true; - return; -} - -ASF::Picture ASF::Picture::fromInvalid() -{ - Picture ret; - ret.d->valid = false; - return ret; -} - diff --git a/src/taglib/taglib/asf/asfpicture.h b/src/taglib/taglib/asf/asfpicture.h deleted file mode 100644 index aa0a060..0000000 --- a/src/taglib/taglib/asf/asfpicture.h +++ /dev/null @@ -1,217 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Anton Sergunov - email : setosha@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef ASFPICTURE_H -#define ASFPICTURE_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "attachedpictureframe.h" - -namespace TagLib -{ - namespace ASF - { - - //! An ASF attached picture interface implementation - - /*! - * This is an implementation of ASF attached pictures interface. Pictures may be - * included in attributes, one per WM/Picture attribute (but there may be multiple WM/Picture - * attribute in a single tag). These pictures are usually in either JPEG or - * PNG format. - * \see Attribute::toPicture() - * \see Attribute::Attribute(const Picture& picture) - */ - class TAGLIB_EXPORT Picture { - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - /*! - * Constructs an empty picture. - */ - Picture(); - - /*! - * Construct an picture as a copy of \a other. - */ - Picture(const Picture& other); - - /*! - * Destroys the picture. - */ - virtual ~Picture(); - - /*! - * Copies the contents of \a other into this picture. - */ - Picture& operator=(const Picture& other); - - /*! - * Returns true if Picture stores valid picture - */ - bool isValid() const; - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - * \see setMimeType(const String &) - * \see picture() - * \see setPicture(const ByteArray&) - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - * \see setMimeType(const String &) - * \see picture() - * \see setPicture(const ByteArray&) - */ - void setMimeType(const String &value); - - /*! - * Returns the type of the image. - * - * \see Type - * \see setType() - */ - Type type() const; - - /*! - * Sets the type for the image. - * - * \see Type - * \see type() - */ - void setType(const ASF::Picture::Type& t); - - /*! - * Returns a text description of the image. - * - * \see setDescription() - */ - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - * - * \see description() - */ - void setDescription(const String &desc); - - /*! - * Returns the image data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setPicture() - * \see mimeType() - */ - ByteVector picture() const; - - /*! - * Sets the image data to \a p. \a p should be of the type specified in - * this frame's mime-type specification. - * - * \see picture() - * \see mimeType() - * \see setMimeType() - */ - void setPicture(const ByteVector &p); - - /*! - * Returns picture as binary raw data \a value - */ - ByteVector render() const; - - /*! - * Returns picture as binary raw data \a value - */ - int dataSize() const; - -#ifndef DO_NOT_DOCUMENT - /* THIS IS PRIVATE, DON'T TOUCH IT! */ - void parse(const ByteVector& ); - static Picture fromInvalid(); - friend class Attribute; -#endif - private: - class PicturePrivate; - PicturePrivate *d; - }; - } -} - -#endif // ASFPICTURE_H diff --git a/src/taglib/taglib/asf/asfproperties.cpp b/src/taglib/taglib/asf/asfproperties.cpp deleted file mode 100644 index b82c131..0000000 --- a/src/taglib/taglib/asf/asfproperties.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include "asfproperties.h" - -using namespace TagLib; - -class ASF::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(): length(0), bitrate(0), sampleRate(0), channels(0), encrypted(false) {} - int length; - int bitrate; - int sampleRate; - int channels; - bool encrypted; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ASF::Properties::Properties() : AudioProperties(AudioProperties::Average) -{ - d = new PropertiesPrivate; -} - -ASF::Properties::~Properties() -{ - if(d) - delete d; -} - -int ASF::Properties::length() const -{ - return d->length; -} - -int ASF::Properties::bitrate() const -{ - return d->bitrate; -} - -int ASF::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int ASF::Properties::channels() const -{ - return d->channels; -} - -bool ASF::Properties::isEncrypted() const -{ - return d->encrypted; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void ASF::Properties::setLength(int length) -{ - d->length = length; -} - -void ASF::Properties::setBitrate(int length) -{ - d->bitrate = length; -} - -void ASF::Properties::setSampleRate(int length) -{ - d->sampleRate = length; -} - -void ASF::Properties::setChannels(int length) -{ - d->channels = length; -} - -void ASF::Properties::setEncrypted(bool encrypted) -{ - d->encrypted = encrypted; -} - diff --git a/src/taglib/taglib/asf/asfproperties.h b/src/taglib/taglib/asf/asfproperties.h deleted file mode 100644 index 95730d8..0000000 --- a/src/taglib/taglib/asf/asfproperties.h +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFPROPERTIES_H -#define TAGLIB_ASFPROPERTIES_H - -#include "audioproperties.h" -#include "tstring.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ASF { - - //! An implementation of ASF audio properties - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - - /*! - * Create an instance of ASF::Properties. - */ - Properties(); - - /*! - * Destroys this ASF::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - bool isEncrypted() const; - -#ifndef DO_NOT_DOCUMENT - void setLength(int value); - void setBitrate(int value); - void setSampleRate(int value); - void setChannels(int value); - void setEncrypted(bool value); -#endif - - private: - class PropertiesPrivate; - PropertiesPrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/asf/asftag.cpp b/src/taglib/taglib/asf/asftag.cpp deleted file mode 100644 index c07abe9..0000000 --- a/src/taglib/taglib/asf/asftag.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tpropertymap.h> -#include "asftag.h" - -using namespace TagLib; - -class ASF::Tag::TagPrivate -{ -public: - String title; - String artist; - String copyright; - String comment; - String rating; - AttributeListMap attributeListMap; -}; - -ASF::Tag::Tag() -: TagLib::Tag() -{ - d = new TagPrivate; -} - -ASF::Tag::~Tag() -{ - if(d) - delete d; -} - -String ASF::Tag::title() const -{ - return d->title; -} - -String ASF::Tag::artist() const -{ - return d->artist; -} - -String ASF::Tag::album() const -{ - if(d->attributeListMap.contains("WM/AlbumTitle")) - return d->attributeListMap["WM/AlbumTitle"][0].toString(); - return String::null; -} - -String ASF::Tag::copyright() const -{ - return d->copyright; -} - -String ASF::Tag::comment() const -{ - return d->comment; -} - -String ASF::Tag::rating() const -{ - return d->rating; -} - -unsigned int ASF::Tag::year() const -{ - if(d->attributeListMap.contains("WM/Year")) - return d->attributeListMap["WM/Year"][0].toString().toInt(); - return 0; -} - -unsigned int ASF::Tag::track() const -{ - if(d->attributeListMap.contains("WM/TrackNumber")) { - const ASF::Attribute attr = d->attributeListMap["WM/TrackNumber"][0]; - if(attr.type() == ASF::Attribute::DWordType) - return attr.toUInt(); - else - return attr.toString().toInt(); - } - if(d->attributeListMap.contains("WM/Track")) - return d->attributeListMap["WM/Track"][0].toUInt(); - return 0; -} - -String ASF::Tag::genre() const -{ - if(d->attributeListMap.contains("WM/Genre")) - return d->attributeListMap["WM/Genre"][0].toString(); - return String::null; -} - -void ASF::Tag::setTitle(const String &value) -{ - d->title = value; -} - -void ASF::Tag::setArtist(const String &value) -{ - d->artist = value; -} - -void ASF::Tag::setCopyright(const String &value) -{ - d->copyright = value; -} - -void ASF::Tag::setComment(const String &value) -{ - d->comment = value; -} - -void ASF::Tag::setRating(const String &value) -{ - d->rating = value; -} - -void ASF::Tag::setAlbum(const String &value) -{ - setAttribute("WM/AlbumTitle", value); -} - -void ASF::Tag::setGenre(const String &value) -{ - setAttribute("WM/Genre", value); -} - -void ASF::Tag::setYear(uint value) -{ - setAttribute("WM/Year", String::number(value)); -} - -void ASF::Tag::setTrack(uint value) -{ - setAttribute("WM/TrackNumber", String::number(value)); -} - -ASF::AttributeListMap& ASF::Tag::attributeListMap() -{ - return d->attributeListMap; -} - -void ASF::Tag::removeItem(const String &key) -{ - AttributeListMap::Iterator it = d->attributeListMap.find(key); - if(it != d->attributeListMap.end()) - d->attributeListMap.erase(it); -} - -void ASF::Tag::setAttribute(const String &name, const Attribute &attribute) -{ - AttributeList value; - value.append(attribute); - d->attributeListMap.insert(name, value); -} - -void ASF::Tag::addAttribute(const String &name, const Attribute &attribute) -{ - if(d->attributeListMap.contains(name)) { - d->attributeListMap[name].append(attribute); - } - else { - setAttribute(name, attribute); - } -} - -bool ASF::Tag::isEmpty() const -{ - return TagLib::Tag::isEmpty() && - copyright().isEmpty() && - rating().isEmpty() && - d->attributeListMap.isEmpty(); -} - -static const char *keyTranslation[][2] = { - { "WM/AlbumTitle", "ALBUM" }, - { "WM/Composer", "COMPOSER" }, - { "WM/Writer", "WRITER" }, - { "WM/Conductor", "CONDUCTOR" }, - { "WM/ModifiedBy", "REMIXER" }, - { "WM/Year", "DATE" }, - { "WM/OriginalReleaseYear", "ORIGINALDATE" }, - { "WM/Producer", "PRODUCER" }, - { "WM/ContentGroupDescription", "GROUPING" }, - { "WM/SubTitle", "SUBTITLE" }, - { "WM/SetSubTitle", "DISCSUBTITLE" }, - { "WM/TrackNumber", "TRACKNUMBER" }, - { "WM/PartOfSet", "DISCNUMBER" }, - { "WM/Genre", "GENRE" }, - { "WM/BeatsPerMinute", "BPM" }, - { "WM/Mood", "MOOD" }, - { "WM/ISRC", "ISRC" }, - { "WM/Lyrics", "LYRICS" }, - { "WM/Media", "MEDIA" }, - { "WM/Publisher", "LABEL" }, - { "WM/CatalogNo", "CATALOGNUMBER" }, - { "WM/Barcode", "BARCODE" }, - { "WM/EncodedBy", "ENCODEDBY" }, - { "WM/AlbumSortOrder", "ALBUMSORT" }, - { "WM/AlbumArtistSortOrder", "ALBUMARTISTSORT" }, - { "WM/ArtistSortOrder", "ARTISTSORT" }, - { "WM/TitleSortOrder", "TITLESORT" }, - { "WM/Script", "SCRIPT" }, - { "WM/Language", "LANGUAGE" }, - { "MusicBrainz/Track Id", "MUSICBRAINZ_TRACKID" }, - { "MusicBrainz/Artist Id", "MUSICBRAINZ_ARTISTID" }, - { "MusicBrainz/Album Id", "MUSICBRAINZ_ALBUMID" }, - { "MusicBrainz/Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID" }, - { "MusicBrainz/Release Group Id", "MUSICBRAINZ_RELEASEGROUPID" }, - { "MusicBrainz/Work Id", "MUSICBRAINZ_WORKID" }, - { "MusicIP/PUID", "MUSICIP_PUID" }, - { "Acoustid/Id", "ACOUSTID_ID" }, - { "Acoustid/Fingerprint", "ACOUSTID_FINGERPRINT" }, -}; - -PropertyMap ASF::Tag::properties() const -{ - static Map<String, String> keyMap; - if(keyMap.isEmpty()) { - int numKeys = sizeof(keyTranslation) / sizeof(keyTranslation[0]); - for(int i = 0; i < numKeys; i++) { - keyMap[keyTranslation[i][0]] = keyTranslation[i][1]; - } - } - - PropertyMap props; - - if(!d->title.isEmpty()) { - props["TITLE"] = d->title; - } - if(!d->artist.isEmpty()) { - props["ARTIST"] = d->artist; - } - if(!d->copyright.isEmpty()) { - props["COPYRIGHT"] = d->copyright; - } - if(!d->comment.isEmpty()) { - props["COMMENT"] = d->comment; - } - - ASF::AttributeListMap::ConstIterator it = d->attributeListMap.begin(); - for(; it != d->attributeListMap.end(); ++it) { - if(keyMap.contains(it->first)) { - String key = keyMap[it->first]; - AttributeList::ConstIterator it2 = it->second.begin(); - for(; it2 != it->second.end(); ++it2) { - if(key == "TRACKNUMBER") { - if(it2->type() == ASF::Attribute::DWordType) - props.insert(key, String::number(it2->toUInt())); - else - props.insert(key, it2->toString()); - } - else { - props.insert(key, it2->toString()); - } - } - } - else { - props.unsupportedData().append(it->first); - } - } - return props; -} - -void ASF::Tag::removeUnsupportedProperties(const StringList &props) -{ - StringList::ConstIterator it = props.begin(); - for(; it != props.end(); ++it) - d->attributeListMap.erase(*it); -} - -PropertyMap ASF::Tag::setProperties(const PropertyMap &props) -{ - static Map<String, String> reverseKeyMap; - if(reverseKeyMap.isEmpty()) { - int numKeys = sizeof(keyTranslation) / sizeof(keyTranslation[0]); - for(int i = 0; i < numKeys; i++) { - reverseKeyMap[keyTranslation[i][1]] = keyTranslation[i][0]; - } - } - - PropertyMap origProps = properties(); - PropertyMap::ConstIterator it = origProps.begin(); - for(; it != origProps.end(); ++it) { - if(!props.contains(it->first) || props[it->first].isEmpty()) { - if(it->first == "TITLE") { - d->title = String::null; - } - else if(it->first == "ARTIST") { - d->artist = String::null; - } - else if(it->first == "COMMENT") { - d->comment = String::null; - } - else if(it->first == "COPYRIGHT") { - d->copyright = String::null; - } - else { - d->attributeListMap.erase(reverseKeyMap[it->first]); - } - } - } - - PropertyMap ignoredProps; - it = props.begin(); - for(; it != props.end(); ++it) { - if(reverseKeyMap.contains(it->first)) { - String name = reverseKeyMap[it->first]; - removeItem(name); - StringList::ConstIterator it2 = it->second.begin(); - for(; it2 != it->second.end(); ++it2) { - addAttribute(name, *it2); - } - } - else if(it->first == "TITLE") { - d->title = it->second.toString(); - } - else if(it->first == "ARTIST") { - d->artist = it->second.toString(); - } - else if(it->first == "COMMENT") { - d->comment = it->second.toString(); - } - else if(it->first == "COPYRIGHT") { - d->copyright = it->second.toString(); - } - else { - ignoredProps.insert(it->first, it->second); - } - } - - return ignoredProps; -} diff --git a/src/taglib/taglib/asf/asftag.h b/src/taglib/taglib/asf/asftag.h deleted file mode 100644 index f68579d..0000000 --- a/src/taglib/taglib/asf/asftag.h +++ /dev/null @@ -1,190 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFTAG_H -#define TAGLIB_ASFTAG_H - -#include "tag.h" -#include "tlist.h" -#include "tmap.h" -#include "taglib_export.h" -#include "asfattribute.h" - -namespace TagLib { - - namespace ASF { - - typedef List<Attribute> AttributeList; - typedef Map<String, AttributeList> AttributeListMap; - - class TAGLIB_EXPORT Tag : public TagLib::Tag { - - friend class File; - - public: - - Tag(); - - virtual ~Tag(); - - /*! - * Returns the track name. - */ - virtual String title() const; - - /*! - * Returns the artist name. - */ - virtual String artist() const; - - /*! - * Returns the album name; if no album name is present in the tag - * String::null will be returned. - */ - virtual String album() const; - - /*! - * Returns the track comment. - */ - virtual String comment() const; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String genre() const; - - /*! - * Returns the rating. - */ - virtual String rating() const; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String copyright() const; - - /*! - * Returns the year; if there is no year set, this will return 0. - */ - virtual uint year() const; - - /*! - * Returns the track number; if there is no track number set, this will - * return 0. - */ - virtual uint track() const; - - /*! - * Sets the title to \a s. - */ - virtual void setTitle(const String &s); - - /*! - * Sets the artist to \a s. - */ - virtual void setArtist(const String &s); - - /*! - * Sets the album to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setAlbum(const String &s); - - /*! - * Sets the comment to \a s. - */ - virtual void setComment(const String &s); - - /*! - * Sets the rating to \a s. - */ - virtual void setRating(const String &s); - - /*! - * Sets the copyright to \a s. - */ - virtual void setCopyright(const String &s); - - /*! - * Sets the genre to \a s. - */ - virtual void setGenre(const String &s); - - /*! - * Sets the year to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setYear(uint i); - - /*! - * Sets the track to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setTrack(uint i); - - /*! - * Returns true if the tag does not contain any data. This should be - * reimplemented in subclasses that provide more than the basic tagging - * abilities in this class. - */ - virtual bool isEmpty() const; - - /*! - * Returns a reference to the item list map. This is an AttributeListMap of - * all of the items in the tag. - * - * This is the most powerfull structure for accessing the items of the tag. - */ - AttributeListMap &attributeListMap(); - - /*! - * Removes the \a key attribute from the tag - */ - void removeItem(const String &name); - - /*! - * Sets the \a key attribute to the value of \a attribute. If an attribute - * with the \a key is already present, it will be replaced. - */ - void setAttribute(const String &name, const Attribute &attribute); - - /*! - * Sets the \a key attribute to the value of \a attribute. If an attribute - * with the \a key is already present, it will be added to the list. - */ - void addAttribute(const String &name, const Attribute &attribute); - - PropertyMap properties() const; - void removeUnsupportedProperties(const StringList& properties); - PropertyMap setProperties(const PropertyMap &properties); - - private: - - class TagPrivate; - TagPrivate *d; - }; - } -} -#endif diff --git a/src/taglib/taglib/audioproperties.cpp b/src/taglib/taglib/audioproperties.cpp deleted file mode 100644 index 298b97d..0000000 --- a/src/taglib/taglib/audioproperties.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "audioproperties.h" - -using namespace TagLib; - -class AudioProperties::AudioPropertiesPrivate -{ - -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -AudioProperties::~AudioProperties() -{ - -} - -//////////////////////////////////////////////////////////////////////////////// -// protected methods -//////////////////////////////////////////////////////////////////////////////// - -AudioProperties::AudioProperties(ReadStyle) -{ - -} diff --git a/src/taglib/taglib/audioproperties.h b/src/taglib/taglib/audioproperties.h deleted file mode 100644 index e9844fa..0000000 --- a/src/taglib/taglib/audioproperties.h +++ /dev/null @@ -1,110 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_AUDIOPROPERTIES_H -#define TAGLIB_AUDIOPROPERTIES_H - -#include "taglib_export.h" - -namespace TagLib { - - //! A simple, abstract interface to common audio properties - - /*! - * The values here are common to most audio formats. For more specific, codec - * dependant values, please see see the subclasses APIs. This is meant to - * compliment the TagLib::File and TagLib::Tag APIs in providing a simple - * interface that is sufficient for most applications. - */ - - class TAGLIB_EXPORT AudioProperties - { - public: - - /*! - * Reading audio properties from a file can sometimes be very time consuming - * and for the most accurate results can often involve reading the entire - * file. Because in many situations speed is critical or the accuracy of the - * values is not particularly important this allows the level of desired - * accuracy to be set. - */ - enum ReadStyle { - //! Read as little of the file as possible - Fast, - //! Read more of the file and make better values guesses - Average, - //! Read as much of the file as needed to report accurate values - Accurate - }; - - /*! - * Destroys this AudioProperties instance. - */ - virtual ~AudioProperties(); - - /*! - * Returns the length of the file in seconds. - */ - virtual int length() const = 0; - - /*! - * Returns the most appropriate bit rate for the file in kb/s. For constant - * bitrate formats this is simply the bitrate of the file. For variable - * bitrate formats this is either the average or nominal bitrate. - */ - virtual int bitrate() const = 0; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const = 0; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const = 0; - - protected: - - /*! - * Construct an audio properties instance. This is protected as this class - * should not be instantiated directly, but should be instantiated via its - * subclasses and can be fetched from the FileRef or File APIs. - * - * \see ReadStyle - */ - AudioProperties(ReadStyle style); - - private: - AudioProperties(const AudioProperties &); - AudioProperties &operator=(const AudioProperties &); - - class AudioPropertiesPrivate; - AudioPropertiesPrivate *d; - }; - -} - -#endif diff --git a/src/taglib/taglib/fileref.cpp b/src/taglib/taglib/fileref.cpp deleted file mode 100644 index 4403a5f..0000000 --- a/src/taglib/taglib/fileref.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - (added APE file support) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tfile.h> -#include <tstring.h> -#include <tdebug.h> -#include "trefcounter.h" - -#include "fileref.h" -#include "asffile.h" -#include "mpegfile.h" -#include "vorbisfile.h" -#include "flacfile.h" -#include "oggflacfile.h" -#include "mpcfile.h" -#include "mp4file.h" -#include "wavpackfile.h" -#include "speexfile.h" -#include "opusfile.h" -#include "trueaudiofile.h" -#include "aifffile.h" -#include "wavfile.h" -#include "apefile.h" -#include "modfile.h" -#include "s3mfile.h" -#include "itfile.h" -#include "xmfile.h" - -using namespace TagLib; - -class FileRef::FileRefPrivate : public RefCounter -{ -public: - FileRefPrivate(File *f) : RefCounter(), file(f) {} - ~FileRefPrivate() { - delete file; - } - - File *file; - static List<const FileTypeResolver *> fileTypeResolvers; -}; - -List<const FileRef::FileTypeResolver *> FileRef::FileRefPrivate::fileTypeResolvers; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FileRef::FileRef() -{ - d = new FileRefPrivate(0); -} - -FileRef::FileRef(FileName fileName, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) -{ - d = new FileRefPrivate(create(fileName, readAudioProperties, audioPropertiesStyle)); -} - -FileRef::FileRef(File *file) -{ - d = new FileRefPrivate(file); -} - -FileRef::FileRef(const FileRef &ref) : d(ref.d) -{ - d->ref(); -} - -FileRef::~FileRef() -{ - if(d->deref()) - delete d; -} - -Tag *FileRef::tag() const -{ - if(isNull()) { - debug("FileRef::tag() - Called without a valid file."); - return 0; - } - return d->file->tag(); -} - -AudioProperties *FileRef::audioProperties() const -{ - if(isNull()) { - debug("FileRef::audioProperties() - Called without a valid file."); - return 0; - } - return d->file->audioProperties(); -} - -File *FileRef::file() const -{ - return d->file; -} - -bool FileRef::save() -{ - if(isNull()) { - debug("FileRef::save() - Called without a valid file."); - return false; - } - return d->file->save(); -} - -const FileRef::FileTypeResolver *FileRef::addFileTypeResolver(const FileRef::FileTypeResolver *resolver) // static -{ - FileRefPrivate::fileTypeResolvers.prepend(resolver); - return resolver; -} - -StringList FileRef::defaultFileExtensions() -{ - StringList l; - - l.append("ogg"); - l.append("flac"); - l.append("oga"); - l.append("mp3"); - l.append("mpc"); - l.append("wv"); - l.append("spx"); - l.append("tta"); - l.append("m4a"); - l.append("m4r"); - l.append("m4b"); - l.append("m4p"); - l.append("3g2"); - l.append("mp4"); - l.append("wma"); - l.append("asf"); - l.append("aif"); - l.append("aiff"); - l.append("wav"); - l.append("ape"); - l.append("mod"); - l.append("module"); // alias for "mod" - l.append("nst"); // alias for "mod" - l.append("wow"); // alias for "mod" - l.append("s3m"); - l.append("it"); - l.append("xm"); - - return l; -} - -bool FileRef::isNull() const -{ - return !d->file || !d->file->isValid(); -} - -FileRef &FileRef::operator=(const FileRef &ref) -{ - if(&ref == this) - return *this; - - if(d->deref()) - delete d; - - d = ref.d; - d->ref(); - - return *this; -} - -bool FileRef::operator==(const FileRef &ref) const -{ - return ref.d->file == d->file; -} - -bool FileRef::operator!=(const FileRef &ref) const -{ - return ref.d->file != d->file; -} - -File *FileRef::create(FileName fileName, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) // static -{ - - List<const FileTypeResolver *>::ConstIterator it = FileRefPrivate::fileTypeResolvers.begin(); - - for(; it != FileRefPrivate::fileTypeResolvers.end(); ++it) { - File *file = (*it)->createFile(fileName, readAudioProperties, audioPropertiesStyle); - if(file) - return file; - } - - // Ok, this is really dumb for now, but it works for testing. - - String ext; - { -#ifdef _WIN32 - - String s = fileName.toString(); - -#else - - String s = fileName; - - #endif - - const int pos = s.rfind("."); - if(pos != -1) - ext = s.substr(pos + 1).upper(); - } - - // If this list is updated, the method defaultFileExtensions() should also be - // updated. However at some point that list should be created at the same time - // that a default file type resolver is created. - - if(!ext.isEmpty()) { - if(ext == "MP3") - return new MPEG::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "OGG") - return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "OGA") { - /* .oga can be any audio in the Ogg container. First try FLAC, then Vorbis. */ - File *file = new Ogg::FLAC::File(fileName, readAudioProperties, audioPropertiesStyle); - if (file->isValid()) - return file; - delete file; - return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle); - } - if(ext == "FLAC") - return new FLAC::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "MPC") - return new MPC::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "WV") - return new WavPack::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "SPX") - return new Ogg::Speex::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "OPUS") - return new Ogg::Opus::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "TTA") - return new TrueAudio::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "M4A" || ext == "M4R" || ext == "M4B" || ext == "M4P" || ext == "MP4" || ext == "3G2") - return new MP4::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "WMA" || ext == "ASF") - return new ASF::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "AIF" || ext == "AIFF") - return new RIFF::AIFF::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "WAV") - return new RIFF::WAV::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "APE") - return new APE::File(fileName, readAudioProperties, audioPropertiesStyle); - // module, nst and wow are possible but uncommon extensions - if(ext == "MOD" || ext == "MODULE" || ext == "NST" || ext == "WOW") - return new Mod::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "S3M") - return new S3M::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "IT") - return new IT::File(fileName, readAudioProperties, audioPropertiesStyle); - if(ext == "XM") - return new XM::File(fileName, readAudioProperties, audioPropertiesStyle); - } - - return 0; -} diff --git a/src/taglib/taglib/fileref.h b/src/taglib/taglib/fileref.h deleted file mode 100644 index 0f0c21a..0000000 --- a/src/taglib/taglib/fileref.h +++ /dev/null @@ -1,263 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FILEREF_H -#define TAGLIB_FILEREF_H - -#include "tfile.h" -#include "tstringlist.h" - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - class Tag; - - //! This class provides a simple abstraction for creating and handling files - - /*! - * FileRef exists to provide a minimal, generic and value-based wrapper around - * a File. It is lightweight and implicitly shared, and as such suitable for - * pass-by-value use. This hides some of the uglier details of TagLib::File - * and the non-generic portions of the concrete file implementations. - * - * This class is useful in a "simple usage" situation where it is desirable - * to be able to get and set some of the tag information that is similar - * across file types. - * - * Also note that it is probably a good idea to plug this into your mime - * type system rather than using the constructor that accepts a file name using - * the FileTypeResolver. - * - * \see FileTypeResolver - * \see addFileTypeResolver() - */ - - class TAGLIB_EXPORT FileRef - { - public: - - //! A class for pluggable file type resolution. - - /*! - * This class is used to add extend TagLib's very basic file name based file - * type resolution. - * - * This can be accomplished with: - * - * \code - * - * class MyFileTypeResolver : FileTypeResolver - * { - * TagLib::File *createFile(TagLib::FileName *fileName, bool, AudioProperties::ReadStyle) - * { - * if(someCheckForAnMP3File(fileName)) - * return new TagLib::MPEG::File(fileName); - * return 0; - * } - * } - * - * FileRef::addFileTypeResolver(new MyFileTypeResolver); - * - * \endcode - * - * Naturally a less contrived example would be slightly more complex. This - * can be used to plug in mime-type detection systems or to add new file types - * to TagLib. - */ - - class TAGLIB_EXPORT FileTypeResolver - { - TAGLIB_IGNORE_MISSING_DESTRUCTOR - public: - /*! - * This method must be overridden to provide an additional file type - * resolver. If the resolver is able to determine the file type it should - * return a valid File object; if not it should return 0. - * - * \note The created file is then owned by the FileRef and should not be - * deleted. Deletion will happen automatically when the FileRef passes - * out of scope. - */ - virtual File *createFile(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle - audioPropertiesStyle = AudioProperties::Average) const = 0; - }; - - /*! - * Creates a null FileRef. - */ - FileRef(); - - /*! - * Create a FileRef from \a fileName. If \a readAudioProperties is true then - * the audio properties will be read using \a audioPropertiesStyle. If - * \a readAudioProperties is false then \a audioPropertiesStyle will be - * ignored. - * - * Also see the note in the class documentation about why you may not want to - * use this method in your application. - */ - explicit FileRef(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle - audioPropertiesStyle = AudioProperties::Average); - - /*! - * Contruct a FileRef using \a file. The FileRef now takes ownership of the - * pointer and will delete the File when it passes out of scope. - */ - explicit FileRef(File *file); - - /*! - * Make a copy of \a ref. - */ - FileRef(const FileRef &ref); - - /*! - * Destroys this FileRef instance. - */ - virtual ~FileRef(); - - /*! - * Returns a pointer to represented file's tag. - * - * \warning This pointer will become invalid when this FileRef and all - * copies pass out of scope. - * - * \warning Do not cast it to any subclasses of \class Tag. - * Use tag returning methods of appropriate subclasses of \class File instead. - * - * \see File::tag() - */ - Tag *tag() const; - - /*! - * Returns the audio properties for this FileRef. If no audio properties - * were read then this will returns a null pointer. - */ - AudioProperties *audioProperties() const; - - /*! - * Returns a pointer to the file represented by this handler class. - * - * As a general rule this call should be avoided since if you need to work - * with file objects directly, you are probably better served instantiating - * the File subclasses (i.e. MPEG::File) manually and working with their APIs. - * - * This <i>handle</i> exists to provide a minimal, generic and value-based - * wrapper around a File. Accessing the file directly generally indicates - * a moving away from this simplicity (and into things beyond the scope of - * FileRef). - * - * \warning This pointer will become invalid when this FileRef and all - * copies pass out of scope. - */ - File *file() const; - - /*! - * Saves the file. Returns true on success. - */ - bool save(); - - /*! - * Adds a FileTypeResolver to the list of those used by TagLib. Each - * additional FileTypeResolver is added to the front of a list of resolvers - * that are tried. If the FileTypeResolver returns zero the next resolver - * is tried. - * - * Returns a pointer to the added resolver (the same one that's passed in -- - * this is mostly so that static inialializers have something to use for - * assignment). - * - * \see FileTypeResolver - */ - static const FileTypeResolver *addFileTypeResolver(const FileTypeResolver *resolver); - - /*! - * As is mentioned elsewhere in this class's documentation, the default file - * type resolution code provided by TagLib only works by comparing file - * extensions. - * - * This method returns the list of file extensions that are used by default. - * - * The extensions are all returned in lowercase, though the comparison used - * by TagLib for resolution is case-insensitive. - * - * \note This does not account for any additional file type resolvers that - * are plugged in. Also note that this is not intended to replace a propper - * mime-type resolution system, but is just here for reference. - * - * \see FileTypeResolver - */ - static StringList defaultFileExtensions(); - - /*! - * Returns true if the file (and as such other pointers) are null. - */ - bool isNull() const; - - /*! - * Assign the file pointed to by \a ref to this FileRef. - */ - FileRef &operator=(const FileRef &ref); - - /*! - * Returns true if this FileRef and \a ref point to the same File object. - */ - bool operator==(const FileRef &ref) const; - - /*! - * Returns true if this FileRef and \a ref do not point to the same File - * object. - */ - bool operator!=(const FileRef &ref) const; - - /*! - * A simple implementation of file type guessing. If \a readAudioProperties - * is true then the audio properties will be read using - * \a audioPropertiesStyle. If \a readAudioProperties is false then - * \a audioPropertiesStyle will be ignored. - * - * \note You generally shouldn't use this method, but instead the constructor - * directly. - * - * \deprecated - */ - static File *create(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle audioPropertiesStyle = AudioProperties::Average); - - - private: - class FileRefPrivate; - FileRefPrivate *d; - }; - -} // namespace TagLib - -#endif diff --git a/src/taglib/taglib/flac/flacfile.cpp b/src/taglib/taglib/flac/flacfile.cpp deleted file mode 100644 index 823170a..0000000 --- a/src/taglib/taglib/flac/flacfile.cpp +++ /dev/null @@ -1,568 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003-2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tlist.h> -#include <tdebug.h> -#include <tagunion.h> -#include <tpropertymap.h> - -#include <id3v2header.h> -#include <id3v2tag.h> -#include <id3v1tag.h> -#include <xiphcomment.h> - -#include "flacpicture.h" -#include "flacfile.h" -#include "flacmetadatablock.h" -#include "flacunknownmetadatablock.h" - -using namespace TagLib; - -namespace -{ - enum { FlacXiphIndex = 0, FlacID3v2Index = 1, FlacID3v1Index = 2 }; - enum { MinPaddingLength = 4096 }; - enum { LastBlockFlag = 0x80 }; -} - -class FLAC::File::FilePrivate -{ -public: - FilePrivate() : - ID3v2FrameFactory(ID3v2::FrameFactory::instance()), - ID3v2Location(-1), - ID3v2OriginalSize(0), - ID3v1Location(-1), - properties(0), - flacStart(0), - streamStart(0), - streamLength(0), - scanned(false), - hasXiphComment(false), - hasID3v2(false), - hasID3v1(false) - { - } - - ~FilePrivate() - { - uint size = blocks.size(); - for(uint i = 0; i < size; i++) { - delete blocks[i]; - } - delete properties; - } - - const ID3v2::FrameFactory *ID3v2FrameFactory; - long ID3v2Location; - uint ID3v2OriginalSize; - - long ID3v1Location; - - TagUnion tag; - - Properties *properties; - ByteVector streamInfoData; - ByteVector xiphCommentData; - List<MetadataBlock *> blocks; - - long flacStart; - long streamStart; - long streamLength; - bool scanned; - - bool hasXiphComment; - bool hasID3v2; - bool hasID3v1; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FLAC::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : - TagLib::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -FLAC::File::File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle propertiesStyle) : - TagLib::File(file) -{ - d = new FilePrivate; - d->ID3v2FrameFactory = frameFactory; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -FLAC::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle propertiesStyle) : - TagLib::File(stream) -{ - d = new FilePrivate; - d->ID3v2FrameFactory = frameFactory; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -FLAC::File::~File() -{ - delete d; -} - -TagLib::Tag *FLAC::File::tag() const -{ - return &d->tag; -} - -PropertyMap FLAC::File::properties() const -{ - // once Tag::properties() is virtual, this case distinction could actually be done - // within TagUnion. - if(d->hasXiphComment) - return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, false)->properties(); - if(d->hasID3v2) - return d->tag.access<ID3v2::Tag>(FlacID3v2Index, false)->properties(); - if(d->hasID3v1) - return d->tag.access<ID3v1::Tag>(FlacID3v1Index, false)->properties(); - return PropertyMap(); -} - -void FLAC::File::removeUnsupportedProperties(const StringList &unsupported) -{ - if(d->hasXiphComment) - d->tag.access<Ogg::XiphComment>(FlacXiphIndex, false)->removeUnsupportedProperties(unsupported); - if(d->hasID3v2) - d->tag.access<ID3v2::Tag>(FlacID3v2Index, false)->removeUnsupportedProperties(unsupported); - if(d->hasID3v1) - d->tag.access<ID3v1::Tag>(FlacID3v1Index, false)->removeUnsupportedProperties(unsupported); -} - -PropertyMap FLAC::File::setProperties(const PropertyMap &properties) -{ - return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, true)->setProperties(properties); -} - -FLAC::Properties *FLAC::File::audioProperties() const -{ - return d->properties; -} - - -bool FLAC::File::save() -{ - if(readOnly()) { - debug("FLAC::File::save() - Cannot save to a read only file."); - return false; - } - - if(!isValid()) { - debug("FLAC::File::save() -- Trying to save invalid file."); - return false; - } - - // Create new vorbis comments - - Tag::duplicate(&d->tag, xiphComment(true), false); - - d->xiphCommentData = xiphComment()->render(false); - - // Replace metadata blocks - - bool foundVorbisCommentBlock = false; - List<MetadataBlock *> newBlocks; - for(uint i = 0; i < d->blocks.size(); i++) { - MetadataBlock *block = d->blocks[i]; - if(block->code() == MetadataBlock::VorbisComment) { - // Set the new Vorbis Comment block - delete block; - block = new UnknownMetadataBlock(MetadataBlock::VorbisComment, d->xiphCommentData); - foundVorbisCommentBlock = true; - } - if(block->code() == MetadataBlock::Padding) { - delete block; - continue; - } - newBlocks.append(block); - } - if(!foundVorbisCommentBlock) { - newBlocks.append(new UnknownMetadataBlock(MetadataBlock::VorbisComment, d->xiphCommentData)); - foundVorbisCommentBlock = true; - } - d->blocks = newBlocks; - - // Render data for the metadata blocks - - ByteVector data; - for(uint i = 0; i < newBlocks.size(); i++) { - FLAC::MetadataBlock *block = newBlocks[i]; - ByteVector blockData = block->render(); - ByteVector blockHeader = ByteVector::fromUInt(blockData.size()); - blockHeader[0] = block->code(); - data.append(blockHeader); - data.append(blockData); - } - - // Adjust the padding block(s) - - long originalLength = d->streamStart - d->flacStart; - int paddingLength = originalLength - data.size() - 4; - if (paddingLength < 0) { - paddingLength = MinPaddingLength; - } - ByteVector padding = ByteVector::fromUInt(paddingLength); - padding.resize(paddingLength + 4); - padding[0] = (char)(FLAC::MetadataBlock::Padding | LastBlockFlag); - data.append(padding); - - // Write the data to the file - - insert(data, d->flacStart, originalLength); - d->hasXiphComment = true; - - // Update ID3 tags - - if(ID3v2Tag()) { - if(d->hasID3v2) { - if(d->ID3v2Location < d->flacStart) - debug("FLAC::File::save() -- This can't be right -- an ID3v2 tag after the " - "start of the FLAC bytestream? Not writing the ID3v2 tag."); - else - insert(ID3v2Tag()->render(), d->ID3v2Location, d->ID3v2OriginalSize); - } - else - insert(ID3v2Tag()->render(), 0, 0); - } - - if(ID3v1Tag()) { - seek(-128, End); - writeBlock(ID3v1Tag()->render()); - } - - return true; -} - -ID3v2::Tag *FLAC::File::ID3v2Tag(bool create) -{ - if(!create || d->tag[FlacID3v2Index]) - return static_cast<ID3v2::Tag *>(d->tag[FlacID3v2Index]); - - d->tag.set(FlacID3v2Index, new ID3v2::Tag); - return static_cast<ID3v2::Tag *>(d->tag[FlacID3v2Index]); -} - -ID3v1::Tag *FLAC::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(FlacID3v1Index, create); -} - -Ogg::XiphComment *FLAC::File::xiphComment(bool create) -{ - return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, create); -} - -void FLAC::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) -{ - d->ID3v2FrameFactory = factory; -} - - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void FLAC::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - // Look for an ID3v2 tag - - d->ID3v2Location = findID3v2(); - - if(d->ID3v2Location >= 0) { - - d->tag.set(FlacID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); - - d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); - - if(ID3v2Tag()->header()->tagSize() <= 0) - d->tag.set(FlacID3v2Index, 0); - else - d->hasID3v2 = true; - } - - // Look for an ID3v1 tag - - d->ID3v1Location = findID3v1(); - - if(d->ID3v1Location >= 0) { - d->tag.set(FlacID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - d->hasID3v1 = true; - } - - // Look for FLAC metadata, including vorbis comments - - scan(); - - if(!isValid()) - return; - - if(d->hasXiphComment) - d->tag.set(FlacXiphIndex, new Ogg::XiphComment(xiphCommentData())); - else - d->tag.set(FlacXiphIndex, new Ogg::XiphComment); - - if(readProperties) - d->properties = new Properties(streamInfoData(), streamLength(), propertiesStyle); -} - -ByteVector FLAC::File::streamInfoData() -{ - return isValid() ? d->streamInfoData : ByteVector(); -} - -ByteVector FLAC::File::xiphCommentData() const -{ - return (isValid() && d->hasXiphComment) ? d->xiphCommentData : ByteVector(); -} - -long FLAC::File::streamLength() -{ - return d->streamLength; -} - -void FLAC::File::scan() -{ - // Scan the metadata pages - - if(d->scanned) - return; - - if(!isValid()) - return; - - long nextBlockOffset; - - if(d->hasID3v2) - nextBlockOffset = find("fLaC", d->ID3v2Location + d->ID3v2OriginalSize); - else - nextBlockOffset = find("fLaC"); - - if(nextBlockOffset < 0) { - debug("FLAC::File::scan() -- FLAC stream not found"); - setValid(false); - return; - } - - nextBlockOffset += 4; - d->flacStart = nextBlockOffset; - - seek(nextBlockOffset); - - ByteVector header = readBlock(4); - - // Header format (from spec): - // <1> Last-metadata-block flag - // <7> BLOCK_TYPE - // 0 : STREAMINFO - // 1 : PADDING - // .. - // 4 : VORBIS_COMMENT - // .. - // <24> Length of metadata to follow - - char blockType = header[0] & 0x7f; - bool isLastBlock = (header[0] & 0x80) != 0; - uint length = header.toUInt(1U, 3U); - - // First block should be the stream_info metadata - - if(blockType != MetadataBlock::StreamInfo) { - debug("FLAC::File::scan() -- invalid FLAC stream"); - setValid(false); - return; - } - - d->streamInfoData = readBlock(length); - d->blocks.append(new UnknownMetadataBlock(blockType, d->streamInfoData)); - nextBlockOffset += length + 4; - - // Search through the remaining metadata - while(!isLastBlock) { - - header = readBlock(4); - blockType = header[0] & 0x7f; - isLastBlock = (header[0] & 0x80) != 0; - length = header.toUInt(1U, 3U); - - ByteVector data = readBlock(length); - if(data.size() != length || length == 0) { - debug("FLAC::File::scan() -- FLAC stream corrupted"); - setValid(false); - return; - } - - MetadataBlock *block = 0; - - // Found the vorbis-comment - if(blockType == MetadataBlock::VorbisComment) { - if(!d->hasXiphComment) { - d->xiphCommentData = data; - d->hasXiphComment = true; - } - else { - debug("FLAC::File::scan() -- multiple Vorbis Comment blocks found, using the first one"); - } - } - else if(blockType == MetadataBlock::Picture) { - FLAC::Picture *picture = new FLAC::Picture(); - if(picture->parse(data)) { - block = picture; - } - else { - debug("FLAC::File::scan() -- invalid picture found, discarting"); - delete picture; - } - } - - if(!block) { - block = new UnknownMetadataBlock(blockType, data); - } - if(block->code() != MetadataBlock::Padding) { - d->blocks.append(block); - } - else { - delete block; - } - - nextBlockOffset += length + 4; - - if(nextBlockOffset >= File::length()) { - debug("FLAC::File::scan() -- FLAC stream corrupted"); - setValid(false); - return; - } - seek(nextBlockOffset); - } - - // End of metadata, now comes the datastream - - d->streamStart = nextBlockOffset; - d->streamLength = File::length() - d->streamStart; - - if(d->hasID3v1) - d->streamLength -= 128; - - d->scanned = true; -} - -long FLAC::File::findID3v1() -{ - if(!isValid()) - return -1; - - seek(-128, End); - long p = tell(); - - if(readBlock(3) == ID3v1::Tag::fileIdentifier()) - return p; - - return -1; -} - -long FLAC::File::findID3v2() -{ - if(!isValid()) - return -1; - - seek(0); - - if(readBlock(3) == ID3v2::Header::fileIdentifier()) - return 0; - - return -1; -} - -List<FLAC::Picture *> FLAC::File::pictureList() -{ - List<Picture *> pictures; - for(uint i = 0; i < d->blocks.size(); i++) { - Picture *picture = dynamic_cast<Picture *>(d->blocks[i]); - if(picture) { - pictures.append(picture); - } - } - return pictures; -} - -void FLAC::File::addPicture(Picture *picture) -{ - d->blocks.append(picture); -} - -void FLAC::File::removePicture(Picture *picture, bool del) -{ - MetadataBlock *block = picture; - List<MetadataBlock *>::Iterator it = d->blocks.find(block); - if(it != d->blocks.end()) - d->blocks.erase(it); - - if(del) - delete picture; -} - -void FLAC::File::removePictures() -{ - List<MetadataBlock *> newBlocks; - for(uint i = 0; i < d->blocks.size(); i++) { - Picture *picture = dynamic_cast<Picture *>(d->blocks[i]); - if(picture) { - delete picture; - } - else { - newBlocks.append(d->blocks[i]); - } - } - d->blocks = newBlocks; -} - -bool FLAC::File::hasXiphComment() const -{ - return d->hasXiphComment; -} - -bool FLAC::File::hasID3v1Tag() const -{ - return d->hasID3v1; -} - -bool FLAC::File::hasID3v2Tag() const -{ - return d->hasID3v2; -} diff --git a/src/taglib/taglib/flac/flacfile.h b/src/taglib/taglib/flac/flacfile.h deleted file mode 100644 index 0963f4a..0000000 --- a/src/taglib/taglib/flac/flacfile.h +++ /dev/null @@ -1,305 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACFILE_H -#define TAGLIB_FLACFILE_H - -#include "taglib_export.h" -#include "tfile.h" -#include "tlist.h" -#include "tag.h" - -#include "flacpicture.h" -#include "flacproperties.h" - -namespace TagLib { - - class Tag; - namespace ID3v2 { class FrameFactory; class Tag; } - namespace ID3v1 { class Tag; } - namespace Ogg { class XiphComment; } - - //! An implementation of FLAC metadata - - /*! - * This is implementation of FLAC metadata for non-Ogg FLAC files. At some - * point when Ogg / FLAC is more common there will be a similar implementation - * under the Ogg hiearchy. - * - * This supports ID3v1, ID3v2 and Xiph style comments as well as reading stream - * properties from the file. - */ - - namespace FLAC { - - //! An implementation of TagLib::File with FLAC specific methods - - /*! - * This implements and provides an interface for FLAC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to FLAC files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * Constructs a FLAC file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an APE file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - // BIC: merge with the above constructor - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a FLAC file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - // BIC: merge with the above constructor - File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be a union of XiphComment, - * ID3v1 and ID3v2 tags. - * - * \see ID3v2Tag() - * \see ID3v1Tag() - * \see XiphComment() - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains more than one tag (e.g. XiphComment and ID3v1), - * only the first one (in the order XiphComment, ID3v2, ID3v1) will be - * converted to the PropertyMap. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &); - - /*! - * Implements the unified property interface -- import function. - * This always creates a Xiph comment, if none exists. The return value - * relates to the Xiph comment only. - * Ignores any changes to ID3v1 or ID3v2 comments since they are not allowed - * in the FLAC specification. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the FLAC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. This will primarily save the XiphComment, but - * will also keep any old ID3-tags up to date. If the file - * has no XiphComment, one will be constructed from the ID3-tags. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this returns a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v2 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file - * on disk actually has an ID3v2 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v2Tag() - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this returns a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the XiphComment for the file. - * - * If \a create is false (the default) this returns a null pointer - * if there is no valid XiphComment. If \a create is true it will create - * a XiphComment if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has a XiphComment. Use hasXiphComment() to check if the - * file on disk actually has a XiphComment. - * - * \note The Tag <b>is still</b> owned by the FLAC::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasXiphComment() - */ - Ogg::XiphComment *xiphComment(bool create = false); - - /*! - * Set the ID3v2::FrameFactory to something other than the default. This - * can be used to specify the way that ID3v2 frames will be interpreted - * when - * - * \see ID3v2FrameFactory - */ - void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Returns the block of data used by FLAC::Properties for parsing the - * stream properties. - * - * \deprecated This method will not be public in a future release. - */ - ByteVector streamInfoData(); // BIC: remove - - /*! - * Returns the length of the audio-stream, used by FLAC::Properties for - * calculating the bitrate. - * - * \deprecated This method will not be public in a future release. - */ - long streamLength(); // BIC: remove - - /*! - * Returns a list of pictures attached to the FLAC file. - */ - List<Picture *> pictureList(); - - /*! - * Removes an attached picture. If \a del is true the picture's memory - * will be freed; if it is false, it must be deleted by the user. - */ - void removePicture(Picture *picture, bool del = true); - - /*! - * Remove all attached images. - */ - void removePictures(); - - /*! - * Add a new picture to the file. The file takes ownership of the - * picture and will handle freeing its memory. - * - * \note The file will be saved only after calling save(). - */ - void addPicture(Picture *picture); - - /*! - * Returns whether or not the file on disk actually has a XiphComment. - * - * \see xiphComment() - */ - bool hasXiphComment() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findID3v2(); - long findID3v1(); - ByteVector xiphCommentData() const; - long findPaddingBreak(long nextPageOffset, long targetOffset, bool *isLast); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/flac/flacmetadatablock.cpp b/src/taglib/taglib/flac/flacmetadatablock.cpp deleted file mode 100644 index 17ab05f..0000000 --- a/src/taglib/taglib/flac/flacmetadatablock.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "flacmetadatablock.h" - -using namespace TagLib; - -class FLAC::MetadataBlock::MetadataBlockPrivate -{ -public: - MetadataBlockPrivate() {} - -}; - -FLAC::MetadataBlock::MetadataBlock() -{ - d = 0; -} - -FLAC::MetadataBlock::~MetadataBlock() -{ -} - diff --git a/src/taglib/taglib/flac/flacmetadatablock.h b/src/taglib/taglib/flac/flacmetadatablock.h deleted file mode 100644 index 41bca31..0000000 --- a/src/taglib/taglib/flac/flacmetadatablock.h +++ /dev/null @@ -1,75 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACMETADATABLOCK_H -#define TAGLIB_FLACMETADATABLOCK_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace FLAC { - - class TAGLIB_EXPORT MetadataBlock - { - public: - MetadataBlock(); - virtual ~MetadataBlock(); - - enum BlockType { - StreamInfo = 0, - Padding, - Application, - SeekTable, - VorbisComment, - CueSheet, - Picture - }; - - /*! - * Returns the FLAC metadata block type. - */ - virtual int code() const = 0; - - /*! - * Render the content of the block. - */ - virtual ByteVector render() const = 0; - - private: - MetadataBlock(const MetadataBlock &item); - MetadataBlock &operator=(const MetadataBlock &item); - - class MetadataBlockPrivate; - MetadataBlockPrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/flac/flacpicture.cpp b/src/taglib/taglib/flac/flacpicture.cpp deleted file mode 100644 index a2a9000..0000000 --- a/src/taglib/taglib/flac/flacpicture.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "flacpicture.h" - -using namespace TagLib; - -class FLAC::Picture::PicturePrivate -{ -public: - PicturePrivate() : - type(FLAC::Picture::Other), - width(0), - height(0), - colorDepth(0), - numColors(0) - {} - - Type type; - String mimeType; - String description; - int width; - int height; - int colorDepth; - int numColors; - ByteVector data; -}; - -FLAC::Picture::Picture() -{ - d = new PicturePrivate; -} - -FLAC::Picture::Picture(const ByteVector &data) -{ - d = new PicturePrivate; - parse(data); -} - -FLAC::Picture::~Picture() -{ - delete d; -} - -int FLAC::Picture::code() const -{ - return FLAC::MetadataBlock::Picture; -} - -bool FLAC::Picture::parse(const ByteVector &data) -{ - if(data.size() < 32) { - debug("A picture block must contain at least 5 bytes."); - return false; - } - - uint pos = 0; - d->type = FLAC::Picture::Type(data.toUInt(pos)); - pos += 4; - uint mimeTypeLength = data.toUInt(pos); - pos += 4; - if(pos + mimeTypeLength + 24 > data.size()) { - debug("Invalid picture block."); - return false; - } - d->mimeType = String(data.mid(pos, mimeTypeLength), String::UTF8); - pos += mimeTypeLength; - uint descriptionLength = data.toUInt(pos); - pos += 4; - if(pos + descriptionLength + 20 > data.size()) { - debug("Invalid picture block."); - return false; - } - d->description = String(data.mid(pos, descriptionLength), String::UTF8); - pos += descriptionLength; - d->width = data.toUInt(pos); - pos += 4; - d->height = data.toUInt(pos); - pos += 4; - d->colorDepth = data.toUInt(pos); - pos += 4; - d->numColors = data.toUInt(pos); - pos += 4; - uint dataLength = data.toUInt(pos); - pos += 4; - if(pos + dataLength > data.size()) { - debug("Invalid picture block."); - return false; - } - d->data = data.mid(pos, dataLength); - - return true; -} - -ByteVector FLAC::Picture::render() const -{ - ByteVector result; - result.append(ByteVector::fromUInt(d->type)); - ByteVector mimeTypeData = d->mimeType.data(String::UTF8); - result.append(ByteVector::fromUInt(mimeTypeData.size())); - result.append(mimeTypeData); - ByteVector descriptionData = d->description.data(String::UTF8); - result.append(ByteVector::fromUInt(descriptionData.size())); - result.append(descriptionData); - result.append(ByteVector::fromUInt(d->width)); - result.append(ByteVector::fromUInt(d->height)); - result.append(ByteVector::fromUInt(d->colorDepth)); - result.append(ByteVector::fromUInt(d->numColors)); - result.append(ByteVector::fromUInt(d->data.size())); - result.append(d->data); - return result; -} - -FLAC::Picture::Type FLAC::Picture::type() const -{ - return d->type; -} - -void FLAC::Picture::setType(FLAC::Picture::Type type) -{ - d->type = type; -} - -String FLAC::Picture::mimeType() const -{ - return d->mimeType; -} - -void FLAC::Picture::setMimeType(const String &mimeType) -{ - d->mimeType = mimeType; -} - -String FLAC::Picture::description() const -{ - return d->description; -} - -void FLAC::Picture::setDescription(const String &description) -{ - d->description = description; -} - -int FLAC::Picture::width() const -{ - return d->width; -} - -void FLAC::Picture::setWidth(int width) -{ - d->width = width; -} - -int FLAC::Picture::height() const -{ - return d->height; -} - -void FLAC::Picture::setHeight(int height) -{ - d->height = height; -} - -int FLAC::Picture::colorDepth() const -{ - return d->colorDepth; -} - -void FLAC::Picture::setColorDepth(int colorDepth) -{ - d->colorDepth = colorDepth; -} - -int FLAC::Picture::numColors() const -{ - return d->numColors; -} - -void FLAC::Picture::setNumColors(int numColors) -{ - d->numColors = numColors; -} - -ByteVector FLAC::Picture::data() const -{ - return d->data; -} - -void FLAC::Picture::setData(const ByteVector &data) -{ - d->data = data; -} - diff --git a/src/taglib/taglib/flac/flacpicture.h b/src/taglib/taglib/flac/flacpicture.h deleted file mode 100644 index b6def57..0000000 --- a/src/taglib/taglib/flac/flacpicture.h +++ /dev/null @@ -1,208 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACPICTURE_H -#define TAGLIB_FLACPICTURE_H - -#include "tlist.h" -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "flacmetadatablock.h" - -namespace TagLib { - - namespace FLAC { - - class TAGLIB_EXPORT Picture : public MetadataBlock - { - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - Picture(); - Picture(const ByteVector &data); - ~Picture(); - - /*! - * Returns the type of the image. - */ - Type type() const; - - /*! - * Sets the type of the image. - */ - void setType(Type type); - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - void setMimeType(const String &m); - - /*! - * Returns a text description of the image. - */ - - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - */ - - void setDescription(const String &desc); - - /*! - * Returns the width of the image. - */ - int width() const; - - /*! - * Sets the width of the image. - */ - void setWidth(int w); - - /*! - * Returns the height of the image. - */ - int height() const; - - /*! - * Sets the height of the image. - */ - void setHeight(int h); - - /*! - * Returns the color depth (in bits-per-pixel) of the image. - */ - int colorDepth() const; - - /*! - * Sets the color depth (in bits-per-pixel) of the image. - */ - void setColorDepth(int depth); - - /*! - * Returns the number of colors used on the image.. - */ - int numColors() const; - - /*! - * Sets the number of colors used on the image (for indexed images). - */ - void setNumColors(int numColors); - - /*! - * Returns the image data. - */ - ByteVector data() const; - - /*! - * Sets the image data. - */ - void setData(const ByteVector &data); - - /*! - * Returns the FLAC metadata block type. - */ - int code() const; - - /*! - * Render the content to the FLAC picture block format. - */ - ByteVector render() const; - - /*! - * Parse the picture data in the FLAC picture block format. - */ - bool parse(const ByteVector &rawData); - - private: - Picture(const Picture &item); - Picture &operator=(const Picture &item); - - class PicturePrivate; - PicturePrivate *d; - }; - - typedef List<Picture> PictureList; - - } - -} - -#endif diff --git a/src/taglib/taglib/flac/flacproperties.cpp b/src/taglib/taglib/flac/flacproperties.cpp deleted file mode 100644 index e591193..0000000 --- a/src/taglib/taglib/flac/flacproperties.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include "flacproperties.h" -#include "flacfile.h" - -using namespace TagLib; - -class FLAC::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(ByteVector d, long st, ReadStyle s) : - data(d), - streamLength(st), - style(s), - length(0), - bitrate(0), - sampleRate(0), - sampleWidth(0), - channels(0), - sampleFrames(0) {} - - ByteVector data; - long streamLength; - ReadStyle style; - int length; - int bitrate; - int sampleRate; - int sampleWidth; - int channels; - unsigned long long sampleFrames; - ByteVector signature; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FLAC::Properties::Properties(ByteVector data, long streamLength, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(data, streamLength, style); - read(); -} - -FLAC::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(file->streamInfoData(), file->streamLength(), style); - read(); -} - -FLAC::Properties::~Properties() -{ - delete d; -} - -int FLAC::Properties::length() const -{ - return d->length; -} - -int FLAC::Properties::bitrate() const -{ - return d->bitrate; -} - -int FLAC::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int FLAC::Properties::sampleWidth() const -{ - return d->sampleWidth; -} - -int FLAC::Properties::channels() const -{ - return d->channels; -} - -unsigned long long FLAC::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -ByteVector FLAC::Properties::signature() const -{ - return d->signature; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void FLAC::Properties::read() -{ - if(d->data.size() < 18) { - debug("FLAC::Properties::read() - FLAC properties must contain at least 18 bytes."); - return; - } - - uint pos = 0; - - // Minimum block size (in samples) - pos += 2; - - // Maximum block size (in samples) - pos += 2; - - // Minimum frame size (in bytes) - pos += 3; - - // Maximum frame size (in bytes) - pos += 3; - - uint flags = d->data.toUInt(pos, true); - pos += 4; - - d->sampleRate = flags >> 12; - d->channels = ((flags >> 9) & 7) + 1; - d->sampleWidth = ((flags >> 4) & 31) + 1; - - // The last 4 bits are the most significant 4 bits for the 36 bit - // stream length in samples. (Audio files measured in days) - - unsigned long long hi = flags & 0xf; - unsigned long long lo = d->data.toUInt(pos, true); - pos += 4; - - d->sampleFrames = (hi << 32) | lo; - - if(d->sampleRate > 0) - d->length = int(d->sampleFrames / d->sampleRate); - - // Uncompressed bitrate: - - //d->bitrate = ((d->sampleRate * d->channels) / 1000) * d->sampleWidth; - - // Real bitrate: - - d->bitrate = d->length > 0 ? ((d->streamLength * 8UL) / d->length) / 1000 : 0; - - d->signature = d->data.mid(pos, 32); -} diff --git a/src/taglib/taglib/flac/flacproperties.h b/src/taglib/taglib/flac/flacproperties.h deleted file mode 100644 index c145898..0000000 --- a/src/taglib/taglib/flac/flacproperties.h +++ /dev/null @@ -1,103 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACPROPERTIES_H -#define TAGLIB_FLACPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace FLAC { - - class File; - - //! An implementation of audio property reading for FLAC - - /*! - * This reads the data from an FLAC stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of FLAC::Properties with the data read from the - * ByteVector \a data. - */ - // BIC: switch to const reference - Properties(ByteVector data, long streamLength, ReadStyle style = Average); - - /*! - * Create an instance of FLAC::Properties with the data read from the - * FLAC::File \a file. - */ - // BIC: remove - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this FLAC::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns the sample width as read from the FLAC identification - * header. - */ - int sampleWidth() const; - - /*! - * Return the number of sample frames - */ - unsigned long long sampleFrames() const; - - /*! - * Returns the MD5 signature of the uncompressed audio stream as read - * from the stream info header header. - */ - ByteVector signature() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/flac/flacunknownmetadatablock.cpp b/src/taglib/taglib/flac/flacunknownmetadatablock.cpp deleted file mode 100644 index dcd5d65..0000000 --- a/src/taglib/taglib/flac/flacunknownmetadatablock.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include <tstring.h> -#include "flacunknownmetadatablock.h" - -using namespace TagLib; - -class FLAC::UnknownMetadataBlock::UnknownMetadataBlockPrivate -{ -public: - UnknownMetadataBlockPrivate() : code(0) {} - - int code; - ByteVector data; -}; - -FLAC::UnknownMetadataBlock::UnknownMetadataBlock(int code, const ByteVector &data) -{ - d = new UnknownMetadataBlockPrivate; - d->code = code; - //debug(String(data.toHex())); - d->data = data; -} - -FLAC::UnknownMetadataBlock::~UnknownMetadataBlock() -{ - delete d; -} - -int FLAC::UnknownMetadataBlock::code() const -{ - return d->code; -} - -void FLAC::UnknownMetadataBlock::setCode(int code) -{ - d->code = code; -} - -ByteVector FLAC::UnknownMetadataBlock::data() const -{ - return d->data; -} - -void FLAC::UnknownMetadataBlock::setData(const ByteVector &data) -{ - d->data = data; -} - -ByteVector FLAC::UnknownMetadataBlock::render() const -{ - return d->data; -} - diff --git a/src/taglib/taglib/flac/flacunknownmetadatablock.h b/src/taglib/taglib/flac/flacunknownmetadatablock.h deleted file mode 100644 index 3030254..0000000 --- a/src/taglib/taglib/flac/flacunknownmetadatablock.h +++ /dev/null @@ -1,81 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACUNKNOWNMETADATABLOCK_H -#define TAGLIB_FLACUNKNOWNMETADATABLOCK_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "flacmetadatablock.h" - -namespace TagLib { - - namespace FLAC { - - class TAGLIB_EXPORT UnknownMetadataBlock : public MetadataBlock - { - public: - UnknownMetadataBlock(int blockType, const ByteVector &data); - ~UnknownMetadataBlock(); - - /*! - * Returns the FLAC metadata block type. - */ - int code() const; - - /*! - * Sets the FLAC metadata block type. - */ - void setCode(int code); - - /*! - * Returns the FLAC metadata block type. - */ - ByteVector data() const; - - /*! - * Sets the FLAC metadata block type. - */ - void setData(const ByteVector &data); - - /*! - * Render the content of the block. - */ - ByteVector render() const; - - private: - UnknownMetadataBlock(const MetadataBlock &item); - UnknownMetadataBlock &operator=(const MetadataBlock &item); - - class UnknownMetadataBlockPrivate; - UnknownMetadataBlockPrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/it/itfile.cpp b/src/taglib/taglib/it/itfile.cpp deleted file mode 100644 index ad5cf0b..0000000 --- a/src/taglib/taglib/it/itfile.cpp +++ /dev/null @@ -1,330 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "tstringlist.h" -#include "itfile.h" -#include "tdebug.h" -#include "modfileprivate.h" -#include "tpropertymap.h" - -using namespace TagLib; -using namespace IT; - -class IT::File::FilePrivate -{ -public: - FilePrivate(AudioProperties::ReadStyle propertiesStyle) - : tag(), properties(propertiesStyle) - { - } - - Mod::Tag tag; - IT::Properties properties; -}; - -IT::File::File(FileName file, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(file), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -IT::File::File(IOStream *stream, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(stream), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -IT::File::~File() -{ - delete d; -} - -Mod::Tag *IT::File::tag() const -{ - return &d->tag; -} - -PropertyMap IT::File::properties() const -{ - return d->tag.properties(); -} - -PropertyMap IT::File::setProperties(const PropertyMap &properties) -{ - return d->tag.setProperties(properties); -} - -IT::Properties *IT::File::audioProperties() const -{ - return &d->properties; -} - -bool IT::File::save() -{ - if(readOnly()) - { - debug("IT::File::save() - Cannot save to a read only file."); - return false; - } - seek(4); - writeString(d->tag.title(), 25); - writeByte(0); - - seek(2, Current); - - ushort length = 0; - ushort instrumentCount = 0; - ushort sampleCount = 0; - - if(!readU16L(length) || !readU16L(instrumentCount) || !readU16L(sampleCount)) - return false; - - seek(15, Current); - - // write comment as instrument and sample names: - StringList lines = d->tag.comment().split("\n"); - for(ushort i = 0; i < instrumentCount; ++ i) { - seek(192L + length + ((long)i << 2)); - ulong instrumentOffset = 0; - if(!readU32L(instrumentOffset)) - return false; - - seek(instrumentOffset + 32); - - if(i < lines.size()) - writeString(lines[i], 25); - else - writeString(String::null, 25); - writeByte(0); - } - - for(ushort i = 0; i < sampleCount; ++ i) { - seek(192L + length + ((long)instrumentCount << 2) + ((long)i << 2)); - ulong sampleOffset = 0; - if(!readU32L(sampleOffset)) - return false; - - seek(sampleOffset + 20); - - if((TagLib::uint)(i + instrumentCount) < lines.size()) - writeString(lines[i + instrumentCount], 25); - else - writeString(String::null, 25); - writeByte(0); - } - - // write rest as message: - StringList messageLines; - for(uint i = instrumentCount + sampleCount; i < lines.size(); ++ i) - messageLines.append(lines[i]); - ByteVector message = messageLines.toString("\r").data(String::Latin1); - - // it's actually not really stated if the message needs a - // terminating NUL but it does not hurt to add one: - if(message.size() > 7999) - message.resize(7999); - message.append((char)0); - - ushort special = 0; - ushort messageLength = 0; - ulong messageOffset = 0; - - seek(46); - if(!readU16L(special)) - return false; - - ulong fileSize = File::length(); - if(special & Properties::MessageAttached) { - seek(54); - if(!readU16L(messageLength) || !readU32L(messageOffset)) - return false; - - if(messageLength == 0) - messageOffset = fileSize; - } - else - { - messageOffset = fileSize; - seek(46); - writeU16L(special | 0x1); - } - - if(messageOffset + messageLength >= fileSize) { - // append new message - seek(54); - writeU16L(message.size()); - writeU32L(messageOffset); - seek(messageOffset); - writeBlock(message); - truncate(messageOffset + message.size()); - } - else { - // Only overwrite existing message. - // I'd need to parse (understand!) the whole file for more. - // Although I could just move the message to the end of file - // and let the existing one be, but that would waste space. - message.resize(messageLength, 0); - seek(messageOffset); - writeBlock(message); - } - return true; -} - -void IT::File::read(bool) -{ - if(!isOpen()) - return; - - seek(0); - READ_ASSERT(readBlock(4) == "IMPM"); - READ_STRING(d->tag.setTitle, 26); - - seek(2, Current); - - READ_U16L_AS(length); - READ_U16L_AS(instrumentCount); - READ_U16L_AS(sampleCount); - - d->properties.setInstrumentCount(instrumentCount); - d->properties.setSampleCount(sampleCount); - READ_U16L(d->properties.setPatternCount); - READ_U16L(d->properties.setVersion); - READ_U16L(d->properties.setCompatibleVersion); - READ_U16L(d->properties.setFlags); - READ_U16L_AS(special); - d->properties.setSpecial(special); - READ_BYTE(d->properties.setGlobalVolume); - READ_BYTE(d->properties.setMixVolume); - READ_BYTE(d->properties.setBpmSpeed); - READ_BYTE(d->properties.setTempo); - READ_BYTE(d->properties.setPanningSeparation); - READ_BYTE(d->properties.setPitchWheelDepth); - - // IT supports some kind of comment tag. Still, the - // sample/instrument names are abused as comments so - // I just add all together. - String message; - if(special & Properties::MessageAttached) { - READ_U16L_AS(messageLength); - READ_U32L_AS(messageOffset); - seek(messageOffset); - ByteVector messageBytes = readBlock(messageLength); - READ_ASSERT(messageBytes.size() == messageLength); - int index = messageBytes.find((char) 0); - if(index > -1) - messageBytes.resize(index, 0); - messageBytes.replace('\r', '\n'); - message = messageBytes; - } - - seek(64); - - ByteVector pannings = readBlock(64); - ByteVector volumes = readBlock(64); - READ_ASSERT(pannings.size() == 64 && volumes.size() == 64); - int channels = 0; - for(int i = 0; i < 64; ++ i) { - // Strictly speaking an IT file has always 64 channels, but - // I don't count disabled and muted channels. - // But this always gives 64 channels for all my files anyway. - // Strangely VLC does report other values. I wonder how VLC - // gets it's values. - if((unsigned char) pannings[i] < 128 && volumes[i] > 0) - ++channels; - } - d->properties.setChannels(channels); - - // real length might be shorter because of skips and terminator - ushort realLength = 0; - for(ushort i = 0; i < length; ++ i) { - READ_BYTE_AS(order); - if(order == 255) break; - if(order != 254) ++ realLength; - } - d->properties.setLengthInPatterns(realLength); - - StringList comment; - // Note: I found files that have nil characters somewhere - // in the instrument/sample names and more characters - // afterwards. The spec does not mention such a case. - // Currently I just discard anything after a nil, but - // e.g. VLC seems to interprete a nil as a space. I - // don't know what is the proper behaviour. - for(ushort i = 0; i < instrumentCount; ++ i) { - seek(192L + length + ((long)i << 2)); - READ_U32L_AS(instrumentOffset); - seek(instrumentOffset); - - ByteVector instrumentMagic = readBlock(4); - READ_ASSERT(instrumentMagic == "IMPI"); - - READ_STRING_AS(dosFileName, 13); - - seek(15, Current); - - READ_STRING_AS(instrumentName, 26); - comment.append(instrumentName); - } - - for(ushort i = 0; i < sampleCount; ++ i) { - seek(192L + length + ((long)instrumentCount << 2) + ((long)i << 2)); - READ_U32L_AS(sampleOffset); - - seek(sampleOffset); - - ByteVector sampleMagic = readBlock(4); - READ_ASSERT(sampleMagic == "IMPS"); - - READ_STRING_AS(dosFileName, 13); - READ_BYTE_AS(globalVolume); - READ_BYTE_AS(sampleFlags); - READ_BYTE_AS(sampleVolume); - READ_STRING_AS(sampleName, 26); - /* - READ_BYTE_AS(sampleCvt); - READ_BYTE_AS(samplePanning); - READ_U32L_AS(sampleLength); - READ_U32L_AS(loopStart); - READ_U32L_AS(loopStop); - READ_U32L_AS(c5speed); - READ_U32L_AS(sustainLoopStart); - READ_U32L_AS(sustainLoopEnd); - READ_U32L_AS(sampleDataOffset); - READ_BYTE_AS(vibratoSpeed); - READ_BYTE_AS(vibratoDepth); - READ_BYTE_AS(vibratoRate); - READ_BYTE_AS(vibratoType); - */ - - comment.append(sampleName); - } - - if(message.size() > 0) - comment.append(message); - d->tag.setComment(comment.toString("\n")); - d->tag.setTrackerName("Impulse Tracker"); -} diff --git a/src/taglib/taglib/it/itfile.h b/src/taglib/taglib/it/itfile.h deleted file mode 100644 index 19327dc..0000000 --- a/src/taglib/taglib/it/itfile.h +++ /dev/null @@ -1,109 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_ITFILE_H -#define TAGLIB_ITFILE_H - -#include "tfile.h" -#include "audioproperties.h" -#include "taglib_export.h" -#include "modfilebase.h" -#include "modtag.h" -#include "itproperties.h" - -namespace TagLib { - - namespace IT { - - class TAGLIB_EXPORT File : public Mod::FileBase { - public: - /*! - * Constructs a Impulse Tracker file from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Constructs a Impulse Tracker file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - Mod::Tag *tag() const; - - /*! - * Forwards to Mod::Tag::properties(). - * BIC: will be removed once File::toDict() is made virtual - */ - PropertyMap properties() const; - - /*! - * Forwards to Mod::Tag::setProperties(). - * BIC: will be removed once File::setProperties() is made virtual - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the IT::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - IT::Properties *audioProperties() const; - - /*! - * Save the file. - * This is the same as calling save(AllTags); - * - * \note Saving Impulse Tracker tags is not supported. - */ - bool save(); - - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/it/itproperties.cpp b/src/taglib/taglib/it/itproperties.cpp deleted file mode 100644 index 7a328fb..0000000 --- a/src/taglib/taglib/it/itproperties.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/*************************************************************************** - copyright :(C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "itproperties.h" - -using namespace TagLib; -using namespace IT; - -class IT::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - channels(0), - lengthInPatterns(0), - instrumentCount(0), - sampleCount(0), - patternCount(0), - version(0), - compatibleVersion(0), - flags(0), - special(0), - globalVolume(0), - mixVolume(0), - tempo(0), - bpmSpeed(0), - panningSeparation(0), - pitchWheelDepth(0) - { - } - - int channels; - ushort lengthInPatterns; - ushort instrumentCount; - ushort sampleCount; - ushort patternCount; - ushort version; - ushort compatibleVersion; - ushort flags; - ushort special; - uchar globalVolume; - uchar mixVolume; - uchar tempo; - uchar bpmSpeed; - uchar panningSeparation; - uchar pitchWheelDepth; -}; - -IT::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : - AudioProperties(propertiesStyle), - d(new PropertiesPrivate) -{ -} - -IT::Properties::~Properties() -{ - delete d; -} - -int IT::Properties::length() const -{ - return 0; -} - -int IT::Properties::bitrate() const -{ - return 0; -} - -int IT::Properties::sampleRate() const -{ - return 0; -} - -int IT::Properties::channels() const -{ - return d->channels; -} - -TagLib::ushort IT::Properties::lengthInPatterns() const -{ - return d->lengthInPatterns; -} - -bool IT::Properties::stereo() const -{ - return d->flags & Stereo; -} - -TagLib::ushort IT::Properties::instrumentCount() const -{ - return d->instrumentCount; -} - -TagLib::ushort IT::Properties::sampleCount() const -{ - return d->sampleCount; -} - -TagLib::ushort IT::Properties::patternCount() const -{ - return d->patternCount; -} - -TagLib::ushort IT::Properties::version() const -{ - return d->version; -} - -TagLib::ushort IT::Properties::compatibleVersion() const -{ - return d->compatibleVersion; -} - -TagLib::ushort IT::Properties::flags() const -{ - return d->flags; -} - -TagLib::ushort IT::Properties::special() const -{ - return d->special; -} - -uchar IT::Properties::globalVolume() const -{ - return d->globalVolume; -} - -uchar IT::Properties::mixVolume() const -{ - return d->mixVolume; -} - -uchar IT::Properties::tempo() const -{ - return d->tempo; -} - -uchar IT::Properties::bpmSpeed() const -{ - return d->bpmSpeed; -} - -uchar IT::Properties::panningSeparation() const -{ - return d->panningSeparation; -} - -uchar IT::Properties::pitchWheelDepth() const -{ - return d->pitchWheelDepth; -} - -void IT::Properties::setChannels(int channels) -{ - d->channels = channels; -} - -void IT::Properties::setLengthInPatterns(ushort lengthInPatterns) -{ - d->lengthInPatterns = lengthInPatterns; -} - -void IT::Properties::setInstrumentCount(ushort instrumentCount) -{ - d->instrumentCount = instrumentCount; -} - -void IT::Properties::setSampleCount(ushort sampleCount) -{ - d->sampleCount = sampleCount; -} - -void IT::Properties::setPatternCount(ushort patternCount) -{ - d->patternCount = patternCount; -} - -void IT::Properties::setFlags(ushort flags) -{ - d->flags = flags; -} - -void IT::Properties::setSpecial(ushort special) -{ - d->special = special; -} - -void IT::Properties::setCompatibleVersion(ushort compatibleVersion) -{ - d->compatibleVersion = compatibleVersion; -} - -void IT::Properties::setVersion(ushort version) -{ - d->version = version; -} - -void IT::Properties::setGlobalVolume(uchar globalVolume) -{ - d->globalVolume = globalVolume; -} - -void IT::Properties::setMixVolume(uchar mixVolume) -{ - d->mixVolume = mixVolume; -} - -void IT::Properties::setTempo(uchar tempo) -{ - d->tempo = tempo; -} - -void IT::Properties::setBpmSpeed(uchar bpmSpeed) -{ - d->bpmSpeed = bpmSpeed; -} - -void IT::Properties::setPanningSeparation(uchar panningSeparation) -{ - d->panningSeparation = panningSeparation; -} - -void IT::Properties::setPitchWheelDepth(uchar pitchWheelDepth) -{ - d->pitchWheelDepth = pitchWheelDepth; -} diff --git a/src/taglib/taglib/it/itproperties.h b/src/taglib/taglib/it/itproperties.h deleted file mode 100644 index da2a7c4..0000000 --- a/src/taglib/taglib/it/itproperties.h +++ /dev/null @@ -1,101 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_ITPROPERTIES_H -#define TAGLIB_ITPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - namespace IT { - class TAGLIB_EXPORT Properties : public AudioProperties { - friend class File; - public: - /*! Flag bits. */ - enum { - Stereo = 1, - Vol0MixOptimizations = 2, - UseInstruments = 4, - LinearSlides = 8, - OldEffects = 16, - LinkEffects = 32, - UseMidiPitchController = 64, - RequestEmbeddedMidiConf = 128 - }; - - /*! Special bits. */ - enum { - MessageAttached = 1, - MidiConfEmbedded = 8 - }; - - Properties(AudioProperties::ReadStyle propertiesStyle); - virtual ~Properties(); - - int length() const; - int bitrate() const; - int sampleRate() const; - int channels() const; - - ushort lengthInPatterns() const; - bool stereo() const; - ushort instrumentCount() const; - ushort sampleCount() const; - ushort patternCount() const; - ushort version() const; - ushort compatibleVersion() const; - ushort flags() const; - ushort special() const; - uchar globalVolume() const; - uchar mixVolume() const; - uchar tempo() const; - uchar bpmSpeed() const; - uchar panningSeparation() const; - uchar pitchWheelDepth() const; - - void setChannels(int channels); - void setLengthInPatterns(ushort lengthInPatterns); - void setInstrumentCount(ushort instrumentCount); - void setSampleCount (ushort sampleCount); - void setPatternCount(ushort patternCount); - void setVersion (ushort version); - void setCompatibleVersion(ushort compatibleVersion); - void setFlags (ushort flags); - void setSpecial (ushort special); - void setGlobalVolume(uchar globalVolume); - void setMixVolume (uchar mixVolume); - void setTempo (uchar tempo); - void setBpmSpeed (uchar bpmSpeed); - void setPanningSeparation(uchar panningSeparation); - void setPitchWheelDepth (uchar pitchWheelDepth); - - private: - Properties(const Properties&); - Properties &operator=(const Properties&); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mod/modfile.cpp b/src/taglib/taglib/mod/modfile.cpp deleted file mode 100644 index ce974c1..0000000 --- a/src/taglib/taglib/mod/modfile.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "modfile.h" -#include "tstringlist.h" -#include "tdebug.h" -#include "modfileprivate.h" -#include "tpropertymap.h" - -using namespace TagLib; -using namespace Mod; - -class Mod::File::FilePrivate -{ -public: - FilePrivate(AudioProperties::ReadStyle propertiesStyle) - : properties(propertiesStyle) - { - } - - Mod::Tag tag; - Mod::Properties properties; -}; - -Mod::File::File(FileName file, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(file), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -Mod::File::File(IOStream *stream, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(stream), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -Mod::File::~File() -{ - delete d; -} - -Mod::Tag *Mod::File::tag() const -{ - return &d->tag; -} - -Mod::Properties *Mod::File::audioProperties() const -{ - return &d->properties; -} - -PropertyMap Mod::File::properties() const -{ - return d->tag.properties(); -} - -PropertyMap Mod::File::setProperties(const PropertyMap &properties) -{ - return d->tag.setProperties(properties); -} - -bool Mod::File::save() -{ - if(readOnly()) { - debug("Mod::File::save() - Cannot save to a read only file."); - return false; - } - seek(0); - writeString(d->tag.title(), 20); - StringList lines = d->tag.comment().split("\n"); - uint n = std::min(lines.size(), d->properties.instrumentCount()); - for(uint i = 0; i < n; ++ i) { - writeString(lines[i], 22); - seek(8, Current); - } - - for(uint i = n; i < d->properties.instrumentCount(); ++ i) { - writeString(String::null, 22); - seek(8, Current); - } - return true; -} - -void Mod::File::read(bool) -{ - if(!isOpen()) - return; - - seek(1080); - ByteVector modId = readBlock(4); - READ_ASSERT(modId.size() == 4); - - int channels = 4; - uint instruments = 31; - if(modId == "M.K." || modId == "M!K!" || modId == "M&K!" || modId == "N.T.") { - d->tag.setTrackerName("ProTracker"); - channels = 4; - } - else if(modId.startsWith("FLT") || modId.startsWith("TDZ")) { - d->tag.setTrackerName("StarTrekker"); - char digit = modId[3]; - READ_ASSERT(digit >= '0' && digit <= '9'); - channels = digit - '0'; - } - else if(modId.endsWith("CHN")) { - d->tag.setTrackerName("StarTrekker"); - char digit = modId[0]; - READ_ASSERT(digit >= '0' && digit <= '9'); - channels = digit - '0'; - } - else if(modId == "CD81" || modId == "OKTA") { - d->tag.setTrackerName("Atari Oktalyzer"); - channels = 8; - } - else if(modId.endsWith("CH") || modId.endsWith("CN")) { - d->tag.setTrackerName("TakeTracker"); - char digit = modId[0]; - READ_ASSERT(digit >= '0' && digit <= '9'); - channels = (digit - '0') * 10; - digit = modId[1]; - READ_ASSERT(digit >= '0' && digit <= '9'); - channels += digit - '0'; - } - else { - // Not sure if this is correct. I'd need a file - // created with NoiseTracker to check this. - d->tag.setTrackerName("NoiseTracker"); // probably - channels = 4; - instruments = 15; - } - d->properties.setChannels(channels); - d->properties.setInstrumentCount(instruments); - - seek(0); - READ_STRING(d->tag.setTitle, 20); - - StringList comment; - for(uint i = 0; i < instruments; ++ i) { - READ_STRING_AS(instrumentName, 22); - // value in words, * 2 (<< 1) for bytes: - READ_U16B_AS(sampleLength); - - READ_BYTE_AS(fineTuneByte); - int fineTune = fineTuneByte & 0xF; - // > 7 means negative value - if(fineTune > 7) fineTune -= 16; - - READ_BYTE_AS(volume); - if(volume > 64) volume = 64; - // volume in decibels: 20 * log10(volume / 64) - - // value in words, * 2 (<< 1) for bytes: - READ_U16B_AS(repeatStart); - // value in words, * 2 (<< 1) for bytes: - READ_U16B_AS(repatLength); - - comment.append(instrumentName); - } - - READ_BYTE(d->properties.setLengthInPatterns); - - d->tag.setComment(comment.toString("\n")); -} diff --git a/src/taglib/taglib/mod/modfile.h b/src/taglib/taglib/mod/modfile.h deleted file mode 100644 index c45ede2..0000000 --- a/src/taglib/taglib/mod/modfile.h +++ /dev/null @@ -1,110 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_MODFILE_H -#define TAGLIB_MODFILE_H - -#include "tfile.h" -#include "audioproperties.h" -#include "taglib_export.h" -#include "modfilebase.h" -#include "modtag.h" -#include "modproperties.h" - -namespace TagLib { - - namespace Mod { - - class TAGLIB_EXPORT File : public TagLib::Mod::FileBase - { - public: - /*! - * Constructs a Protracker file from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Constructs a Protracker file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - Mod::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * Forwards to Mod::Tag::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Forwards to Mod::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - /*! - * Returns the Mod::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - Mod::Properties *audioProperties() const; - - /*! - * Save the file. - * This is the same as calling save(AllTags); - * - * \note Saving Protracker tags is not supported. - */ - bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/mod/modfilebase.cpp b/src/taglib/taglib/mod/modfilebase.cpp deleted file mode 100644 index e074dac..0000000 --- a/src/taglib/taglib/mod/modfilebase.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "tdebug.h" -#include "modfilebase.h" - -using namespace TagLib; -using namespace Mod; - -Mod::FileBase::FileBase(FileName file) : TagLib::File(file) -{ -} - -Mod::FileBase::FileBase(IOStream *stream) : TagLib::File(stream) -{ -} - -void Mod::FileBase::writeString(const String &s, ulong size, char padding) -{ - ByteVector data(s.data(String::Latin1)); - data.resize(size, padding); - writeBlock(data); -} - -bool Mod::FileBase::readString(String &s, ulong size) -{ - ByteVector data(readBlock(size)); - if(data.size() < size) return false; - int index = data.find((char) 0); - if(index > -1) - { - data.resize(index); - } - data.replace((char) 0xff, ' '); - - s = data; - return true; -} - -void Mod::FileBase::writeByte(uchar byte) -{ - ByteVector data(1, byte); - writeBlock(data); -} - -void Mod::FileBase::writeU16L(ushort number) -{ - writeBlock(ByteVector::fromShort(number, false)); -} - -void Mod::FileBase::writeU32L(ulong number) -{ - writeBlock(ByteVector::fromUInt(number, false)); -} - -void Mod::FileBase::writeU16B(ushort number) -{ - writeBlock(ByteVector::fromShort(number, true)); -} - -void Mod::FileBase::writeU32B(ulong number) -{ - writeBlock(ByteVector::fromUInt(number, true)); -} - -bool Mod::FileBase::readByte(uchar &byte) -{ - ByteVector data(readBlock(1)); - if(data.size() < 1) return false; - byte = data[0]; - return true; -} - -bool Mod::FileBase::readU16L(ushort &number) -{ - ByteVector data(readBlock(2)); - if(data.size() < 2) return false; - number = data.toUShort(false); - return true; -} - -bool Mod::FileBase::readU32L(ulong &number) { - ByteVector data(readBlock(4)); - if(data.size() < 4) return false; - number = data.toUInt(false); - return true; -} - -bool Mod::FileBase::readU16B(ushort &number) -{ - ByteVector data(readBlock(2)); - if(data.size() < 2) return false; - number = data.toUShort(true); - return true; -} - -bool Mod::FileBase::readU32B(ulong &number) { - ByteVector data(readBlock(4)); - if(data.size() < 4) return false; - number = data.toUInt(true); - return true; -} diff --git a/src/taglib/taglib/mod/modfilebase.h b/src/taglib/taglib/mod/modfilebase.h deleted file mode 100644 index 383bde1..0000000 --- a/src/taglib/taglib/mod/modfilebase.h +++ /dev/null @@ -1,62 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_MODFILEBASE_H -#define TAGLIB_MODFILEBASE_H - -#include "taglib.h" -#include "tfile.h" -#include "tstring.h" -#include "tlist.h" -#include "taglib_export.h" - -#include <algorithm> - -namespace TagLib { - - namespace Mod { - - class TAGLIB_EXPORT FileBase : public TagLib::File - { - protected: - FileBase(FileName file); - FileBase(IOStream *stream); - - void writeString(const String &s, ulong size, char padding = 0); - void writeByte(uchar byte); - void writeU16L(ushort number); - void writeU32L(ulong number); - void writeU16B(ushort number); - void writeU32B(ulong number); - - bool readString(String &s, ulong size); - bool readByte(uchar &byte); - bool readU16L(ushort &number); - bool readU32L(ulong &number); - bool readU16B(ushort &number); - bool readU32B(ulong &number); - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/mod/modfileprivate.h b/src/taglib/taglib/mod/modfileprivate.h deleted file mode 100644 index 19a3001..0000000 --- a/src/taglib/taglib/mod/modfileprivate.h +++ /dev/null @@ -1,67 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_MODFILEPRIVATE_H -#define TAGLIB_MODFILEPRIVATE_H - -// some helper-macros only used internally by (s3m|it|xm)file.cpp -#define READ_ASSERT(cond) \ - if(!(cond)) \ - { \ - setValid(false); \ - return; \ - } - -#define READ(setter,type,read) \ - { \ - type number; \ - READ_ASSERT(read(number)); \ - setter(number); \ - } - -#define READ_BYTE(setter) READ(setter,uchar,readByte) -#define READ_U16L(setter) READ(setter,ushort,readU16L) -#define READ_U32L(setter) READ(setter,ulong,readU32L) -#define READ_U16B(setter) READ(setter,ushort,readU16B) -#define READ_U32B(setter) READ(setter,ulong,readU32B) - -#define READ_STRING(setter,size) \ - { \ - String s; \ - READ_ASSERT(readString(s, size)); \ - setter(s); \ - } - -#define READ_AS(type,name,read) \ - type name = 0; \ - READ_ASSERT(read(name)); - -#define READ_BYTE_AS(name) READ_AS(uchar,name,readByte) -#define READ_U16L_AS(name) READ_AS(ushort,name,readU16L) -#define READ_U32L_AS(name) READ_AS(ulong,name,readU32L) -#define READ_U16B_AS(name) READ_AS(ushort,name,readU16B) -#define READ_U32B_AS(name) READ_AS(ulong,name,readU32B) - -#define READ_STRING_AS(name,size) \ - String name; \ - READ_ASSERT(readString(name, size)); - -#endif diff --git a/src/taglib/taglib/mod/modproperties.cpp b/src/taglib/taglib/mod/modproperties.cpp deleted file mode 100644 index 4d3c354..0000000 --- a/src/taglib/taglib/mod/modproperties.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "modproperties.h" - -using namespace TagLib; -using namespace Mod; - -class Mod::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - channels(0), - instrumentCount(0), - lengthInPatterns(0) - { - } - - int channels; - uint instrumentCount; - uchar lengthInPatterns; -}; - -Mod::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : - AudioProperties(propertiesStyle), - d(new PropertiesPrivate) -{ -} - -Mod::Properties::~Properties() -{ - delete d; -} - -int Mod::Properties::length() const -{ - return 0; -} - -int Mod::Properties::bitrate() const -{ - return 0; -} - -int Mod::Properties::sampleRate() const -{ - return 0; -} - -int Mod::Properties::channels() const -{ - return d->channels; -} - -TagLib::uint Mod::Properties::instrumentCount() const -{ - return d->instrumentCount; -} - -uchar Mod::Properties::lengthInPatterns() const -{ - return d->lengthInPatterns; -} - -void Mod::Properties::setChannels(int channels) -{ - d->channels = channels; -} - -void Mod::Properties::setInstrumentCount(uint instrumentCount) -{ - d->instrumentCount = instrumentCount; -} - -void Mod::Properties::setLengthInPatterns(uchar lengthInPatterns) -{ - d->lengthInPatterns = lengthInPatterns; -} diff --git a/src/taglib/taglib/mod/modproperties.h b/src/taglib/taglib/mod/modproperties.h deleted file mode 100644 index d50353a..0000000 --- a/src/taglib/taglib/mod/modproperties.h +++ /dev/null @@ -1,65 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_MODPROPERTIES_H -#define TAGLIB_MODPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace Mod { - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - Properties(AudioProperties::ReadStyle propertiesStyle); - virtual ~Properties(); - - int length() const; - int bitrate() const; - int sampleRate() const; - int channels() const; - - uint instrumentCount() const; - uchar lengthInPatterns() const; - - void setChannels(int channels); - - void setInstrumentCount(uint sampleCount); - void setLengthInPatterns(uchar lengthInPatterns); - - private: - friend class File; - - Properties(const Properties&); - Properties &operator=(const Properties&); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/mod/modtag.cpp b/src/taglib/taglib/mod/modtag.cpp deleted file mode 100644 index 14c4c74..0000000 --- a/src/taglib/taglib/mod/modtag.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "modtag.h" -#include "tstringlist.h" -#include "tpropertymap.h" - -using namespace TagLib; -using namespace Mod; - -class Mod::Tag::TagPrivate -{ -public: - TagPrivate() - { - } - - String title; - String comment; - String trackerName; -}; - -Mod::Tag::Tag() : TagLib::Tag() -{ - d = new TagPrivate; -} - -Mod::Tag::~Tag() -{ - delete d; -} - -String Mod::Tag::title() const -{ - return d->title; -} - -String Mod::Tag::artist() const -{ - return String::null; -} - -String Mod::Tag::album() const -{ - return String::null; -} - -String Mod::Tag::comment() const -{ - return d->comment; -} - -String Mod::Tag::genre() const -{ - return String::null; -} - -TagLib::uint Mod::Tag::year() const -{ - return 0; -} - -TagLib::uint Mod::Tag::track() const -{ - return 0; -} - -String Mod::Tag::trackerName() const -{ - return d->trackerName; -} - -void Mod::Tag::setTitle(const String &title) -{ - d->title = title; -} - -void Mod::Tag::setArtist(const String &) -{ -} - -void Mod::Tag::setAlbum(const String &) -{ -} - -void Mod::Tag::setComment(const String &comment) -{ - d->comment = comment; -} - -void Mod::Tag::setGenre(const String &) -{ -} - -void Mod::Tag::setYear(uint) -{ -} - -void Mod::Tag::setTrack(uint) -{ -} - -void Mod::Tag::setTrackerName(const String &trackerName) -{ - d->trackerName = trackerName; -} - -PropertyMap Mod::Tag::properties() const -{ - PropertyMap properties; - properties["TITLE"] = d->title; - properties["COMMENT"] = d->comment; - if(!(d->trackerName.isNull())) - properties["TRACKERNAME"] = d->trackerName; - return properties; -} - -PropertyMap Mod::Tag::setProperties(const PropertyMap &origProps) -{ - PropertyMap properties(origProps); - properties.removeEmpty(); - StringList oneValueSet; - if(properties.contains("TITLE")) { - d->title = properties["TITLE"].front(); - oneValueSet.append("TITLE"); - } else - d->title = String::null; - - if(properties.contains("COMMENT")) { - d->comment = properties["COMMENT"].front(); - oneValueSet.append("COMMENT"); - } else - d->comment = String::null; - - if(properties.contains("TRACKERNAME")) { - d->trackerName = properties["TRACKERNAME"].front(); - oneValueSet.append("TRACKERNAME"); - } else - d->trackerName = String::null; - - // for each tag that has been set above, remove the first entry in the corresponding - // value list. The others will be returned as unsupported by this format. - for(StringList::Iterator it = oneValueSet.begin(); it != oneValueSet.end(); ++it) { - if(properties[*it].size() == 1) - properties.erase(*it); - else - properties[*it].erase( properties[*it].begin() ); - } - return properties; -} diff --git a/src/taglib/taglib/mod/modtag.h b/src/taglib/taglib/mod/modtag.h deleted file mode 100644 index f33e33f..0000000 --- a/src/taglib/taglib/mod/modtag.h +++ /dev/null @@ -1,190 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_MODTAG_H -#define TAGLIB_MODTAG_H - -#include "tag.h" - -namespace TagLib { - - namespace Mod { - - /*! - * Tags for module files (Mod, S3M, IT, XM). - * - * Note that only the \a title is supported as such by most - * module file formats. Except for XM files the \a trackerName - * is derived from the file format or the flavour of the file - * format. For XM files it is stored in the file. - * - * The \a comment tag is not strictly supported by module files, - * but it is common practice to abuse instrument/sample/pattern - * names as multiline comments. TagLib does so as well. - */ - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - Tag(); - virtual ~Tag(); - - /*! - * Returns the track name; if no track name is present in the tag - * String::null will be returned. - */ - String title() const; - - /*! - * Not supported by module files. Therefore always returns String::null. - */ - String artist() const; - - /*! - * Not supported by module files. Therefore always returns String::null. - */ - String album() const; - - /*! - * Returns the track comment derived from the instrument/sample/pattern - * names; if no comment is present in the tag String::null will be - * returned. - */ - String comment() const; - - /*! - * Not supported by module files. Therefore always returns String::null. - */ - String genre() const; - - /*! - * Not supported by module files. Therefore always returns 0. - */ - uint year() const; - - /*! - * Not supported by module files. Therefore always returns 0. - */ - uint track() const; - - /*! - * Returns the name of the tracker used to create/edit the module file. - * Only XM files store this tag to the file as such, for other formats - * (Mod, S3M, IT) this is derived from the file type or the flavour of - * the file type. Therefore only XM files might have an empty - * (String::null) tracker name. - */ - String trackerName() const; - - /*! - * Sets the title to \a title. If \a title is String::null then this - * value will be cleared. - * - * The length limits per file type are (1 characetr = 1 byte): - * Mod 20 characters, S3M 27 characters, IT 25 characters and XM 20 - * characters. - */ - void setTitle(const String &title); - - /*! - * Not supported by module files and therefore ignored. - */ - void setArtist(const String &artist); - - /*! - * Not supported by module files and therefore ignored. - */ - void setAlbum(const String &album); - - /*! - * Sets the comment to \a comment. If \a comment is String::null then - * this value will be cleared. - * - * Note that module file formats don't actually support a comment tag. - * Instead the names of instruments/patterns/samples are abused as - * a multiline comment. Because of this the number of lines in a - * module file is fixed to the number of instruments/patterns/samples. - * - * Also note that the instrument/pattern/sample name length is limited - * an thus the line length in comments are limited. Too big comments - * will be truncated. - * - * The line length limits per file type are (1 characetr = 1 byte): - * Mod 22 characters, S3M 27 characters, IT 25 characters and XM 22 - * characters. - */ - void setComment(const String &comment); - - /*! - * Not supported by module files and therefore ignored. - */ - void setGenre(const String &genre); - - /*! - * Not supported by module files and therefore ignored. - */ - void setYear(uint year); - - /*! - * Not supported by module files and therefore ignored. - */ - void setTrack(uint track); - - /*! - * Sets the tracker name to \a trackerName. If \a trackerName is - * String::null then this value will be cleared. - * - * Note that only XM files support this tag. Setting the - * tracker name for other module file formats will be ignored. - * - * The length of this tag is limited to 20 characters (1 character - * = 1 byte). - */ - void setTrackerName(const String &trackerName); - - /*! - * Implements the unified property interface -- export function. - * Since the module tag is very limited, the exported map is as well. - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Because of the limitations of the module file tag, any tags besides - * COMMENT, TITLE and, if it is an XM file, TRACKERNAME, will be - * returened. Additionally, if the map contains tags with multiple values, - * all but the first will be contained in the returned map of unsupported - * properties. - */ - PropertyMap setProperties(const PropertyMap &); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/mp4/mp4atom.cpp b/src/taglib/taglib/mp4/mp4atom.cpp deleted file mode 100644 index 7b87a47..0000000 --- a/src/taglib/taglib/mp4/mp4atom.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include "mp4atom.h" - -using namespace TagLib; - -const char *MP4::Atom::containers[11] = { - "moov", "udta", "mdia", "meta", "ilst", - "stbl", "minf", "moof", "traf", "trak", - "stsd" -}; - -MP4::Atom::Atom(File *file) -{ - offset = file->tell(); - ByteVector header = file->readBlock(8); - if (header.size() != 8) { - // The atom header must be 8 bytes long, otherwise there is either - // trailing garbage or the file is truncated - debug("MP4: Couldn't read 8 bytes of data for atom header"); - length = 0; - file->seek(0, File::End); - return; - } - - length = header.toUInt(); - - if (length == 1) { - const long long longLength = file->readBlock(8).toLongLong(); - if (longLength >= 8 && longLength <= 0xFFFFFFFF) { - // The atom has a 64-bit length, but it's actually a 32-bit value - length = (long)longLength; - } - else { - debug("MP4: 64-bit atoms are not supported"); - length = 0; - file->seek(0, File::End); - return; - } - } - if (length < 8) { - debug("MP4: Invalid atom size"); - length = 0; - file->seek(0, File::End); - return; - } - - name = header.mid(4, 4); - - for(int i = 0; i < numContainers; i++) { - if(name == containers[i]) { - if(name == "meta") { - file->seek(4, File::Current); - } - else if(name == "stsd") { - file->seek(8, File::Current); - } - while(file->tell() < offset + length) { - MP4::Atom *child = new MP4::Atom(file); - children.append(child); - if (child->length == 0) - return; - } - return; - } - } - - file->seek(offset + length); -} - -MP4::Atom::~Atom() -{ - for(unsigned int i = 0; i < children.size(); i++) { - delete children[i]; - } - children.clear(); -} - -MP4::Atom * -MP4::Atom::find(const char *name1, const char *name2, const char *name3, const char *name4) -{ - if(name1 == 0) { - return this; - } - for(unsigned int i = 0; i < children.size(); i++) { - if(children[i]->name == name1) { - return children[i]->find(name2, name3, name4); - } - } - return 0; -} - -MP4::AtomList -MP4::Atom::findall(const char *name, bool recursive) -{ - MP4::AtomList result; - for(unsigned int i = 0; i < children.size(); i++) { - if(children[i]->name == name) { - result.append(children[i]); - } - if(recursive) { - result.append(children[i]->findall(name, recursive)); - } - } - return result; -} - -bool -MP4::Atom::path(MP4::AtomList &path, const char *name1, const char *name2, const char *name3) -{ - path.append(this); - if(name1 == 0) { - return true; - } - for(unsigned int i = 0; i < children.size(); i++) { - if(children[i]->name == name1) { - return children[i]->path(path, name2, name3); - } - } - return false; -} - -MP4::Atoms::Atoms(File *file) -{ - file->seek(0, File::End); - long end = file->tell(); - file->seek(0); - while(file->tell() + 8 <= end) { - MP4::Atom *atom = new MP4::Atom(file); - atoms.append(atom); - if (atom->length == 0) - break; - } -} - -MP4::Atoms::~Atoms() -{ - for(unsigned int i = 0; i < atoms.size(); i++) { - delete atoms[i]; - } - atoms.clear(); -} - -MP4::Atom * -MP4::Atoms::find(const char *name1, const char *name2, const char *name3, const char *name4) -{ - for(unsigned int i = 0; i < atoms.size(); i++) { - if(atoms[i]->name == name1) { - return atoms[i]->find(name2, name3, name4); - } - } - return 0; -} - -MP4::AtomList -MP4::Atoms::path(const char *name1, const char *name2, const char *name3, const char *name4) -{ - MP4::AtomList path; - for(unsigned int i = 0; i < atoms.size(); i++) { - if(atoms[i]->name == name1) { - if(!atoms[i]->path(path, name2, name3, name4)) { - path.clear(); - } - return path; - } - } - return path; -} - diff --git a/src/taglib/taglib/mp4/mp4atom.h b/src/taglib/taglib/mp4/mp4atom.h deleted file mode 100644 index ea5091a..0000000 --- a/src/taglib/taglib/mp4/mp4atom.h +++ /dev/null @@ -1,111 +0,0 @@ -/************************************************************************** - copyright : (C) 2007,2011 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -// This file is not part of the public API! - -#ifndef DO_NOT_DOCUMENT - -#ifndef TAGLIB_MP4ATOM_H -#define TAGLIB_MP4ATOM_H - -#include "tfile.h" -#include "tlist.h" - -namespace TagLib { - - namespace MP4 { - - class Atom; - typedef TagLib::List<Atom *> AtomList; - - enum AtomDataType - { - TypeImplicit = 0, // for use with tags for which no type needs to be indicated because only one type is allowed - TypeUTF8 = 1, // without any count or null terminator - TypeUTF16 = 2, // also known as UTF-16BE - TypeSJIS = 3, // deprecated unless it is needed for special Japanese characters - TypeHTML = 6, // the HTML file header specifies which HTML version - TypeXML = 7, // the XML header must identify the DTD or schemas - TypeUUID = 8, // also known as GUID; stored as 16 bytes in binary (valid as an ID) - TypeISRC = 9, // stored as UTF-8 text (valid as an ID) - TypeMI3P = 10, // stored as UTF-8 text (valid as an ID) - TypeGIF = 12, // (deprecated) a GIF image - TypeJPEG = 13, // a JPEG image - TypePNG = 14, // a PNG image - TypeURL = 15, // absolute, in UTF-8 characters - TypeDuration = 16, // in milliseconds, 32-bit integer - TypeDateTime = 17, // in UTC, counting seconds since midnight, January 1, 1904; 32 or 64-bits - TypeGenred = 18, // a list of enumerated values - TypeInteger = 21, // a signed big-endian integer with length one of { 1,2,3,4,8 } bytes - TypeRIAAPA = 24, // RIAA parental advisory; { -1=no, 1=yes, 0=unspecified }, 8-bit ingteger - TypeUPC = 25, // Universal Product Code, in text UTF-8 format (valid as an ID) - TypeBMP = 27, // Windows bitmap image - TypeUndefined = 255 // undefined - }; - - struct AtomData { - AtomData(AtomDataType type, ByteVector data) : type(type), locale(0), data(data) {} - AtomDataType type; - int locale; - ByteVector data; - }; - - typedef TagLib::List<AtomData> AtomDataList; - - class Atom - { - public: - Atom(File *file); - ~Atom(); - Atom *find(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - bool path(AtomList &path, const char *name1, const char *name2 = 0, const char *name3 = 0); - AtomList findall(const char *name, bool recursive = false); - long offset; - long length; - TagLib::ByteVector name; - AtomList children; - private: - static const int numContainers = 11; - static const char *containers[11]; - }; - - //! Root-level atoms - class Atoms - { - public: - Atoms(File *file); - ~Atoms(); - Atom *find(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - AtomList path(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - AtomList atoms; - }; - - } - -} - -#endif - -#endif diff --git a/src/taglib/taglib/mp4/mp4coverart.cpp b/src/taglib/taglib/mp4/mp4coverart.cpp deleted file mode 100644 index 2746469..0000000 --- a/src/taglib/taglib/mp4/mp4coverart.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/************************************************************************** - copyright : (C) 2009 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "trefcounter.h" -#include "mp4coverart.h" - -using namespace TagLib; - -class MP4::CoverArt::CoverArtPrivate : public RefCounter -{ -public: - CoverArtPrivate() : RefCounter(), format(MP4::CoverArt::JPEG) {} - - Format format; - ByteVector data; -}; - -MP4::CoverArt::CoverArt(Format format, const ByteVector &data) -{ - d = new CoverArtPrivate; - d->format = format; - d->data = data; -} - -MP4::CoverArt::CoverArt(const CoverArt &item) : d(item.d) -{ - d->ref(); -} - -MP4::CoverArt & -MP4::CoverArt::operator=(const CoverArt &item) -{ - if(d->deref()) { - delete d; - } - d = item.d; - d->ref(); - return *this; -} - -MP4::CoverArt::~CoverArt() -{ - if(d->deref()) { - delete d; - } -} - -MP4::CoverArt::Format -MP4::CoverArt::format() const -{ - return d->format; -} - -ByteVector -MP4::CoverArt::data() const -{ - return d->data; -} - diff --git a/src/taglib/taglib/mp4/mp4coverart.h b/src/taglib/taglib/mp4/mp4coverart.h deleted file mode 100644 index 64115b4..0000000 --- a/src/taglib/taglib/mp4/mp4coverart.h +++ /dev/null @@ -1,75 +0,0 @@ -/************************************************************************** - copyright : (C) 2009 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4COVERART_H -#define TAGLIB_MP4COVERART_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "mp4atom.h" - -namespace TagLib { - - namespace MP4 { - - class TAGLIB_EXPORT CoverArt - { - public: - /*! - * This describes the image type. - */ - enum Format { - JPEG = TypeJPEG, - PNG = TypePNG, - BMP = TypeBMP, - GIF = TypeGIF, - Unknown = TypeImplicit, - }; - - CoverArt(Format format, const ByteVector &data); - ~CoverArt(); - - CoverArt(const CoverArt &item); - CoverArt &operator=(const CoverArt &item); - - //! Format of the image - Format format() const; - - //! The image data - ByteVector data() const; - - private: - class CoverArtPrivate; - CoverArtPrivate *d; - }; - - typedef List<CoverArt> CoverArtList; - - } - -} - -#endif diff --git a/src/taglib/taglib/mp4/mp4file.cpp b/src/taglib/taglib/mp4/mp4file.cpp deleted file mode 100644 index aab1a2b..0000000 --- a/src/taglib/taglib/mp4/mp4file.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include <tpropertymap.h> -#include "mp4atom.h" -#include "mp4tag.h" -#include "mp4file.h" - -using namespace TagLib; - -class MP4::File::FilePrivate -{ -public: - FilePrivate() : tag(0), atoms(0), properties(0) - { - } - - ~FilePrivate() - { - if(atoms) { - delete atoms; - atoms = 0; - } - if(tag) { - delete tag; - tag = 0; - } - if(properties) { - delete properties; - properties = 0; - } - } - - MP4::Tag *tag; - MP4::Atoms *atoms; - MP4::Properties *properties; -}; - -MP4::File::File(FileName file, bool readProperties, AudioProperties::ReadStyle audioPropertiesStyle) - : TagLib::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, audioPropertiesStyle); -} - -MP4::File::File(IOStream *stream, bool readProperties, AudioProperties::ReadStyle audioPropertiesStyle) - : TagLib::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, audioPropertiesStyle); -} - -MP4::File::~File() -{ - delete d; -} - -MP4::Tag * -MP4::File::tag() const -{ - return d->tag; -} - -PropertyMap MP4::File::properties() const -{ - return d->tag->properties(); -} - -void MP4::File::removeUnsupportedProperties(const StringList &properties) -{ - d->tag->removeUnsupportedProperties(properties); -} - -PropertyMap MP4::File::setProperties(const PropertyMap &properties) -{ - return d->tag->setProperties(properties); -} - -MP4::Properties * -MP4::File::audioProperties() const -{ - return d->properties; -} - -bool -MP4::File::checkValid(const MP4::AtomList &list) -{ - for(uint i = 0; i < list.size(); i++) { - if(list[i]->length == 0) - return false; - if(!checkValid(list[i]->children)) - return false; - } - return true; -} - -void -MP4::File::read(bool readProperties, Properties::ReadStyle audioPropertiesStyle) -{ - if(!isValid()) - return; - - d->atoms = new Atoms(this); - if (!checkValid(d->atoms->atoms)) { - setValid(false); - return; - } - - // must have a moov atom, otherwise consider it invalid - MP4::Atom *moov = d->atoms->find("moov"); - if(!moov) { - setValid(false); - return; - } - - d->tag = new Tag(this, d->atoms); - if(readProperties) { - d->properties = new Properties(this, d->atoms, audioPropertiesStyle); - } -} - -bool -MP4::File::save() -{ - if(readOnly()) { - debug("MP4::File::save() -- File is read only."); - return false; - } - - if(!isValid()) { - debug("MP4::File::save() -- Trying to save invalid file."); - return false; - } - - return d->tag->save(); -} - diff --git a/src/taglib/taglib/mp4/mp4file.h b/src/taglib/taglib/mp4/mp4file.h deleted file mode 100644 index 39693d3..0000000 --- a/src/taglib/taglib/mp4/mp4file.h +++ /dev/null @@ -1,130 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4FILE_H -#define TAGLIB_MP4FILE_H - -#include "tag.h" -#include "tfile.h" -#include "taglib_export.h" -#include "mp4properties.h" -#include "mp4tag.h" - -namespace TagLib { - - //! An implementation of MP4 (AAC, ALAC, ...) metadata - namespace MP4 { - - class Atoms; - - /*! - * This implements and provides an interface for MP4 files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to MP4 files. - */ - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * Constructs an MP4 file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle audioPropertiesStyle = Properties::Average); - - /*! - * Constructs an MP4 file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle audioPropertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to the MP4 tag of the file. - * - * MP4::Tag implements the tag interface, so this serves as the - * reimplementation of TagLib::File::tag(). - * - * \note The Tag <b>is still</b> owned by the MP4::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties. Forwards to the actual Tag's - * removeUnsupportedProperties() function. - */ - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the MP4 audio properties for this file. - */ - Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - bool save(); - - private: - - void read(bool readProperties, Properties::ReadStyle audioPropertiesStyle); - bool checkValid(const MP4::AtomList &list); - - class FilePrivate; - FilePrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/mp4/mp4item.cpp b/src/taglib/taglib/mp4/mp4item.cpp deleted file mode 100644 index 671f26b..0000000 --- a/src/taglib/taglib/mp4/mp4item.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "trefcounter.h" -#include "mp4item.h" - -using namespace TagLib; - -class MP4::Item::ItemPrivate : public RefCounter -{ -public: - ItemPrivate() : RefCounter(), valid(true), atomDataType(TypeUndefined) {} - - bool valid; - AtomDataType atomDataType; - union { - bool m_bool; - int m_int; - IntPair m_intPair; - uchar m_byte; - uint m_uint; - long long m_longlong; - }; - StringList m_stringList; - ByteVectorList m_byteVectorList; - MP4::CoverArtList m_coverArtList; -}; - -MP4::Item::Item() -{ - d = new ItemPrivate; - d->valid = false; -} - -MP4::Item::Item(const Item &item) : d(item.d) -{ - d->ref(); -} - -MP4::Item & -MP4::Item::operator=(const Item &item) -{ - if(d->deref()) { - delete d; - } - d = item.d; - d->ref(); - return *this; -} - -MP4::Item::~Item() -{ - if(d->deref()) { - delete d; - } -} - -MP4::Item::Item(bool value) -{ - d = new ItemPrivate; - d->m_bool = value; -} - -MP4::Item::Item(int value) -{ - d = new ItemPrivate; - d->m_int = value; -} - -MP4::Item::Item(uchar value) -{ - d = new ItemPrivate; - d->m_byte = value; -} - -MP4::Item::Item(uint value) -{ - d = new ItemPrivate; - d->m_uint = value; -} - -MP4::Item::Item(long long value) -{ - d = new ItemPrivate; - d->m_longlong = value; -} - -MP4::Item::Item(int value1, int value2) -{ - d = new ItemPrivate; - d->m_intPair.first = value1; - d->m_intPair.second = value2; -} - -MP4::Item::Item(const ByteVectorList &value) -{ - d = new ItemPrivate; - d->m_byteVectorList = value; -} - -MP4::Item::Item(const StringList &value) -{ - d = new ItemPrivate; - d->m_stringList = value; -} - -MP4::Item::Item(const MP4::CoverArtList &value) -{ - d = new ItemPrivate; - d->m_coverArtList = value; -} - -void MP4::Item::setAtomDataType(MP4::AtomDataType type) -{ - d->atomDataType = type; -} - -MP4::AtomDataType MP4::Item::atomDataType() const -{ - return d->atomDataType; -} - -bool -MP4::Item::toBool() const -{ - return d->m_bool; -} - -int -MP4::Item::toInt() const -{ - return d->m_int; -} - -uchar -MP4::Item::toByte() const -{ - return d->m_byte; -} - -TagLib::uint -MP4::Item::toUInt() const -{ - return d->m_uint; -} - -long long -MP4::Item::toLongLong() const -{ - return d->m_longlong; -} - -MP4::Item::IntPair -MP4::Item::toIntPair() const -{ - return d->m_intPair; -} - -StringList -MP4::Item::toStringList() const -{ - return d->m_stringList; -} - -ByteVectorList -MP4::Item::toByteVectorList() const -{ - return d->m_byteVectorList; -} - -MP4::CoverArtList -MP4::Item::toCoverArtList() const -{ - return d->m_coverArtList; -} - -bool -MP4::Item::isValid() const -{ - return d->valid; -} - diff --git a/src/taglib/taglib/mp4/mp4item.h b/src/taglib/taglib/mp4/mp4item.h deleted file mode 100644 index be7aa1a..0000000 --- a/src/taglib/taglib/mp4/mp4item.h +++ /dev/null @@ -1,83 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4ITEM_H -#define TAGLIB_MP4ITEM_H - -#include "tstringlist.h" -#include "mp4coverart.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace MP4 { - - class TAGLIB_EXPORT Item - { - public: - struct IntPair { - int first, second; - }; - - Item(); - Item(const Item &item); - Item &operator=(const Item &item); - ~Item(); - - Item(int value); - Item(uchar value); - Item(uint value); - Item(long long value); - Item(bool value); - Item(int first, int second); - Item(const StringList &value); - Item(const ByteVectorList &value); - Item(const CoverArtList &value); - - void setAtomDataType(AtomDataType type); - AtomDataType atomDataType() const; - - int toInt() const; - uchar toByte() const; - uint toUInt() const; - long long toLongLong() const; - bool toBool() const; - IntPair toIntPair() const; - StringList toStringList() const; - ByteVectorList toByteVectorList() const; - CoverArtList toCoverArtList() const; - - bool isValid() const; - - private: - class ItemPrivate; - ItemPrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/mp4/mp4properties.cpp b/src/taglib/taglib/mp4/mp4properties.cpp deleted file mode 100644 index 5a41c08..0000000 --- a/src/taglib/taglib/mp4/mp4properties.cpp +++ /dev/null @@ -1,199 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include "mp4file.h" -#include "mp4atom.h" -#include "mp4properties.h" - -using namespace TagLib; - -class MP4::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), bitsPerSample(0), encrypted(false), codec(MP4::Properties::Unknown) {} - - int length; - int bitrate; - int sampleRate; - int channels; - int bitsPerSample; - bool encrypted; - Codec codec; -}; - -MP4::Properties::Properties(File *file, MP4::Atoms *atoms, ReadStyle style) - : AudioProperties(style) -{ - d = new PropertiesPrivate; - - MP4::Atom *moov = atoms->find("moov"); - if(!moov) { - debug("MP4: Atom 'moov' not found"); - return; - } - - MP4::Atom *trak = 0; - ByteVector data; - - MP4::AtomList trakList = moov->findall("trak"); - for (unsigned int i = 0; i < trakList.size(); i++) { - trak = trakList[i]; - MP4::Atom *hdlr = trak->find("mdia", "hdlr"); - if(!hdlr) { - debug("MP4: Atom 'trak.mdia.hdlr' not found"); - return; - } - file->seek(hdlr->offset); - data = file->readBlock(hdlr->length); - if(data.mid(16, 4) == "soun") { - break; - } - trak = 0; - } - if (!trak) { - debug("MP4: No audio tracks"); - return; - } - - MP4::Atom *mdhd = trak->find("mdia", "mdhd"); - if(!mdhd) { - debug("MP4: Atom 'trak.mdia.mdhd' not found"); - return; - } - - file->seek(mdhd->offset); - data = file->readBlock(mdhd->length); - uint version = data[8]; - if(version == 1) { - if (data.size() < 36 + 8) { - debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected"); - return; - } - const long long unit = data.toLongLong(28U); - const long long length = data.toLongLong(36U); - d->length = unit ? int(length / unit) : 0; - } - else { - if (data.size() < 24 + 4) { - debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected"); - return; - } - const unsigned int unit = data.toUInt(20U); - const unsigned int length = data.toUInt(24U); - d->length = unit ? length / unit : 0; - } - - MP4::Atom *atom = trak->find("mdia", "minf", "stbl", "stsd"); - if(!atom) { - return; - } - - file->seek(atom->offset); - data = file->readBlock(atom->length); - if(data.mid(20, 4) == "mp4a") { - d->codec = AAC; - d->channels = data.toShort(40U); - d->bitsPerSample = data.toShort(42U); - d->sampleRate = data.toUInt(46U); - if(data.mid(56, 4) == "esds" && data[64] == 0x03) { - uint pos = 65; - if(data.mid(pos, 3) == "\x80\x80\x80") { - pos += 3; - } - pos += 4; - if(data[pos] == 0x04) { - pos += 1; - if(data.mid(pos, 3) == "\x80\x80\x80") { - pos += 3; - } - pos += 10; - d->bitrate = (data.toUInt(pos) + 500) / 1000; - } - } - } - else if (data.mid(20, 4) == "alac") { - if (atom->length == 88 && data.mid(56, 4) == "alac") { - d->codec = ALAC; - d->bitsPerSample = data.at(69); - d->channels = data.at(73); - d->bitrate = data.toUInt(80U) / 1000; - d->sampleRate = data.toUInt(84U); - } - } - - MP4::Atom *drms = atom->find("drms"); - if(drms) { - d->encrypted = true; - } -} - -MP4::Properties::~Properties() -{ - delete d; -} - -int -MP4::Properties::channels() const -{ - return d->channels; -} - -int -MP4::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int -MP4::Properties::length() const -{ - return d->length; -} - -int -MP4::Properties::bitrate() const -{ - return d->bitrate; -} - -int -MP4::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -bool -MP4::Properties::isEncrypted() const -{ - return d->encrypted; -} - -MP4::Properties::Codec MP4::Properties::codec() const -{ - return d->codec; -} - diff --git a/src/taglib/taglib/mp4/mp4properties.h b/src/taglib/taglib/mp4/mp4properties.h deleted file mode 100644 index 2607c36..0000000 --- a/src/taglib/taglib/mp4/mp4properties.h +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4PROPERTIES_H -#define TAGLIB_MP4PROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace MP4 { - - class Atoms; - class File; - - //! An implementation of MP4 audio properties - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - enum Codec { - Unknown = 0, - AAC, - ALAC - }; - - Properties(File *file, Atoms *atoms, ReadStyle style = Average); - virtual ~Properties(); - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - virtual int bitsPerSample() const; - bool isEncrypted() const; - - //! Audio codec used in the MP4 file - Codec codec() const; - - private: - class PropertiesPrivate; - PropertiesPrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/mp4/mp4tag.cpp b/src/taglib/taglib/mp4/mp4tag.cpp deleted file mode 100644 index bbe3301..0000000 --- a/src/taglib/taglib/mp4/mp4tag.cpp +++ /dev/null @@ -1,917 +0,0 @@ -/************************************************************************** - copyright : (C) 2007,2011 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include <tpropertymap.h> -#include "mp4atom.h" -#include "mp4tag.h" -#include "id3v1genres.h" - -using namespace TagLib; - -class MP4::Tag::TagPrivate -{ -public: - TagPrivate() : file(0), atoms(0) {} - ~TagPrivate() {} - TagLib::File *file; - Atoms *atoms; - ItemListMap items; -}; - -MP4::Tag::Tag() -{ - d = new TagPrivate; -} - -MP4::Tag::Tag(TagLib::File *file, MP4::Atoms *atoms) -{ - d = new TagPrivate; - d->file = file; - d->atoms = atoms; - - MP4::Atom *ilst = atoms->find("moov", "udta", "meta", "ilst"); - if(!ilst) { - //debug("Atom moov.udta.meta.ilst not found."); - return; - } - - for(unsigned int i = 0; i < ilst->children.size(); i++) { - MP4::Atom *atom = ilst->children[i]; - file->seek(atom->offset + 8); - if(atom->name == "----") { - parseFreeForm(atom, file); - } - else if(atom->name == "trkn" || atom->name == "disk") { - parseIntPair(atom, file); - } - else if(atom->name == "cpil" || atom->name == "pgap" || atom->name == "pcst" || - atom->name == "hdvd") { - parseBool(atom, file); - } - else if(atom->name == "tmpo") { - parseInt(atom, file); - } - else if(atom->name == "tvsn" || atom->name == "tves" || atom->name == "cnID" || - atom->name == "sfID" || atom->name == "atID" || atom->name == "geID") { - parseUInt(atom, file); - } - else if(atom->name == "plID") { - parseLongLong(atom, file); - } - else if(atom->name == "stik" || atom->name == "rtng" || atom->name == "akID") { - parseByte(atom, file); - } - else if(atom->name == "gnre") { - parseGnre(atom, file); - } - else if(atom->name == "covr") { - parseCovr(atom, file); - } - else { - parseText(atom, file); - } - } -} - -MP4::Tag::~Tag() -{ - delete d; -} - -MP4::AtomDataList -MP4::Tag::parseData2(MP4::Atom *atom, TagLib::File *file, int expectedFlags, bool freeForm) -{ - AtomDataList result; - ByteVector data = file->readBlock(atom->length - 8); - int i = 0; - unsigned int pos = 0; - while(pos < data.size()) { - const int length = static_cast<int>(data.toUInt(pos)); - ByteVector name = data.mid(pos + 4, 4); - const int flags = static_cast<int>(data.toUInt(pos + 8)); - if(freeForm && i < 2) { - if(i == 0 && name != "mean") { - debug("MP4: Unexpected atom \"" + name + "\", expecting \"mean\""); - return result; - } - else if(i == 1 && name != "name") { - debug("MP4: Unexpected atom \"" + name + "\", expecting \"name\""); - return result; - } - result.append(AtomData(AtomDataType(flags), data.mid(pos + 12, length - 12))); - } - else { - if(name != "data") { - debug("MP4: Unexpected atom \"" + name + "\", expecting \"data\""); - return result; - } - if(expectedFlags == -1 || flags == expectedFlags) { - result.append(AtomData(AtomDataType(flags), data.mid(pos + 16, length - 16))); - } - } - pos += length; - i++; - } - return result; -} - -ByteVectorList -MP4::Tag::parseData(MP4::Atom *atom, TagLib::File *file, int expectedFlags, bool freeForm) -{ - AtomDataList data = parseData2(atom, file, expectedFlags, freeForm); - ByteVectorList result; - for(uint i = 0; i < data.size(); i++) { - result.append(data[i].data); - } - return result; -} - -void -MP4::Tag::parseInt(MP4::Atom *atom, TagLib::File *file) -{ - ByteVectorList data = parseData(atom, file); - if(data.size()) { - addItem(atom->name, (int)data[0].toShort()); - } -} - -void -MP4::Tag::parseUInt(MP4::Atom *atom, TagLib::File *file) -{ - ByteVectorList data = parseData(atom, file); - if(data.size()) { - addItem(atom->name, data[0].toUInt()); - } -} - -void -MP4::Tag::parseLongLong(MP4::Atom *atom, TagLib::File *file) -{ - ByteVectorList data = parseData(atom, file); - if(data.size()) { - addItem(atom->name, data[0].toLongLong()); - } -} - -void -MP4::Tag::parseByte(MP4::Atom *atom, TagLib::File *file) -{ - ByteVectorList data = parseData(atom, file); - if(data.size()) { - addItem(atom->name, (uchar)data[0].at(0)); - } -} - -void -MP4::Tag::parseGnre(MP4::Atom *atom, TagLib::File *file) -{ - ByteVectorList data = parseData(atom, file); - if(data.size()) { - int idx = (int)data[0].toShort(); - if(idx > 0) { - addItem("\251gen", StringList(ID3v1::genre(idx - 1))); - } - } -} - -void -MP4::Tag::parseIntPair(MP4::Atom *atom, TagLib::File *file) -{ - ByteVectorList data = parseData(atom, file); - if(data.size()) { - const int a = data[0].toShort(2U); - const int b = data[0].toShort(4U); - addItem(atom->name, MP4::Item(a, b)); - } -} - -void -MP4::Tag::parseBool(MP4::Atom *atom, TagLib::File *file) -{ - ByteVectorList data = parseData(atom, file); - if(data.size()) { - bool value = data[0].size() ? data[0][0] != '\0' : false; - addItem(atom->name, value); - } -} - -void -MP4::Tag::parseText(MP4::Atom *atom, TagLib::File *file, int expectedFlags) -{ - ByteVectorList data = parseData(atom, file, expectedFlags); - if(data.size()) { - StringList value; - for(unsigned int i = 0; i < data.size(); i++) { - value.append(String(data[i], String::UTF8)); - } - addItem(atom->name, value); - } -} - -void -MP4::Tag::parseFreeForm(MP4::Atom *atom, TagLib::File *file) -{ - AtomDataList data = parseData2(atom, file, -1, true); - if(data.size() > 2) { - String name = "----:" + String(data[0].data, String::UTF8) + ':' + String(data[1].data, String::UTF8); - AtomDataType type = data[2].type; - for(uint i = 2; i < data.size(); i++) { - if(data[i].type != type) { - debug("MP4: We currently don't support values with multiple types"); - break; - } - } - if(type == TypeUTF8) { - StringList value; - for(uint i = 2; i < data.size(); i++) { - value.append(String(data[i].data, String::UTF8)); - } - Item item(value); - item.setAtomDataType(type); - addItem(name, item); - } - else { - ByteVectorList value; - for(uint i = 2; i < data.size(); i++) { - value.append(data[i].data); - } - Item item(value); - item.setAtomDataType(type); - addItem(name, item); - } - } -} - -void -MP4::Tag::parseCovr(MP4::Atom *atom, TagLib::File *file) -{ - MP4::CoverArtList value; - ByteVector data = file->readBlock(atom->length - 8); - unsigned int pos = 0; - while(pos < data.size()) { - const int length = static_cast<int>(data.toUInt(pos)); - ByteVector name = data.mid(pos + 4, 4); - const int flags = static_cast<int>(data.toUInt(pos + 8)); - if(name != "data") { - debug("MP4: Unexpected atom \"" + name + "\", expecting \"data\""); - break; - } - if(flags == TypeJPEG || flags == TypePNG || flags == TypeBMP || flags == TypeGIF || flags == TypeImplicit) { - value.append(MP4::CoverArt(MP4::CoverArt::Format(flags), - data.mid(pos + 16, length - 16))); - } - else { - debug("MP4: Unknown covr format " + String::number(flags)); - } - pos += length; - } - if(value.size() > 0) - addItem(atom->name, value); -} - -ByteVector -MP4::Tag::padIlst(const ByteVector &data, int length) -{ - if (length == -1) { - length = ((data.size() + 1023) & ~1023) - data.size(); - } - return renderAtom("free", ByteVector(length, '\1')); -} - -ByteVector -MP4::Tag::renderAtom(const ByteVector &name, const ByteVector &data) -{ - return ByteVector::fromUInt(data.size() + 8) + name + data; -} - -ByteVector -MP4::Tag::renderData(const ByteVector &name, int flags, const ByteVectorList &data) -{ - ByteVector result; - for(unsigned int i = 0; i < data.size(); i++) { - result.append(renderAtom("data", ByteVector::fromUInt(flags) + ByteVector(4, '\0') + data[i])); - } - return renderAtom(name, result); -} - -ByteVector -MP4::Tag::renderBool(const ByteVector &name, MP4::Item &item) -{ - ByteVectorList data; - data.append(ByteVector(1, item.toBool() ? '\1' : '\0')); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderInt(const ByteVector &name, MP4::Item &item) -{ - ByteVectorList data; - data.append(ByteVector::fromShort(item.toInt())); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderUInt(const ByteVector &name, MP4::Item &item) -{ - ByteVectorList data; - data.append(ByteVector::fromUInt(item.toUInt())); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderLongLong(const ByteVector &name, MP4::Item &item) -{ - ByteVectorList data; - data.append(ByteVector::fromLongLong(item.toLongLong())); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderByte(const ByteVector &name, MP4::Item &item) -{ - ByteVectorList data; - data.append(ByteVector(1, item.toByte())); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderIntPair(const ByteVector &name, MP4::Item &item) -{ - ByteVectorList data; - data.append(ByteVector(2, '\0') + - ByteVector::fromShort(item.toIntPair().first) + - ByteVector::fromShort(item.toIntPair().second) + - ByteVector(2, '\0')); - return renderData(name, TypeImplicit, data); -} - -ByteVector -MP4::Tag::renderIntPairNoTrailing(const ByteVector &name, MP4::Item &item) -{ - ByteVectorList data; - data.append(ByteVector(2, '\0') + - ByteVector::fromShort(item.toIntPair().first) + - ByteVector::fromShort(item.toIntPair().second)); - return renderData(name, TypeImplicit, data); -} - -ByteVector -MP4::Tag::renderText(const ByteVector &name, MP4::Item &item, int flags) -{ - ByteVectorList data; - StringList value = item.toStringList(); - for(unsigned int i = 0; i < value.size(); i++) { - data.append(value[i].data(String::UTF8)); - } - return renderData(name, flags, data); -} - -ByteVector -MP4::Tag::renderCovr(const ByteVector &name, MP4::Item &item) -{ - ByteVector data; - MP4::CoverArtList value = item.toCoverArtList(); - for(unsigned int i = 0; i < value.size(); i++) { - data.append(renderAtom("data", ByteVector::fromUInt(value[i].format()) + - ByteVector(4, '\0') + value[i].data())); - } - return renderAtom(name, data); -} - -ByteVector -MP4::Tag::renderFreeForm(const String &name, MP4::Item &item) -{ - StringList header = StringList::split(name, ":"); - if (header.size() != 3) { - debug("MP4: Invalid free-form item name \"" + name + "\""); - return ByteVector::null; - } - ByteVector data; - data.append(renderAtom("mean", ByteVector::fromUInt(0) + header[1].data(String::UTF8))); - data.append(renderAtom("name", ByteVector::fromUInt(0) + header[2].data(String::UTF8))); - AtomDataType type = item.atomDataType(); - if(type == TypeUndefined) { - if(!item.toStringList().isEmpty()) { - type = TypeUTF8; - } - else { - type = TypeImplicit; - } - } - if(type == TypeUTF8) { - StringList value = item.toStringList(); - for(unsigned int i = 0; i < value.size(); i++) { - data.append(renderAtom("data", ByteVector::fromUInt(type) + ByteVector(4, '\0') + value[i].data(String::UTF8))); - } - } - else { - ByteVectorList value = item.toByteVectorList(); - for(unsigned int i = 0; i < value.size(); i++) { - data.append(renderAtom("data", ByteVector::fromUInt(type) + ByteVector(4, '\0') + value[i])); - } - } - return renderAtom("----", data); -} - -bool -MP4::Tag::save() -{ - ByteVector data; - for(MP4::ItemListMap::Iterator i = d->items.begin(); i != d->items.end(); i++) { - const String name = i->first; - if(name.startsWith("----")) { - data.append(renderFreeForm(name, i->second)); - } - else if(name == "trkn") { - data.append(renderIntPair(name.data(String::Latin1), i->second)); - } - else if(name == "disk") { - data.append(renderIntPairNoTrailing(name.data(String::Latin1), i->second)); - } - else if(name == "cpil" || name == "pgap" || name == "pcst" || name == "hdvd") { - data.append(renderBool(name.data(String::Latin1), i->second)); - } - else if(name == "tmpo") { - data.append(renderInt(name.data(String::Latin1), i->second)); - } - else if(name == "tvsn" || name == "tves" || name == "cnID" || - name == "sfID" || name == "atID" || name == "geID") { - data.append(renderUInt(name.data(String::Latin1), i->second)); - } - else if(name == "plID") { - data.append(renderLongLong(name.data(String::Latin1), i->second)); - } - else if(name == "stik" || name == "rtng" || name == "akID") { - data.append(renderByte(name.data(String::Latin1), i->second)); - } - else if(name == "covr") { - data.append(renderCovr(name.data(String::Latin1), i->second)); - } - else if(name.size() == 4){ - data.append(renderText(name.data(String::Latin1), i->second)); - } - else { - debug("MP4: Unknown item name \"" + name + "\""); - } - } - data = renderAtom("ilst", data); - - AtomList path = d->atoms->path("moov", "udta", "meta", "ilst"); - if(path.size() == 4) { - saveExisting(data, path); - } - else { - saveNew(data); - } - - return true; -} - -void -MP4::Tag::updateParents(AtomList &path, long delta, int ignore) -{ - for(unsigned int i = 0; i < path.size() - ignore; i++) { - d->file->seek(path[i]->offset); - long size = d->file->readBlock(4).toUInt(); - // 64-bit - if (size == 1) { - d->file->seek(4, File::Current); // Skip name - long long longSize = d->file->readBlock(8).toLongLong(); - // Seek the offset of the 64-bit size - d->file->seek(path[i]->offset + 8); - d->file->writeBlock(ByteVector::fromLongLong(longSize + delta)); - } - // 32-bit - else { - d->file->seek(path[i]->offset); - d->file->writeBlock(ByteVector::fromUInt(size + delta)); - } - } -} - -void -MP4::Tag::updateOffsets(long delta, long offset) -{ - MP4::Atom *moov = d->atoms->find("moov"); - if(moov) { - MP4::AtomList stco = moov->findall("stco", true); - for(unsigned int i = 0; i < stco.size(); i++) { - MP4::Atom *atom = stco[i]; - if(atom->offset > offset) { - atom->offset += delta; - } - d->file->seek(atom->offset + 12); - ByteVector data = d->file->readBlock(atom->length - 12); - unsigned int count = data.toUInt(); - d->file->seek(atom->offset + 16); - uint pos = 4; - while(count--) { - long o = static_cast<long>(data.toUInt(pos)); - if(o > offset) { - o += delta; - } - d->file->writeBlock(ByteVector::fromUInt(o)); - pos += 4; - } - } - - MP4::AtomList co64 = moov->findall("co64", true); - for(unsigned int i = 0; i < co64.size(); i++) { - MP4::Atom *atom = co64[i]; - if(atom->offset > offset) { - atom->offset += delta; - } - d->file->seek(atom->offset + 12); - ByteVector data = d->file->readBlock(atom->length - 12); - unsigned int count = data.toUInt(); - d->file->seek(atom->offset + 16); - uint pos = 4; - while(count--) { - long long o = data.toLongLong(pos); - if(o > offset) { - o += delta; - } - d->file->writeBlock(ByteVector::fromLongLong(o)); - pos += 8; - } - } - } - - MP4::Atom *moof = d->atoms->find("moof"); - if(moof) { - MP4::AtomList tfhd = moof->findall("tfhd", true); - for(unsigned int i = 0; i < tfhd.size(); i++) { - MP4::Atom *atom = tfhd[i]; - if(atom->offset > offset) { - atom->offset += delta; - } - d->file->seek(atom->offset + 9); - ByteVector data = d->file->readBlock(atom->length - 9); - const unsigned int flags = data.toUInt(0, 3, true); - if(flags & 1) { - long long o = data.toLongLong(7U); - if(o > offset) { - o += delta; - } - d->file->seek(atom->offset + 16); - d->file->writeBlock(ByteVector::fromLongLong(o)); - } - } - } -} - -void -MP4::Tag::saveNew(ByteVector &data) -{ - data = renderAtom("meta", TagLib::ByteVector(4, '\0') + - renderAtom("hdlr", TagLib::ByteVector(8, '\0') + TagLib::ByteVector("mdirappl") + TagLib::ByteVector(9, '\0')) + - data + padIlst(data)); - - AtomList path = d->atoms->path("moov", "udta"); - if(path.size() != 2) { - path = d->atoms->path("moov"); - data = renderAtom("udta", data); - } - - long offset = path[path.size() - 1]->offset + 8; - d->file->insert(data, offset, 0); - - updateParents(path, data.size()); - updateOffsets(data.size(), offset); -} - -void -MP4::Tag::saveExisting(ByteVector &data, AtomList &path) -{ - MP4::Atom *ilst = path[path.size() - 1]; - long offset = ilst->offset; - long length = ilst->length; - - MP4::Atom *meta = path[path.size() - 2]; - AtomList::Iterator index = meta->children.find(ilst); - - // check if there is an atom before 'ilst', and possibly use it as padding - if(index != meta->children.begin()) { - AtomList::Iterator prevIndex = index; - prevIndex--; - MP4::Atom *prev = *prevIndex; - if(prev->name == "free") { - offset = prev->offset; - length += prev->length; - } - } - // check if there is an atom after 'ilst', and possibly use it as padding - AtomList::Iterator nextIndex = index; - nextIndex++; - if(nextIndex != meta->children.end()) { - MP4::Atom *next = *nextIndex; - if(next->name == "free") { - length += next->length; - } - } - - long delta = data.size() - length; - if(delta > 0 || (delta < 0 && delta > -8)) { - data.append(padIlst(data)); - delta = data.size() - length; - } - else if(delta < 0) { - data.append(padIlst(data, -delta - 8)); - delta = 0; - } - - d->file->insert(data, offset, length); - - if(delta) { - updateParents(path, delta, 1); - updateOffsets(delta, offset); - } -} - -String -MP4::Tag::title() const -{ - if(d->items.contains("\251nam")) - return d->items["\251nam"].toStringList().toString(", "); - return String::null; -} - -String -MP4::Tag::artist() const -{ - if(d->items.contains("\251ART")) - return d->items["\251ART"].toStringList().toString(", "); - return String::null; -} - -String -MP4::Tag::album() const -{ - if(d->items.contains("\251alb")) - return d->items["\251alb"].toStringList().toString(", "); - return String::null; -} - -String -MP4::Tag::comment() const -{ - if(d->items.contains("\251cmt")) - return d->items["\251cmt"].toStringList().toString(", "); - return String::null; -} - -String -MP4::Tag::genre() const -{ - if(d->items.contains("\251gen")) - return d->items["\251gen"].toStringList().toString(", "); - return String::null; -} - -unsigned int -MP4::Tag::year() const -{ - if(d->items.contains("\251day")) - return d->items["\251day"].toStringList().toString().toInt(); - return 0; -} - -unsigned int -MP4::Tag::track() const -{ - if(d->items.contains("trkn")) - return d->items["trkn"].toIntPair().first; - return 0; -} - -void -MP4::Tag::setTitle(const String &value) -{ - d->items["\251nam"] = StringList(value); -} - -void -MP4::Tag::setArtist(const String &value) -{ - d->items["\251ART"] = StringList(value); -} - -void -MP4::Tag::setAlbum(const String &value) -{ - d->items["\251alb"] = StringList(value); -} - -void -MP4::Tag::setComment(const String &value) -{ - d->items["\251cmt"] = StringList(value); -} - -void -MP4::Tag::setGenre(const String &value) -{ - d->items["\251gen"] = StringList(value); -} - -void -MP4::Tag::setYear(uint value) -{ - d->items["\251day"] = StringList(String::number(value)); -} - -void -MP4::Tag::setTrack(uint value) -{ - d->items["trkn"] = MP4::Item(value, 0); -} - -MP4::ItemListMap & -MP4::Tag::itemListMap() -{ - return d->items; -} - -static const char *keyTranslation[][2] = { - { "\251nam", "TITLE" }, - { "\251ART", "ARTIST" }, - { "\251alb", "ALBUM" }, - { "\251cmt", "COMMENT" }, - { "\251gen", "GENRE" }, - { "\251day", "DATE" }, - { "\251wrt", "COMPOSER" }, - { "\251grp", "GROUPING" }, - { "trkn", "TRACKNUMBER" }, - { "disk", "DISCNUMBER" }, - { "cpil", "COMPILATION" }, - { "tmpo", "BPM" }, - { "cprt", "COPYRIGHT" }, - { "\251lyr", "LYRICS" }, - { "\251too", "ENCODEDBY" }, - { "soal", "ALBUMSORT" }, - { "soaa", "ALBUMARTISTSORT" }, - { "soar", "ARTISTSORT" }, - { "sonm", "TITLESORT" }, - { "soco", "COMPOSERSORT" }, - { "sosn", "SHOWSORT" }, - { "----:com.apple.iTunes:MusicBrainz Track Id", "MUSICBRAINZ_TRACKID" }, - { "----:com.apple.iTunes:MusicBrainz Artist Id", "MUSICBRAINZ_ARTISTID" }, - { "----:com.apple.iTunes:MusicBrainz Album Id", "MUSICBRAINZ_ALBUMID" }, - { "----:com.apple.iTunes:MusicBrainz Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID" }, - { "----:com.apple.iTunes:MusicBrainz Release Group Id", "MUSICBRAINZ_RELEASEGROUPID" }, - { "----:com.apple.iTunes:MusicBrainz Work Id", "MUSICBRAINZ_WORKID" }, - { "----:com.apple.iTunes:ASIN", "ASIN" }, - { "----:com.apple.iTunes:LABEL", "LABEL" }, - { "----:com.apple.iTunes:LYRICIST", "LYRICIST" }, - { "----:com.apple.iTunes:CONDUCTOR", "CONDUCTOR" }, - { "----:com.apple.iTunes:REMIXER", "REMIXER" }, - { "----:com.apple.iTunes:ENGINEER", "ENGINEER" }, - { "----:com.apple.iTunes:PRODUCER", "PRODUCER" }, - { "----:com.apple.iTunes:DJMIXER", "DJMIXER" }, - { "----:com.apple.iTunes:MIXER", "MIXER" }, - { "----:com.apple.iTunes:SUBTITLE", "SUBTITLE" }, - { "----:com.apple.iTunes:DISCSUBTITLE", "DISCSUBTITLE" }, - { "----:com.apple.iTunes:MOOD", "MOOD" }, - { "----:com.apple.iTunes:ISRC", "ISRC" }, - { "----:com.apple.iTunes:CATALOGNUMBER", "CATALOGNUMBER" }, - { "----:com.apple.iTunes:BARCODE", "BARCODE" }, - { "----:com.apple.iTunes:SCRIPT", "SCRIPT" }, - { "----:com.apple.iTunes:LANGUAGE", "LANGUAGE" }, - { "----:com.apple.iTunes:LICENSE", "LICENSE" }, - { "----:com.apple.iTunes:MEDIA", "MEDIA" }, -}; - -PropertyMap MP4::Tag::properties() const -{ - static Map<String, String> keyMap; - if(keyMap.isEmpty()) { - int numKeys = sizeof(keyTranslation) / sizeof(keyTranslation[0]); - for(int i = 0; i < numKeys; i++) { - keyMap[keyTranslation[i][0]] = keyTranslation[i][1]; - } - } - - PropertyMap props; - MP4::ItemListMap::ConstIterator it = d->items.begin(); - for(; it != d->items.end(); ++it) { - if(keyMap.contains(it->first)) { - String key = keyMap[it->first]; - if(key == "TRACKNUMBER" || key == "DISCNUMBER") { - MP4::Item::IntPair ip = it->second.toIntPair(); - String value = String::number(ip.first); - if(ip.second) { - value += "/" + String::number(ip.second); - } - props[key] = value; - } - else if(key == "BPM") { - props[key] = String::number(it->second.toInt()); - } - else if(key == "COMPILATION") { - props[key] = String::number(it->second.toBool()); - } - else { - props[key] = it->second.toStringList(); - } - } - else { - props.unsupportedData().append(it->first); - } - } - return props; -} - -void MP4::Tag::removeUnsupportedProperties(const StringList &props) -{ - StringList::ConstIterator it = props.begin(); - for(; it != props.end(); ++it) - d->items.erase(*it); -} - -PropertyMap MP4::Tag::setProperties(const PropertyMap &props) -{ - static Map<String, String> reverseKeyMap; - if(reverseKeyMap.isEmpty()) { - int numKeys = sizeof(keyTranslation) / sizeof(keyTranslation[0]); - for(int i = 0; i < numKeys; i++) { - reverseKeyMap[keyTranslation[i][1]] = keyTranslation[i][0]; - } - } - - PropertyMap origProps = properties(); - PropertyMap::ConstIterator it = origProps.begin(); - for(; it != origProps.end(); ++it) { - if(!props.contains(it->first) || props[it->first].isEmpty()) { - d->items.erase(reverseKeyMap[it->first]); - } - } - - PropertyMap ignoredProps; - it = props.begin(); - for(; it != props.end(); ++it) { - if(reverseKeyMap.contains(it->first)) { - String name = reverseKeyMap[it->first]; - if(it->first == "TRACKNUMBER" || it->first == "DISCNUMBER") { - int first = 0, second = 0; - StringList parts = StringList::split(it->second.front(), "/"); - if(parts.size() > 0) { - first = parts[0].toInt(); - if(parts.size() > 1) { - second = parts[1].toInt(); - } - d->items[name] = MP4::Item(first, second); - } - } - else if(it->first == "BPM") { - int value = it->second.front().toInt(); - d->items[name] = MP4::Item(value); - } - else if(it->first == "COMPILATION") { - bool value = (it->second.front().toInt() != 0); - d->items[name] = MP4::Item(value); - } - else { - d->items[name] = it->second; - } - } - else { - ignoredProps.insert(it->first, it->second); - } - } - - return ignoredProps; -} - -void MP4::Tag::addItem(const String &name, const Item &value) -{ - if(!d->items.contains(name)) { - d->items.insert(name, value); - } - else { - debug("MP4: Ignoring duplicate atom \"" + name + "\""); - } -} diff --git a/src/taglib/taglib/mp4/mp4tag.h b/src/taglib/taglib/mp4/mp4tag.h deleted file mode 100644 index 48d71fc..0000000 --- a/src/taglib/taglib/mp4/mp4tag.h +++ /dev/null @@ -1,118 +0,0 @@ -/************************************************************************** - copyright : (C) 2007,2011 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4TAG_H -#define TAGLIB_MP4TAG_H - -#include "tag.h" -#include "tbytevectorlist.h" -#include "tfile.h" -#include "tmap.h" -#include "tstringlist.h" -#include "taglib_export.h" -#include "mp4atom.h" -#include "mp4item.h" - -namespace TagLib { - - namespace MP4 { - - typedef TagLib::Map<String, Item> ItemListMap; - - class TAGLIB_EXPORT Tag: public TagLib::Tag - { - public: - Tag(); - Tag(TagLib::File *file, Atoms *atoms); - ~Tag(); - bool save(); - - String title() const; - String artist() const; - String album() const; - String comment() const; - String genre() const; - uint year() const; - uint track() const; - - void setTitle(const String &value); - void setArtist(const String &value); - void setAlbum(const String &value); - void setComment(const String &value); - void setGenre(const String &value); - void setYear(uint value); - void setTrack(uint value); - - ItemListMap &itemListMap(); - - PropertyMap properties() const; - void removeUnsupportedProperties(const StringList& properties); - PropertyMap setProperties(const PropertyMap &properties); - - private: - AtomDataList parseData2(Atom *atom, TagLib::File *file, int expectedFlags = -1, bool freeForm = false); - TagLib::ByteVectorList parseData(Atom *atom, TagLib::File *file, int expectedFlags = -1, bool freeForm = false); - void parseText(Atom *atom, TagLib::File *file, int expectedFlags = 1); - void parseFreeForm(Atom *atom, TagLib::File *file); - void parseInt(Atom *atom, TagLib::File *file); - void parseByte(Atom *atom, TagLib::File *file); - void parseUInt(Atom *atom, TagLib::File *file); - void parseLongLong(Atom *atom, TagLib::File *file); - void parseGnre(Atom *atom, TagLib::File *file); - void parseIntPair(Atom *atom, TagLib::File *file); - void parseBool(Atom *atom, TagLib::File *file); - void parseCovr(Atom *atom, TagLib::File *file); - - TagLib::ByteVector padIlst(const ByteVector &data, int length = -1); - TagLib::ByteVector renderAtom(const ByteVector &name, const TagLib::ByteVector &data); - TagLib::ByteVector renderData(const ByteVector &name, int flags, const TagLib::ByteVectorList &data); - TagLib::ByteVector renderText(const ByteVector &name, Item &item, int flags = TypeUTF8); - TagLib::ByteVector renderFreeForm(const String &name, Item &item); - TagLib::ByteVector renderBool(const ByteVector &name, Item &item); - TagLib::ByteVector renderInt(const ByteVector &name, Item &item); - TagLib::ByteVector renderByte(const ByteVector &name, Item &item); - TagLib::ByteVector renderUInt(const ByteVector &name, Item &item); - TagLib::ByteVector renderLongLong(const ByteVector &name, Item &item); - TagLib::ByteVector renderIntPair(const ByteVector &name, Item &item); - TagLib::ByteVector renderIntPairNoTrailing(const ByteVector &name, Item &item); - TagLib::ByteVector renderCovr(const ByteVector &name, Item &item); - - void updateParents(AtomList &path, long delta, int ignore = 0); - void updateOffsets(long delta, long offset); - - void saveNew(TagLib::ByteVector &data); - void saveExisting(TagLib::ByteVector &data, AtomList &path); - - void addItem(const String &name, const Item &value); - - class TagPrivate; - TagPrivate *d; - }; - - } - -} - -#endif diff --git a/src/taglib/taglib/mpc/mpcfile.cpp b/src/taglib/taglib/mpc/mpcfile.cpp deleted file mode 100644 index 979c035..0000000 --- a/src/taglib/taglib/mpc/mpcfile.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tagunion.h> -#include <tdebug.h> -#include <tpropertymap.h> - -#include "mpcfile.h" -#include "id3v1tag.h" -#include "id3v2header.h" -#include "apetag.h" -#include "apefooter.h" - -using namespace TagLib; - -namespace -{ - enum { MPCAPEIndex = 0, MPCID3v1Index = 1 }; -} - -class MPC::File::FilePrivate -{ -public: - FilePrivate() : - APELocation(-1), - APESize(0), - ID3v1Location(-1), - ID3v2Header(0), - ID3v2Location(-1), - ID3v2Size(0), - properties(0), - scanned(false), - hasAPE(false), - hasID3v1(false), - hasID3v2(false) {} - - ~FilePrivate() - { - delete ID3v2Header; - delete properties; - } - - long APELocation; - uint APESize; - - long ID3v1Location; - - ID3v2::Header *ID3v2Header; - long ID3v2Location; - uint ID3v2Size; - - TagUnion tag; - - Properties *properties; - bool scanned; - - // These indicate whether the file *on disk* has these tags, not if - // this data structure does. This is used in computing offsets. - - bool hasAPE; - bool hasID3v1; - bool hasID3v2; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPC::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -MPC::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -MPC::File::~File() -{ - delete d; -} - -TagLib::Tag *MPC::File::tag() const -{ - return &d->tag; -} - -PropertyMap MPC::File::properties() const -{ - if(d->hasAPE) - return d->tag.access<APE::Tag>(MPCAPEIndex, false)->properties(); - if(d->hasID3v1) - return d->tag.access<ID3v1::Tag>(MPCID3v1Index, false)->properties(); - return PropertyMap(); -} - -void MPC::File::removeUnsupportedProperties(const StringList &properties) -{ - if(d->hasAPE) - d->tag.access<APE::Tag>(MPCAPEIndex, false)->removeUnsupportedProperties(properties); - if(d->hasID3v1) - d->tag.access<ID3v1::Tag>(MPCID3v1Index, false)->removeUnsupportedProperties(properties); -} - -PropertyMap MPC::File::setProperties(const PropertyMap &properties) -{ - if(d->hasID3v1) - d->tag.access<APE::Tag>(MPCID3v1Index, false)->setProperties(properties); - return d->tag.access<APE::Tag>(MPCAPEIndex, true)->setProperties(properties); -} - -MPC::Properties *MPC::File::audioProperties() const -{ - return d->properties; -} - -bool MPC::File::save() -{ - if(readOnly()) { - debug("MPC::File::save() -- File is read only."); - return false; - } - - // Possibly strip ID3v2 tag - - if(d->hasID3v2 && !d->ID3v2Header) { - removeBlock(d->ID3v2Location, d->ID3v2Size); - d->hasID3v2 = false; - if(d->hasID3v1) - d->ID3v1Location -= d->ID3v2Size; - if(d->hasAPE) - d->APELocation -= d->ID3v2Size; - } - - // Update ID3v1 tag - - if(ID3v1Tag()) { - if(d->hasID3v1) { - seek(d->ID3v1Location); - writeBlock(ID3v1Tag()->render()); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - writeBlock(ID3v1Tag()->render()); - d->hasID3v1 = true; - } - } else - if(d->hasID3v1) { - removeBlock(d->ID3v1Location, 128); - d->hasID3v1 = false; - if(d->hasAPE) { - if(d->APELocation > d->ID3v1Location) - d->APELocation -= 128; - } - } - - // Update APE tag - - if(APETag()) { - if(d->hasAPE) - insert(APETag()->render(), d->APELocation, d->APESize); - else { - if(d->hasID3v1) { - insert(APETag()->render(), d->ID3v1Location, 0); - d->APESize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - d->APELocation = d->ID3v1Location; - d->ID3v1Location += d->APESize; - } - else { - seek(0, End); - d->APELocation = tell(); - writeBlock(APETag()->render()); - d->APESize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - } - } - } - else - if(d->hasAPE) { - removeBlock(d->APELocation, d->APESize); - d->hasAPE = false; - if(d->hasID3v1) { - if(d->ID3v1Location > d->APELocation) - d->ID3v1Location -= d->APESize; - } - } - - return true; -} - -ID3v1::Tag *MPC::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(MPCID3v1Index, create); -} - -APE::Tag *MPC::File::APETag(bool create) -{ - return d->tag.access<APE::Tag>(MPCAPEIndex, create); -} - -void MPC::File::strip(int tags) -{ - if(tags & ID3v1) { - d->tag.set(MPCID3v1Index, 0); - APETag(true); - } - - if(tags & ID3v2) { - delete d->ID3v2Header; - d->ID3v2Header = 0; - } - - if(tags & APE) { - d->tag.set(MPCAPEIndex, 0); - - if(!ID3v1Tag()) - APETag(true); - } -} - -void MPC::File::remove(int tags) -{ - strip(tags); -} - -bool MPC::File::hasID3v1Tag() const -{ - return d->hasID3v1; -} - -bool MPC::File::hasAPETag() const -{ - return d->hasAPE; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPC::File::read(bool readProperties, Properties::ReadStyle /* propertiesStyle */) -{ - // Look for an ID3v1 tag - - d->ID3v1Location = findID3v1(); - - if(d->ID3v1Location >= 0) { - d->tag.set(MPCID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - d->hasID3v1 = true; - } - - // Look for an APE tag - - findAPE(); - - d->APELocation = findAPE(); - - if(d->APELocation >= 0) { - d->tag.set(MPCAPEIndex, new APE::Tag(this, d->APELocation)); - - d->APESize = APETag()->footer()->completeTagSize(); - d->APELocation = d->APELocation + APETag()->footer()->size() - d->APESize; - d->hasAPE = true; - } - - if(!d->hasID3v1) - APETag(true); - - // Look for and skip an ID3v2 tag - - d->ID3v2Location = findID3v2(); - - if(d->ID3v2Location >= 0) { - seek(d->ID3v2Location); - d->ID3v2Header = new ID3v2::Header(readBlock(ID3v2::Header::size())); - d->ID3v2Size = d->ID3v2Header->completeTagSize(); - d->hasID3v2 = true; - } - - if(d->hasID3v2) - seek(d->ID3v2Location + d->ID3v2Size); - else - seek(0); - - // Look for MPC metadata - - if(readProperties) { - d->properties = new Properties(this, length() - d->ID3v2Size - d->APESize); - } -} - -long MPC::File::findAPE() -{ - if(!isValid()) - return -1; - - if(d->hasID3v1) - seek(-160, End); - else - seek(-32, End); - - long p = tell(); - - if(readBlock(8) == APE::Tag::fileIdentifier()) - return p; - - return -1; -} - -long MPC::File::findID3v1() -{ - if(!isValid()) - return -1; - - seek(-128, End); - long p = tell(); - - if(readBlock(3) == ID3v1::Tag::fileIdentifier()) - return p; - - return -1; -} - -long MPC::File::findID3v2() -{ - if(!isValid()) - return -1; - - seek(0); - - if(readBlock(3) == ID3v2::Header::fileIdentifier()) - return 0; - - return -1; -} diff --git a/src/taglib/taglib/mpc/mpcfile.h b/src/taglib/taglib/mpc/mpcfile.h deleted file mode 100644 index 1eef810..0000000 --- a/src/taglib/taglib/mpc/mpcfile.h +++ /dev/null @@ -1,231 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPCFILE_H -#define TAGLIB_MPCFILE_H - -#include "taglib_export.h" -#include "tfile.h" -#include "tag.h" - -#include "mpcproperties.h" - -#include "tlist.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of MPC metadata - - /*! - * This is implementation of MPC metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. ID3v2 tags are invalid in MPC-files, but will be skipped - * and ignored. - */ - - namespace MPC { - - //! An implementation of TagLib::File with MPC specific methods - - /*! - * This implements and provides an interface for MPC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to MPC files. - * The only invalid tag combination supported is an ID3v1 tag after an APE tag. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches APE tags. - APE = 0x0004, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs an MPC file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an MPC file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains both an APE and an ID3v1 tag, only the APE - * tag will be converted to the PropertyMap. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * Affects only the APEv2 tag which will be created if necessary. - * If an ID3v1 tag exists, it will be updated as well. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the MPC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this returns a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. If - * there already be an ID3v1 tag, the new APE tag will be placed before it. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an APE tag. Use hasAPETag() to check if the file - * on disk actually has an APE tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasAPETag() - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \warning This will also invalidate pointers to the tags - * as their memory will be freed. - * - * \note In order to make the removal permanent save() still needs to be called. - */ - void strip(int tags = AllTags); - - /*! - * \deprecated - * \see strip - */ - void remove(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an APE tag. - * - * \see APETag() - */ - bool hasAPETag() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findAPE(); - long findID3v1(); - long findID3v2(); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpc/mpcproperties.cpp b/src/taglib/taglib/mpc/mpcproperties.cpp deleted file mode 100644 index d406f8d..0000000 --- a/src/taglib/taglib/mpc/mpcproperties.cpp +++ /dev/null @@ -1,316 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <bitset> -#include <math.h> - -#include "mpcproperties.h" -#include "mpcfile.h" - -using namespace TagLib; - -class MPC::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(long length, ReadStyle s) : - streamLength(length), - style(s), - version(0), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - totalFrames(0), - sampleFrames(0), - trackGain(0), - trackPeak(0), - albumGain(0), - albumPeak(0) {} - - long streamLength; - ReadStyle style; - int version; - int length; - int bitrate; - int sampleRate; - int channels; - uint totalFrames; - uint sampleFrames; - uint trackGain; - uint trackPeak; - uint albumGain; - uint albumPeak; - String flags; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPC::Properties::Properties(const ByteVector &data, long streamLength, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(streamLength, style); - readSV7(data); -} - -MPC::Properties::Properties(File *file, long streamLength, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(streamLength, style); - ByteVector magic = file->readBlock(4); - if(magic == "MPCK") { - // Musepack version 8 - readSV8(file); - } - else { - // Musepack version 7 or older, fixed size header - readSV7(magic + file->readBlock(MPC::HeaderSize - 4)); - } -} - -MPC::Properties::~Properties() -{ - delete d; -} - -int MPC::Properties::length() const -{ - return d->length; -} - -int MPC::Properties::bitrate() const -{ - return d->bitrate; -} - -int MPC::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int MPC::Properties::channels() const -{ - return d->channels; -} - -int MPC::Properties::mpcVersion() const -{ - return d->version; -} - -TagLib::uint MPC::Properties::totalFrames() const -{ - return d->totalFrames; -} - -TagLib::uint MPC::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -int MPC::Properties::trackGain() const -{ - return d->trackGain; -} - -int MPC::Properties::trackPeak() const -{ - return d->trackPeak; -} - -int MPC::Properties::albumGain() const -{ - return d->albumGain; -} - -int MPC::Properties::albumPeak() const -{ - return d->albumPeak; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -unsigned long readSize(File *file, TagLib::uint &sizelength) -{ - unsigned char tmp; - unsigned long size = 0; - - do { - ByteVector b = file->readBlock(1); - tmp = b[0]; - size = (size << 7) | (tmp & 0x7F); - sizelength++; - } while((tmp & 0x80)); - return size; -} - -unsigned long readSize(const ByteVector &data, TagLib::uint &sizelength) -{ - unsigned char tmp; - unsigned long size = 0; - unsigned long pos = 0; - - do { - tmp = data[pos++]; - size = (size << 7) | (tmp & 0x7F); - sizelength++; - } while((tmp & 0x80) && (pos < data.size())); - return size; -} - -static const unsigned short sftable [4] = { 44100, 48000, 37800, 32000 }; - -void MPC::Properties::readSV8(File *file) -{ - bool readSH = false, readRG = false; - - while(!readSH && !readRG) { - ByteVector packetType = file->readBlock(2); - uint packetSizeLength = 0; - unsigned long packetSize = readSize(file, packetSizeLength); - unsigned long dataSize = packetSize - 2 - packetSizeLength; - - if(packetType == "SH") { - // Stream Header - // http://trac.musepack.net/wiki/SV8Specification#StreamHeaderPacket - ByteVector data = file->readBlock(dataSize); - readSH = true; - - TagLib::uint pos = 4; - d->version = data[pos]; - pos += 1; - d->sampleFrames = readSize(data.mid(pos), pos); - ulong begSilence = readSize(data.mid(pos), pos); - - std::bitset<16> flags(TAGLIB_CONSTRUCT_BITSET(data.toUShort(pos, true))); - pos += 2; - - d->sampleRate = sftable[flags[15] * 4 + flags[14] * 2 + flags[13]]; - d->channels = flags[7] * 8 + flags[6] * 4 + flags[5] * 2 + flags[4] + 1; - - if((d->sampleFrames - begSilence) != 0) - d->bitrate = (int)(d->streamLength * 8.0 * d->sampleRate / (d->sampleFrames - begSilence)); - d->bitrate = d->bitrate / 1000; - - d->length = (d->sampleFrames - begSilence) / d->sampleRate; - } - - else if (packetType == "RG") { - // Replay Gain - // http://trac.musepack.net/wiki/SV8Specification#ReplaygainPacket - ByteVector data = file->readBlock(dataSize); - readRG = true; - - int replayGainVersion = data[0]; - if(replayGainVersion == 1) { - d->trackGain = data.toShort(1, true); - d->trackPeak = data.toShort(3, true); - d->albumGain = data.toShort(5, true); - d->albumPeak = data.toShort(7, true); - } - } - - else if(packetType == "SE") { - break; - } - - else { - file->seek(dataSize, File::Current); - } - } -} - -void MPC::Properties::readSV7(const ByteVector &data) -{ - if(data.startsWith("MP+")) { - d->version = data[3] & 15; - if(d->version < 7) - return; - - d->totalFrames = data.toUInt(4, false); - - std::bitset<32> flags(TAGLIB_CONSTRUCT_BITSET(data.toUInt(8, false))); - d->sampleRate = sftable[flags[17] * 2 + flags[16]]; - d->channels = 2; - - uint gapless = data.toUInt(5, false); - - d->trackGain = data.toShort(14, false); - d->trackPeak = data.toShort(12, false); - d->albumGain = data.toShort(18, false); - d->albumPeak = data.toShort(16, false); - - // convert gain info - if(d->trackGain != 0) { - int tmp = (int)((64.82 - (short)d->trackGain / 100.) * 256. + .5); - if(tmp >= (1 << 16) || tmp < 0) tmp = 0; - d->trackGain = tmp; - } - - if(d->albumGain != 0) { - int tmp = (int)((64.82 - d->albumGain / 100.) * 256. + .5); - if(tmp >= (1 << 16) || tmp < 0) tmp = 0; - d->albumGain = tmp; - } - - if (d->trackPeak != 0) - d->trackPeak = (int)(log10((double)d->trackPeak) * 20 * 256 + .5); - - if (d->albumPeak != 0) - d->albumPeak = (int)(log10((double)d->albumPeak) * 20 * 256 + .5); - - bool trueGapless = (gapless >> 31) & 0x0001; - if(trueGapless) { - uint lastFrameSamples = (gapless >> 20) & 0x07FF; - d->sampleFrames = d->totalFrames * 1152 - lastFrameSamples; - } - else - d->sampleFrames = d->totalFrames * 1152 - 576; - } - else { - uint headerData = data.toUInt(0, false); - - d->bitrate = (headerData >> 23) & 0x01ff; - d->version = (headerData >> 11) & 0x03ff; - d->sampleRate = 44100; - d->channels = 2; - - if(d->version >= 5) - d->totalFrames = data.toUInt(4, false); - else - d->totalFrames = data.toUShort(6, false); - - d->sampleFrames = d->totalFrames * 1152 - 576; - } - - d->length = d->sampleRate > 0 ? (d->sampleFrames + (d->sampleRate / 2)) / d->sampleRate : 0; - - if(!d->bitrate) - d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0; -} - diff --git a/src/taglib/taglib/mpc/mpcproperties.h b/src/taglib/taglib/mpc/mpcproperties.h deleted file mode 100644 index adf40d8..0000000 --- a/src/taglib/taglib/mpc/mpcproperties.h +++ /dev/null @@ -1,122 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPCPROPERTIES_H -#define TAGLIB_MPCPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace MPC { - - class File; - - static const uint HeaderSize = 8*7; - - //! An implementation of audio property reading for MPC - - /*! - * This reads the data from an MPC stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of MPC::Properties with the data read from the - * ByteVector \a data. - * - * This constructor is deprecated. It only works for MPC version up to 7. - */ - Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); - - /*! - * Create an instance of MPC::Properties with the data read directly - * from a MPC::File. - */ - Properties(File *file, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this MPC::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns the version of the bitstream (SV4-SV8) - */ - int mpcVersion() const; - uint totalFrames() const; - uint sampleFrames() const; - - /*! - * Returns the track gain as an integer value, - * to convert to dB: trackGain in dB = 64.82 - (trackGain / 256) - */ - int trackGain() const; - - /*! - * Returns the track peak as an integer value, - * to convert to dB: trackPeak in dB = trackPeak / 256 - * to convert to floating [-1..1]: trackPeak = 10^(trackPeak / 256 / 20)/32768 - */ - int trackPeak() const; - - /*! - * Returns the album gain as an integer value, - * to convert to dB: albumGain in dB = 64.82 - (albumGain / 256) - */ - int albumGain() const; - - /*! - * Returns the album peak as an integer value, - * to convert to dB: albumPeak in dB = albumPeak / 256 - * to convert to floating [-1..1]: albumPeak = 10^(albumPeak / 256 / 20)/32768 - */ - int albumPeak() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void readSV7(const ByteVector &data); - void readSV8(File *file); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v1/id3v1genres.cpp b/src/taglib/taglib/mpeg/id3v1/id3v1genres.cpp deleted file mode 100644 index eba4c52..0000000 --- a/src/taglib/taglib/mpeg/id3v1/id3v1genres.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "id3v1genres.h" - -using namespace TagLib; - -namespace TagLib { - namespace ID3v1 { - - static const int genresSize = 148; - static const String genres[] = { - "Blues", - "Classic Rock", - "Country", - "Dance", - "Disco", - "Funk", - "Grunge", - "Hip-Hop", - "Jazz", - "Metal", - "New Age", - "Oldies", - "Other", - "Pop", - "R&B", - "Rap", - "Reggae", - "Rock", - "Techno", - "Industrial", - "Alternative", - "Ska", - "Death Metal", - "Pranks", - "Soundtrack", - "Euro-Techno", - "Ambient", - "Trip-Hop", - "Vocal", - "Jazz+Funk", - "Fusion", - "Trance", - "Classical", - "Instrumental", - "Acid", - "House", - "Game", - "Sound Clip", - "Gospel", - "Noise", - "Alternative Rock", - "Bass", - "Soul", - "Punk", - "Space", - "Meditative", - "Instrumental Pop", - "Instrumental Rock", - "Ethnic", - "Gothic", - "Darkwave", - "Techno-Industrial", - "Electronic", - "Pop-Folk", - "Eurodance", - "Dream", - "Southern Rock", - "Comedy", - "Cult", - "Gangsta", - "Top 40", - "Christian Rap", - "Pop/Funk", - "Jungle", - "Native American", - "Cabaret", - "New Wave", - "Psychedelic", - "Rave", - "Showtunes", - "Trailer", - "Lo-Fi", - "Tribal", - "Acid Punk", - "Acid Jazz", - "Polka", - "Retro", - "Musical", - "Rock & Roll", - "Hard Rock", - "Folk", - "Folk/Rock", - "National Folk", - "Swing", - "Fusion", - "Bebob", - "Latin", - "Revival", - "Celtic", - "Bluegrass", - "Avantgarde", - "Gothic Rock", - "Progressive Rock", - "Psychedelic Rock", - "Symphonic Rock", - "Slow Rock", - "Big Band", - "Chorus", - "Easy Listening", - "Acoustic", - "Humour", - "Speech", - "Chanson", - "Opera", - "Chamber Music", - "Sonata", - "Symphony", - "Booty Bass", - "Primus", - "Porn Groove", - "Satire", - "Slow Jam", - "Club", - "Tango", - "Samba", - "Folklore", - "Ballad", - "Power Ballad", - "Rhythmic Soul", - "Freestyle", - "Duet", - "Punk Rock", - "Drum Solo", - "A Cappella", - "Euro-House", - "Dance Hall", - "Goa", - "Drum & Bass", - "Club-House", - "Hardcore", - "Terror", - "Indie", - "BritPop", - "Negerpunk", - "Polsk Punk", - "Beat", - "Christian Gangsta Rap", - "Heavy Metal", - "Black Metal", - "Crossover", - "Contemporary Christian", - "Christian Rock", - "Merengue", - "Salsa", - "Thrash Metal", - "Anime", - "Jpop", - "Synthpop" - }; - } -} - -StringList ID3v1::genreList() -{ - static StringList l; - if(l.isEmpty()) { - for(int i = 0; i < genresSize; i++) - l.append(genres[i]); - } - return l; -} - -ID3v1::GenreMap ID3v1::genreMap() -{ - static GenreMap m; - if(m.isEmpty()) { - for(int i = 0; i < genresSize; i++) - m.insert(genres[i], i); - } - return m; -} - -String ID3v1::genre(int i) -{ - if(i >= 0 && i < genresSize) - return genres[i] + String::null; // always make a copy - return String::null; -} - -int ID3v1::genreIndex(const String &name) -{ - if(genreMap().contains(name)) - return genreMap()[name]; - return 255; -} diff --git a/src/taglib/taglib/mpeg/id3v1/id3v1genres.h b/src/taglib/taglib/mpeg/id3v1/id3v1genres.h deleted file mode 100644 index 271f725..0000000 --- a/src/taglib/taglib/mpeg/id3v1/id3v1genres.h +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V1GENRE_H -#define TAGLIB_ID3V1GENRE_H - -#include "tmap.h" -#include "tstringlist.h" -#include "taglib_export.h" - -namespace TagLib { - namespace ID3v1 { - - typedef Map<String, int> GenreMap; - - /*! - * Returns the list of canonical ID3v1 genre names in the order that they - * are listed in the standard. - */ - StringList TAGLIB_EXPORT genreList(); - - /*! - * A "reverse mapping" that goes from the canonical ID3v1 genre name to the - * respective genre number. genreMap()["Rock"] == - */ - GenreMap TAGLIB_EXPORT genreMap(); - - /*! - * Returns the name of the genre at \a index in the ID3v1 genre list. If - * \a index is out of range -- less than zero or greater than 146 -- a null - * string will be returned. - */ - String TAGLIB_EXPORT genre(int index); - - /*! - * Returns the genre index for the (case sensitive) genre \a name. If the - * genre is not in the list 255 (which signifies an unknown genre in ID3v1) - * will be returned. - */ - int TAGLIB_EXPORT genreIndex(const String &name); - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v1/id3v1tag.cpp b/src/taglib/taglib/mpeg/id3v1/id3v1tag.cpp deleted file mode 100644 index 9fc8cfd..0000000 --- a/src/taglib/taglib/mpeg/id3v1/id3v1tag.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tfile.h> - -#include "id3v1tag.h" -#include "id3v1genres.h" - -using namespace TagLib; -using namespace ID3v1; - -class ID3v1::Tag::TagPrivate -{ -public: - TagPrivate() : file(0), tagOffset(-1), track(0), genre(255) {} - - File *file; - long tagOffset; - - String title; - String artist; - String album; - String year; - String comment; - uchar track; - uchar genre; - - static const StringHandler *stringHandler; -}; - -static const StringHandler defaultStringHandler; -const ID3v1::StringHandler *ID3v1::Tag::TagPrivate::stringHandler = &defaultStringHandler; - -//////////////////////////////////////////////////////////////////////////////// -// StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -StringHandler::StringHandler() -{ -} - -String ID3v1::StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::Latin1).stripWhiteSpace(); -} - -ByteVector ID3v1::StringHandler::render(const String &s) const -{ - if(!s.isLatin1()) - { - return ByteVector(); - } - - return s.data(String::Latin1); -} - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -ID3v1::Tag::Tag() : TagLib::Tag() -{ - d = new TagPrivate; -} - -ID3v1::Tag::Tag(File *file, long tagOffset) : TagLib::Tag() -{ - d = new TagPrivate; - d->file = file; - d->tagOffset = tagOffset; - - read(); -} - -ID3v1::Tag::~Tag() -{ - delete d; -} - -ByteVector ID3v1::Tag::render() const -{ - ByteVector data; - - data.append(fileIdentifier()); - data.append(TagPrivate::stringHandler->render(d->title).resize(30)); - data.append(TagPrivate::stringHandler->render(d->artist).resize(30)); - data.append(TagPrivate::stringHandler->render(d->album).resize(30)); - data.append(TagPrivate::stringHandler->render(d->year).resize(4)); - data.append(TagPrivate::stringHandler->render(d->comment).resize(28)); - data.append(char(0)); - data.append(char(d->track)); - data.append(char(d->genre)); - - return data; -} - -ByteVector ID3v1::Tag::fileIdentifier() -{ - return ByteVector::fromCString("TAG"); -} - -String ID3v1::Tag::title() const -{ - return d->title; -} - -String ID3v1::Tag::artist() const -{ - return d->artist; -} - -String ID3v1::Tag::album() const -{ - return d->album; -} - -String ID3v1::Tag::comment() const -{ - return d->comment; -} - -String ID3v1::Tag::genre() const -{ - return ID3v1::genre(d->genre); -} - -TagLib::uint ID3v1::Tag::year() const -{ - return d->year.toInt(); -} - -TagLib::uint ID3v1::Tag::track() const -{ - return d->track; -} - -void ID3v1::Tag::setTitle(const String &s) -{ - d->title = s; -} - -void ID3v1::Tag::setArtist(const String &s) -{ - d->artist = s; -} - -void ID3v1::Tag::setAlbum(const String &s) -{ - d->album = s; -} - -void ID3v1::Tag::setComment(const String &s) -{ - d->comment = s; -} - -void ID3v1::Tag::setGenre(const String &s) -{ - d->genre = ID3v1::genreIndex(s); -} - -void ID3v1::Tag::setYear(TagLib::uint i) -{ - d->year = i > 0 ? String::number(i) : String::null; -} - -void ID3v1::Tag::setTrack(TagLib::uint i) -{ - d->track = i < 256 ? i : 0; -} - -TagLib::uint ID3v1::Tag::genreNumber() const -{ - return d->genre; -} - -void ID3v1::Tag::setGenreNumber(TagLib::uint i) -{ - d->genre = i < 256 ? i : 255; -} - -void ID3v1::Tag::setStringHandler(const StringHandler *handler) -{ - if (handler) - TagPrivate::stringHandler = handler; - else - TagPrivate::stringHandler = &defaultStringHandler; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected methods -//////////////////////////////////////////////////////////////////////////////// - -void ID3v1::Tag::read() -{ - if(d->file && d->file->isValid()) { - d->file->seek(d->tagOffset); - // read the tag -- always 128 bytes - ByteVector data = d->file->readBlock(128); - - // some initial sanity checking - if(data.size() == 128 && data.startsWith("TAG")) - parse(data); - else - debug("ID3v1 tag is not valid or could not be read at the specified offset."); - } -} - -void ID3v1::Tag::parse(const ByteVector &data) -{ - int offset = 3; - - d->title = TagPrivate::stringHandler->parse(data.mid(offset, 30)); - offset += 30; - - d->artist = TagPrivate::stringHandler->parse(data.mid(offset, 30)); - offset += 30; - - d->album = TagPrivate::stringHandler->parse(data.mid(offset, 30)); - offset += 30; - - d->year = TagPrivate::stringHandler->parse(data.mid(offset, 4)); - offset += 4; - - // Check for ID3v1.1 -- Note that ID3v1 *does not* support "track zero" -- this - // is not a bug in TagLib. Since a zeroed byte is what we would expect to - // indicate the end of a C-String, specifically the comment string, a value of - // zero must be assumed to be just that. - - if(data[offset + 28] == 0 && data[offset + 29] != 0) { - // ID3v1.1 detected - - d->comment = TagPrivate::stringHandler->parse(data.mid(offset, 28)); - d->track = uchar(data[offset + 29]); - } - else - d->comment = data.mid(offset, 30); - - offset += 30; - - d->genre = uchar(data[offset]); -} diff --git a/src/taglib/taglib/mpeg/id3v1/id3v1tag.h b/src/taglib/taglib/mpeg/id3v1/id3v1tag.h deleted file mode 100644 index 7b26d02..0000000 --- a/src/taglib/taglib/mpeg/id3v1/id3v1tag.h +++ /dev/null @@ -1,202 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V1TAG_H -#define TAGLIB_ID3V1TAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - class File; - - //! An ID3v1 implementation - - namespace ID3v1 { - - //! A abstraction for the string to data encoding in ID3v1 tags. - - /*! - * ID3v1 should in theory always contain ISO-8859-1 (Latin1) data. In - * practice it does not. TagLib by default only supports ISO-8859-1 data - * in ID3v1 tags. - * - * However by subclassing this class and reimplementing parse() and render() - * and setting your reimplementation as the default with - * ID3v1::Tag::setStringHandler() you can define how you would like these - * transformations to be done. - * - * \warning It is advisable <b>not</b> to write non-ISO-8859-1 data to ID3v1 - * tags. Please consider disabling the writing of ID3v1 tags in the case - * that the data is not ISO-8859-1. - * - * \see ID3v1::Tag::setStringHandler() - */ - - class TAGLIB_EXPORT StringHandler - { - TAGLIB_IGNORE_MISSING_DESTRUCTOR - public: - // BIC: Add virtual destructor. - StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an ISO-8859-1 (Latin1) character array. - */ - virtual String parse(const ByteVector &data) const; - - /*! - * Encode a ByteVector with the data from \a s. The default implementation - * assumes that \a s is an ISO-8859-1 (Latin1) string. If the string is - * does not conform to ISO-8859-1, no value is written. - * - * \warning It is recommended that you <b>not</b> override this method, but - * instead do not write an ID3v1 tag in the case that the data is not - * ISO-8859-1. - */ - virtual ByteVector render(const String &s) const; - }; - - //! The main class in the ID3v1 implementation - - /*! - * This is an implementation of the ID3v1 format. ID3v1 is both the simplist - * and most common of tag formats but is rather limited. Because of its - * pervasiveness and the way that applications have been written around the - * fields that it provides, the generic TagLib::Tag API is a mirror of what is - * provided by ID3v1. - * - * ID3v1 tags should generally only contain Latin1 information. However because - * many applications do not follow this rule there is now support for overriding - * the ID3v1 string handling using the ID3v1::StringHandler class. Please see - * the documentation for that class for more information. - * - * \see StringHandler - * - * \note Most fields are truncated to a maximum of 28-30 bytes. The - * truncation happens automatically when the tag is rendered. - */ - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Create an ID3v1 tag with default values. - */ - Tag(); - - /*! - * Create an ID3v1 tag and parse the data in \a file starting at - * \a tagOffset. - */ - Tag(File *file, long tagOffset); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Renders the in memory values to a ByteVector suitable for writing to - * the file. - */ - ByteVector render() const; - - /*! - * Returns the string "TAG" suitable for usage in locating the tag in a - * file. - */ - static ByteVector fileIdentifier(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual TagLib::uint year() const; - virtual TagLib::uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(TagLib::uint i); - virtual void setTrack(TagLib::uint i); - - /*! - * Returns the genre in number. - * - * /note Normally 255 indicates that this tag contains no genre. - */ - TagLib::uint genreNumber() const; - - /*! - * Sets the genre in number to \a i. - * - * /note Valid value is from 0 up to 255. Normally 255 indicates that - * this tag contains no genre. - */ - void setGenreNumber(TagLib::uint i); - - /*! - * Sets the string handler that decides how the ID3v1 data will be - * converted to and from binary data. - * If the parameter \a handler is null, the previous handler is - * released and default ISO-8859-1 handler is restored. - * - * \note The caller is responsible for deleting the previous handler - * as needed after it is released. - * - * \see StringHandler - */ - static void setStringHandler(const StringHandler *handler); - - protected: - /*! - * Reads from the file specified in the constructor. - */ - void read(); - /*! - * Pareses the body of the tag in \a data. - */ - void parse(const ByteVector &data); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp deleted file mode 100644 index 86f8e35..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "attachedpictureframe.h" - -#include <tstringlist.h> -#include <tdebug.h> - -using namespace TagLib; -using namespace ID3v2; - -class AttachedPictureFrame::AttachedPictureFramePrivate -{ -public: - AttachedPictureFramePrivate() : textEncoding(String::Latin1), - type(AttachedPictureFrame::Other) {} - - String::Type textEncoding; - String mimeType; - AttachedPictureFrame::Type type; - String description; - ByteVector data; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -AttachedPictureFrame::AttachedPictureFrame() : Frame("APIC") -{ - d = new AttachedPictureFramePrivate; -} - -AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data) : Frame(data) -{ - d = new AttachedPictureFramePrivate; - setData(data); -} - -AttachedPictureFrame::~AttachedPictureFrame() -{ - delete d; -} - -String AttachedPictureFrame::toString() const -{ - String s = "[" + d->mimeType + "]"; - return d->description.isEmpty() ? s : d->description + " " + s; -} - -String::Type AttachedPictureFrame::textEncoding() const -{ - return d->textEncoding; -} - -void AttachedPictureFrame::setTextEncoding(String::Type t) -{ - d->textEncoding = t; -} - -String AttachedPictureFrame::mimeType() const -{ - return d->mimeType; -} - -void AttachedPictureFrame::setMimeType(const String &m) -{ - d->mimeType = m; -} - -AttachedPictureFrame::Type AttachedPictureFrame::type() const -{ - return d->type; -} - -void AttachedPictureFrame::setType(Type t) -{ - d->type = t; -} - -String AttachedPictureFrame::description() const -{ - return d->description; -} - -void AttachedPictureFrame::setDescription(const String &desc) -{ - d->description = desc; -} - -ByteVector AttachedPictureFrame::picture() const -{ - return d->data; -} - -void AttachedPictureFrame::setPicture(const ByteVector &p) -{ - d->data = p; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void AttachedPictureFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 5) { - debug("A picture frame must contain at least 5 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - - int pos = 1; - - d->mimeType = readStringField(data, String::Latin1, &pos); - /* Now we need at least two more bytes available */ - if (uint(pos) + 1 >= data.size()) { - debug("Truncated picture frame."); - return; - } - - d->type = (TagLib::ID3v2::AttachedPictureFrame::Type)data[pos++]; - d->description = readStringField(data, d->textEncoding, &pos); - - d->data = data.mid(pos); -} - -ByteVector AttachedPictureFrame::renderFields() const -{ - ByteVector data; - - String::Type encoding = checkTextEncoding(d->description, d->textEncoding); - - data.append(char(encoding)); - data.append(d->mimeType.data(String::Latin1)); - data.append(textDelimiter(String::Latin1)); - data.append(char(d->type)); - data.append(d->description.data(encoding)); - data.append(textDelimiter(encoding)); - data.append(d->data); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new AttachedPictureFramePrivate; - parseFields(fieldData(data)); -} - -//////////////////////////////////////////////////////////////////////////////// -// support for ID3v2.2 PIC frames -//////////////////////////////////////////////////////////////////////////////// - -void AttachedPictureFrameV22::parseFields(const ByteVector &data) -{ - if(data.size() < 5) { - debug("A picture frame must contain at least 5 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - - int pos = 1; - - String fixedString = String(data.mid(pos, 3), String::Latin1); - pos += 3; - // convert fixed string image type to mime string - if (fixedString.upper() == "JPG") { - d->mimeType = "image/jpeg"; - } else if (fixedString.upper() == "PNG") { - d->mimeType = "image/png"; - } else { - debug("probably unsupported image type"); - d->mimeType = "image/" + fixedString; - } - - d->type = (TagLib::ID3v2::AttachedPictureFrame::Type)data[pos++]; - d->description = readStringField(data, d->textEncoding, &pos); - - d->data = data.mid(pos); -} - -AttachedPictureFrameV22::AttachedPictureFrameV22(const ByteVector &data, Header *h) -{ - // set v2.2 header to make fieldData work correctly - setHeader(h, true); - - parseFields(fieldData(data)); - - // now set the v2.4 header - Frame::Header *newHeader = new Frame::Header("APIC"); - newHeader->setFrameSize(h->frameSize()); - setHeader(newHeader, true); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h b/src/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h deleted file mode 100644 index 55067bd..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h +++ /dev/null @@ -1,230 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ATTACHEDPICTUREFRAME_H -#define TAGLIB_ATTACHEDPICTUREFRAME_H - -#include "id3v2frame.h" -#include "id3v2header.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 attached picture frame implementation - - /*! - * This is an implementation of ID3v2 attached pictures. Pictures may be - * included in tags, one per APIC frame (but there may be multiple APIC - * frames in a single tag). These pictures are usually in either JPEG or - * PNG format. - */ - - class TAGLIB_EXPORT AttachedPictureFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - /*! - * Constructs an empty picture frame. The description, content and text - * encoding should be set manually. - */ - AttachedPictureFrame(); - - /*! - * Constructs an AttachedPicture frame based on \a data. - */ - explicit AttachedPictureFrame(const ByteVector &data); - - /*! - * Destroys the AttahcedPictureFrame instance. - */ - virtual ~AttachedPictureFrame(); - - /*! - * Returns a string containing the description and mime-type - */ - virtual String toString() const; - - /*! - * Returns the text encoding used for the description. - * - * \see setTextEncoding() - * \see description() - */ - String::Type textEncoding() const; - - /*! - * Set the text encoding used for the description. - * - * \see description() - */ - void setTextEncoding(String::Type t); - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - void setMimeType(const String &m); - - /*! - * Returns the type of the image. - * - * \see Type - * \see setType() - */ - Type type() const; - - /*! - * Sets the type for the image. - * - * \see Type - * \see type() - */ - void setType(Type t); - - /*! - * Returns a text description of the image. - * - * \see setDescription() - * \see textEncoding() - * \see setTextEncoding() - */ - - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - * - * \see description() - * \see textEncoding() - * \see setTextEncoding() - */ - - void setDescription(const String &desc); - - /*! - * Returns the image data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setPicture() - * \see mimeType() - */ - ByteVector picture() const; - - /*! - * Sets the image data to \a p. \a p should be of the type specified in - * this frame's mime-type specification. - * - * \see picture() - * \see mimeType() - * \see setMimeType() - */ - void setPicture(const ByteVector &p); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - class AttachedPictureFramePrivate; - AttachedPictureFramePrivate *d; - - private: - AttachedPictureFrame(const AttachedPictureFrame &); - AttachedPictureFrame &operator=(const AttachedPictureFrame &); - AttachedPictureFrame(const ByteVector &data, Header *h); - - }; - - //! support for ID3v2.2 PIC frames - class TAGLIB_EXPORT AttachedPictureFrameV22 : public AttachedPictureFrame - { - protected: - virtual void parseFields(const ByteVector &data); - private: - AttachedPictureFrameV22(const ByteVector &data, Header *h); - friend class FrameFactory; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/commentsframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/commentsframe.cpp deleted file mode 100644 index deaa9d9..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/commentsframe.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include <tdebug.h> -#include <tstringlist.h> - -#include "commentsframe.h" -#include "tpropertymap.h" - -using namespace TagLib; -using namespace ID3v2; - -class CommentsFrame::CommentsFramePrivate -{ -public: - CommentsFramePrivate() : textEncoding(String::Latin1) {} - String::Type textEncoding; - ByteVector language; - String description; - String text; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -CommentsFrame::CommentsFrame(String::Type encoding) : Frame("COMM") -{ - d = new CommentsFramePrivate; - d->textEncoding = encoding; -} - -CommentsFrame::CommentsFrame(const ByteVector &data) : Frame(data) -{ - d = new CommentsFramePrivate; - setData(data); -} - -CommentsFrame::~CommentsFrame() -{ - delete d; -} - -String CommentsFrame::toString() const -{ - return d->text; -} - -ByteVector CommentsFrame::language() const -{ - return d->language; -} - -String CommentsFrame::description() const -{ - return d->description; -} - -String CommentsFrame::text() const -{ - return d->text; -} - -void CommentsFrame::setLanguage(const ByteVector &languageEncoding) -{ - d->language = languageEncoding.mid(0, 3); -} - -void CommentsFrame::setDescription(const String &s) -{ - d->description = s; -} - -void CommentsFrame::setText(const String &s) -{ - d->text = s; -} - -String::Type CommentsFrame::textEncoding() const -{ - return d->textEncoding; -} - -void CommentsFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -PropertyMap CommentsFrame::asProperties() const -{ - String key = description().upper(); - PropertyMap map; - if(key.isEmpty() || key == "COMMENT") - map.insert("COMMENT", text()); - else if(key.isNull()) - map.unsupportedData().append(L"COMM/" + description()); - else - map.insert("COMMENT:" + key, text()); - return map; -} - -CommentsFrame *CommentsFrame::findByDescription(const ID3v2::Tag *tag, const String &d) // static -{ - ID3v2::FrameList comments = tag->frameList("COMM"); - - for(ID3v2::FrameList::ConstIterator it = comments.begin(); - it != comments.end(); - ++it) - { - CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it); - if(frame && frame->description() == d) - return frame; - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void CommentsFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 5) { - debug("A comment frame must contain at least 5 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - d->language = data.mid(1, 3); - - int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; - - ByteVectorList l = ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2); - - if(l.size() == 2) { - if(d->textEncoding == String::Latin1) { - d->description = Tag::latin1StringHandler()->parse(l.front()); - d->text = Tag::latin1StringHandler()->parse(l.back()); - } else { - d->description = String(l.front(), d->textEncoding); - d->text = String(l.back(), d->textEncoding); - } - } -} - -ByteVector CommentsFrame::renderFields() const -{ - ByteVector v; - - String::Type encoding = d->textEncoding; - - encoding = checkTextEncoding(d->description, encoding); - encoding = checkTextEncoding(d->text, encoding); - - v.append(char(encoding)); - v.append(d->language.size() == 3 ? d->language : "XXX"); - v.append(d->description.data(encoding)); - v.append(textDelimiter(encoding)); - v.append(d->text.data(encoding)); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -CommentsFrame::CommentsFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new CommentsFramePrivate(); - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/commentsframe.h b/src/taglib/taglib/mpeg/id3v2/frames/commentsframe.h deleted file mode 100644 index f65f6f0..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/commentsframe.h +++ /dev/null @@ -1,179 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_COMMENTSFRAME_H -#define TAGLIB_COMMENTSFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 comments - - /*! - * This implements the ID3v2 comment format. An ID3v2 comment concists of - * a language encoding, a description and a single text field. - */ - - class TAGLIB_EXPORT CommentsFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty comment frame that will use the text encoding - * \a encoding. - */ - explicit CommentsFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a comment based on the data in \a data. - */ - explicit CommentsFrame(const ByteVector &data); - - /*! - * Destroys this CommentFrame instance. - */ - virtual ~CommentsFrame(); - - /*! - * Returns the text of this comment. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the language encoding as a 3 byte encoding as specified by - * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>. - * - * \note Most taggers simply ignore this value. - * - * \see setLanguage() - */ - ByteVector language() const; - - /*! - * Returns the description of this comment. - * - * \note Most taggers simply ignore this value. - * - * \see setDescription() - */ - String description() const; - - /*! - * Returns the text of this comment. - * - * \see setText() - */ - String text() const; - - /*! - * Set the language using the 3 byte language code from - * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to - * \a languageCode. - * - * \see language() - */ - void setLanguage(const ByteVector &languageCode); - - /*! - * Sets the description of the comment to \a s. - * - * \see decription() - */ - void setDescription(const String &s); - - /*! - * Sets the text portion of the comment to \a s. - * - * \see text() - */ - virtual void setText(const String &s); - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Parses this frame as PropertyMap with a single key. - * - if description() is empty or "COMMENT", the key will be "COMMENT" - * - if description() is not a valid PropertyMap key, the frame will be - * marked unsupported by an entry "COMM/<description>" in the unsupportedData() - * attribute of the returned map. - * - otherwise, the key will be "COMMENT:<description>" - * - The single value will be the frame's text(). - */ - PropertyMap asProperties() const; - - /*! - * Comments each have a unique description. This searches for a comment - * frame with the decription \a d and returns a pointer to it. If no - * frame is found that matches the given description null is returned. - * - * \see description() - */ - static CommentsFrame *findByDescription(const Tag *tag, const String &d); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - CommentsFrame(const ByteVector &data, Header *h); - CommentsFrame(const CommentsFrame &); - CommentsFrame &operator=(const CommentsFrame &); - - class CommentsFramePrivate; - CommentsFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp deleted file mode 100644 index fa3509b..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Aaron VonderHaar - email : avh4@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> - -#include "generalencapsulatedobjectframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFramePrivate -{ -public: - GeneralEncapsulatedObjectFramePrivate() : textEncoding(String::Latin1) {} - - String::Type textEncoding; - String mimeType; - String fileName; - String description; - ByteVector data; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame() : Frame("GEOB") -{ - d = new GeneralEncapsulatedObjectFramePrivate; -} - -GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data) : Frame(data) -{ - d = new GeneralEncapsulatedObjectFramePrivate; - setData(data); -} - -GeneralEncapsulatedObjectFrame::~GeneralEncapsulatedObjectFrame() -{ - delete d; -} - -String GeneralEncapsulatedObjectFrame::toString() const -{ - String text = "[" + d->mimeType + "]"; - - if(!d->fileName.isEmpty()) - text += " " + d->fileName; - - if(!d->description.isEmpty()) - text += " \"" + d->description + "\""; - - return text; -} - -String::Type GeneralEncapsulatedObjectFrame::textEncoding() const -{ - return d->textEncoding; -} - -void GeneralEncapsulatedObjectFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -String GeneralEncapsulatedObjectFrame::mimeType() const -{ - return d->mimeType; -} - -void GeneralEncapsulatedObjectFrame::setMimeType(const String &type) -{ - d->mimeType = type; -} - -String GeneralEncapsulatedObjectFrame::fileName() const -{ - return d->fileName; -} - -void GeneralEncapsulatedObjectFrame::setFileName(const String &name) -{ - d->fileName = name; -} - -String GeneralEncapsulatedObjectFrame::description() const -{ - return d->description; -} - -void GeneralEncapsulatedObjectFrame::setDescription(const String &desc) -{ - d->description = desc; -} - -ByteVector GeneralEncapsulatedObjectFrame::object() const -{ - return d->data; -} - -void GeneralEncapsulatedObjectFrame::setObject(const ByteVector &data) -{ - d->data = data; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void GeneralEncapsulatedObjectFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 4) { - debug("An object frame must contain at least 4 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - - int pos = 1; - - d->mimeType = readStringField(data, String::Latin1, &pos); - d->fileName = readStringField(data, d->textEncoding, &pos); - d->description = readStringField(data, d->textEncoding, &pos); - - d->data = data.mid(pos); -} - -ByteVector GeneralEncapsulatedObjectFrame::renderFields() const -{ - ByteVector data; - - data.append(char(d->textEncoding)); - data.append(d->mimeType.data(String::Latin1)); - data.append(textDelimiter(String::Latin1)); - data.append(d->fileName.data(d->textEncoding)); - data.append(textDelimiter(d->textEncoding)); - data.append(d->description.data(d->textEncoding)); - data.append(textDelimiter(d->textEncoding)); - data.append(d->data); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new GeneralEncapsulatedObjectFramePrivate; - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h b/src/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h deleted file mode 100644 index 42f854c..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h +++ /dev/null @@ -1,178 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Aaron VonderHaar - email : avh4@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_GENERALENCAPSULATEDOBJECT_H -#define TAGLIB_GENERALENCAPSULATEDOBJECT_H - -#include "id3v2frame.h" -#include "id3v2header.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 general encapsulated object frame implementation - - /*! - * This is an implementation of ID3v2 general encapsulated objects. - * Arbitrary binary data may be included in tags, stored in GEOB frames. - * There may be multiple GEOB frames in a single tag. Each GEOB it - * labelled with a content description (which may be blank), a required - * mime-type, and a file name (may be blank). The content description - * uniquely identifies the GEOB frame in the tag. - */ - - class TAGLIB_EXPORT GeneralEncapsulatedObjectFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * Constructs an empty object frame. The description, file name and text - * encoding should be set manually. - */ - GeneralEncapsulatedObjectFrame(); - - /*! - * Constructs a GeneralEncapsulatedObjectFrame frame based on \a data. - * - * \warning This is \em not data for the encapsulated object, for that use - * setObject(). This constructor is used when reading the frame from the - * disk. - */ - explicit GeneralEncapsulatedObjectFrame(const ByteVector &data); - - /*! - * Destroys the GeneralEncapsulatedObjectFrame instance. - */ - virtual ~GeneralEncapsulatedObjectFrame(); - - /*! - * Returns a string containing the description, file name and mime-type - */ - virtual String toString() const; - - /*! - * Returns the text encoding used for the description and file name. - * - * \see setTextEncoding() - * \see description() - * \see fileName() - */ - String::Type textEncoding() const; - - /*! - * Set the text encoding used for the description and file name. - * - * \see description() - * \see fileName() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns the mime type of the object. - */ - String mimeType() const; - - /*! - * Sets the mime type of the object. - */ - void setMimeType(const String &type); - - /*! - * Returns the file name of the object. - * - * \see setFileName() - */ - String fileName() const; - - /*! - * Sets the file name for the object. - * - * \see fileName() - */ - void setFileName(const String &name); - - /*! - * Returns the content description of the object. - * - * \see setDescription() - * \see textEncoding() - * \see setTextEncoding() - */ - - String description() const; - - /*! - * Sets the content description of the object to \a desc. - * - * \see description() - * \see textEncoding() - * \see setTextEncoding() - */ - - void setDescription(const String &desc); - - /*! - * Returns the object data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setObject() - * \see mimeType() - */ - ByteVector object() const; - - /*! - * Sets the object data to \a data. \a data should be of the type specified in - * this frame's mime-type specification. - * - * \see object() - * \see mimeType() - * \see setMimeType() - */ - void setObject(const ByteVector &object); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h); - GeneralEncapsulatedObjectFrame(const GeneralEncapsulatedObjectFrame &); - GeneralEncapsulatedObjectFrame &operator=(const GeneralEncapsulatedObjectFrame &); - - class GeneralEncapsulatedObjectFramePrivate; - GeneralEncapsulatedObjectFramePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/ownershipframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/ownershipframe.cpp deleted file mode 100644 index 9451c4c..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/ownershipframe.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Rupert Daniel - email : rupert@cancelmonday.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> - -#include "ownershipframe.h" -#include <id3v2tag.h> - -using namespace TagLib; -using namespace ID3v2; - -class OwnershipFrame::OwnershipFramePrivate -{ -public: - String pricePaid; - String datePurchased; - String seller; - String::Type textEncoding; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -OwnershipFrame::OwnershipFrame(String::Type encoding) : Frame("OWNE") -{ - d = new OwnershipFramePrivate; - d->textEncoding = encoding; -} - -OwnershipFrame::OwnershipFrame(const ByteVector &data) : Frame(data) -{ - d = new OwnershipFramePrivate; - setData(data); -} - -OwnershipFrame::~OwnershipFrame() -{ - delete d; -} - -String OwnershipFrame::toString() const -{ - return "pricePaid=" + d->pricePaid + " datePurchased=" + d->datePurchased + " seller=" + d->seller; -} - -String OwnershipFrame::pricePaid() const -{ - return d->pricePaid; -} - -void OwnershipFrame::setPricePaid(const String &s) -{ - d->pricePaid = s; -} - -String OwnershipFrame::datePurchased() const -{ - return d->datePurchased; -} - -void OwnershipFrame::setDatePurchased(const String &s) -{ - d->datePurchased = s; -} - -String OwnershipFrame::seller() const -{ - return d->seller; -} - -void OwnershipFrame::setSeller(const String &s) -{ - d->seller = s; -} - -String::Type OwnershipFrame::textEncoding() const -{ - return d->textEncoding; -} - -void OwnershipFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void OwnershipFrame::parseFields(const ByteVector &data) -{ - int pos = 0; - - // Get the text encoding - d->textEncoding = String::Type(data[0]); - pos += 1; - - // Read the price paid this is a null terminate string - d->pricePaid = readStringField(data, String::Latin1, &pos); - - // If we don't have at least 8 bytes left then don't parse the rest of the - // data - if(data.size() - pos < 8) { - return; - } - - // Read the date purchased YYYYMMDD - d->datePurchased = String(data.mid(pos, 8)); - pos += 8; - - // Read the seller - if(d->textEncoding == String::Latin1) - d->seller = Tag::latin1StringHandler()->parse(data.mid(pos)); - else - d->seller = String(data.mid(pos), d->textEncoding); -} - -ByteVector OwnershipFrame::renderFields() const -{ - ByteVector v; - - v.append(char(d->textEncoding)); - v.append(d->pricePaid.data(String::Latin1)); - v.append(textDelimiter(String::Latin1)); - v.append(d->datePurchased.data(String::Latin1)); - v.append(d->seller.data(d->textEncoding)); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -OwnershipFrame::OwnershipFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new OwnershipFramePrivate; - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/ownershipframe.h b/src/taglib/taglib/mpeg/id3v2/frames/ownershipframe.h deleted file mode 100644 index 34fc912..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/ownershipframe.h +++ /dev/null @@ -1,151 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Rupert Daniel - email : rupert@cancelmonday.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OWNERSHIPFRAME_H -#define TAGLIB_OWNERSHIPFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 "ownership" - - /*! - * This implements the ID3v2 ownership (OWNE frame). It consists of - * a price paid, a date purchased (YYYYMMDD) and the name of the seller. - */ - - class TAGLIB_EXPORT OwnershipFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty ownership frame. - */ - explicit OwnershipFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a ownership based on the data in \a data. - */ - explicit OwnershipFrame(const ByteVector &data); - - /*! - * Destroys this OwnershipFrame instance. - */ - virtual ~OwnershipFrame(); - - /*! - * Returns the text of this popularimeter. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the date purchased. - * - * \see setDatePurchased() - */ - String datePurchased() const; - - /*! - * Set the date purchased. - * - * \see datePurchased() - */ - void setDatePurchased(const String &datePurchased); - - /*! - * Returns the price paid. - * - * \see setPricePaid() - */ - String pricePaid() const; - - /*! - * Set the price paid. - * - * \see pricePaid() - */ - void setPricePaid(const String &pricePaid); - - /*! - * Returns the seller. - * - * \see setSeller() - */ - String seller() const; - - /*! - * Set the seller. - * - * \see seller() - */ - void setSeller(const String &seller); - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - OwnershipFrame(const ByteVector &data, Header *h); - OwnershipFrame(const OwnershipFrame &); - OwnershipFrame &operator=(const OwnershipFrame &); - - class OwnershipFramePrivate; - OwnershipFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/popularimeterframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/popularimeterframe.cpp deleted file mode 100644 index 3d4429f..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/popularimeterframe.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> - -#include "popularimeterframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class PopularimeterFrame::PopularimeterFramePrivate -{ -public: - PopularimeterFramePrivate() : rating(0), counter(0) {} - String email; - int rating; - TagLib::uint counter; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -PopularimeterFrame::PopularimeterFrame() : Frame("POPM") -{ - d = new PopularimeterFramePrivate; -} - -PopularimeterFrame::PopularimeterFrame(const ByteVector &data) : Frame(data) -{ - d = new PopularimeterFramePrivate; - setData(data); -} - -PopularimeterFrame::~PopularimeterFrame() -{ - delete d; -} - -String PopularimeterFrame::toString() const -{ - return d->email + " rating=" + String::number(d->rating) + " counter=" + String::number(d->counter); -} - -String PopularimeterFrame::email() const -{ - return d->email; -} - -void PopularimeterFrame::setEmail(const String &s) -{ - d->email = s; -} - -int PopularimeterFrame::rating() const -{ - return d->rating; -} - -void PopularimeterFrame::setRating(int s) -{ - d->rating = s; -} - -TagLib::uint PopularimeterFrame::counter() const -{ - return d->counter; -} - -void PopularimeterFrame::setCounter(TagLib::uint s) -{ - d->counter = s; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void PopularimeterFrame::parseFields(const ByteVector &data) -{ - int pos = 0, size = int(data.size()); - - d->email = readStringField(data, String::Latin1, &pos); - - d->rating = 0; - d->counter = 0; - if(pos < size) { - d->rating = (unsigned char)(data[pos++]); - if(pos < size) { - d->counter = data.toUInt(static_cast<uint>(pos)); - } - } -} - -ByteVector PopularimeterFrame::renderFields() const -{ - ByteVector data; - - data.append(d->email.data(String::Latin1)); - data.append(textDelimiter(String::Latin1)); - data.append(char(d->rating)); - data.append(ByteVector::fromUInt(d->counter)); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -PopularimeterFrame::PopularimeterFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new PopularimeterFramePrivate; - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/popularimeterframe.h b/src/taglib/taglib/mpeg/id3v2/frames/popularimeterframe.h deleted file mode 100644 index d39f1aa..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/popularimeterframe.h +++ /dev/null @@ -1,132 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_POPULARIMETERFRAME_H -#define TAGLIB_POPULARIMETERFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 "popularimeter" - - /*! - * This implements the ID3v2 popularimeter (POPM frame). It concists of - * an email, a rating and an optional counter. - */ - - class TAGLIB_EXPORT PopularimeterFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty popularimeter frame. - */ - explicit PopularimeterFrame(); - - /*! - * Construct a popularimeter based on the data in \a data. - */ - explicit PopularimeterFrame(const ByteVector &data); - - /*! - * Destroys this PopularimeterFrame instance. - */ - virtual ~PopularimeterFrame(); - - /*! - * Returns the text of this popularimeter. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the email. - * - * \see setEmail() - */ - String email() const; - - /*! - * Set the email. - * - * \see email() - */ - void setEmail(const String &email); - - /*! - * Returns the rating. - * - * \see setRating() - */ - int rating() const; - - /*! - * Set the rating. - * - * \see rating() - */ - void setRating(int rating); - - /*! - * Returns the counter. - * - * \see setCounter() - */ - uint counter() const; - - /*! - * Set the counter. - * - * \see counter() - */ - void setCounter(uint counter); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - PopularimeterFrame(const ByteVector &data, Header *h); - PopularimeterFrame(const PopularimeterFrame &); - PopularimeterFrame &operator=(const PopularimeterFrame &); - - class PopularimeterFramePrivate; - PopularimeterFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/privateframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/privateframe.cpp deleted file mode 100644 index 24ee0f3..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/privateframe.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Serkan Kalyoncu - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include <tdebug.h> - -#include "privateframe.h" - -using namespace TagLib; -using namespace ID3v2; - - -class PrivateFrame::PrivateFramePrivate -{ -public: - ByteVector data; - String owner; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -PrivateFrame::PrivateFrame() : Frame("PRIV") -{ - d = new PrivateFramePrivate; -} - -PrivateFrame::PrivateFrame(const ByteVector &data) : Frame(data) -{ - d = new PrivateFramePrivate; - setData(data); -} - -PrivateFrame::~PrivateFrame() -{ - delete d; -} - -String PrivateFrame::toString() const -{ - return d->owner; -} - -String PrivateFrame::owner() const -{ - return d->owner; -} - -ByteVector PrivateFrame::data() const -{ - return d->data; -} - -void PrivateFrame::setOwner(const String &s) -{ - d->owner = s; -} - -void PrivateFrame::setData(const ByteVector & data) -{ - d->data = data; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void PrivateFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 2) { - debug("A private frame must contain at least 2 bytes."); - return; - } - - // Owner identifier is assumed to be Latin1 - - const int byteAlign = 1; - const int endOfOwner = data.find(textDelimiter(String::Latin1), 0, byteAlign); - - d->owner = String(data.mid(0, endOfOwner)); - d->data = data.mid(endOfOwner + 1); -} - -ByteVector PrivateFrame::renderFields() const -{ - ByteVector v; - - v.append(d->owner.data(String::Latin1)); - v.append(textDelimiter(String::Latin1)); - v.append(d->data); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -PrivateFrame::PrivateFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new PrivateFramePrivate(); - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/privateframe.h b/src/taglib/taglib/mpeg/id3v2/frames/privateframe.h deleted file mode 100644 index 06f82f3..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/privateframe.h +++ /dev/null @@ -1,111 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Serkan Kalyoncu - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_PRIVATEFRAME_H -#define TAGLIB_PRIVATEFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 privateframe - - class TAGLIB_EXPORT PrivateFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty private frame. - */ - PrivateFrame(); - - /*! - * Construct a private frame based on the data in \a data. - * - * \note This is the constructor used when parsing the frame from a file. - */ - explicit PrivateFrame(const ByteVector &data); - - /*! - * Destroys this private frame instance. - */ - virtual ~PrivateFrame(); - - /*! - * Returns the text of this private frame, currently just the owner. - * - * \see text() - */ - virtual String toString() const; - - /*! - * \return The owner of the private frame. - * \note This should contain an email address or link to a website. - */ - String owner() const; - - /*! - * - */ - ByteVector data() const; - - /*! - * Sets the owner of the frame to \a s. - * \note This should contain an email address or link to a website. - */ - void setOwner(const String &s); - - /*! - * - */ - void setData(const ByteVector &v); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - PrivateFrame(const ByteVector &data, Header *h); - - PrivateFrame(const PrivateFrame &); - PrivateFrame &operator=(const PrivateFrame &); - - class PrivateFramePrivate; - PrivateFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp deleted file mode 100644 index e3efbc3..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tmap.h> - -#include "relativevolumeframe.h" - -using namespace TagLib; -using namespace ID3v2; - -static inline int bitsToBytes(int i) -{ - return i % 8 == 0 ? i / 8 : (i - i % 8) / 8 + 1; -} - -struct ChannelData -{ - ChannelData() : channelType(RelativeVolumeFrame::Other), volumeAdjustment(0) {} - - RelativeVolumeFrame::ChannelType channelType; - short volumeAdjustment; - RelativeVolumeFrame::PeakVolume peakVolume; -}; - -class RelativeVolumeFrame::RelativeVolumeFramePrivate -{ -public: - String identification; - Map<ChannelType, ChannelData> channels; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RelativeVolumeFrame::RelativeVolumeFrame() : Frame("RVA2") -{ - d = new RelativeVolumeFramePrivate; -} - -RelativeVolumeFrame::RelativeVolumeFrame(const ByteVector &data) : Frame(data) -{ - d = new RelativeVolumeFramePrivate; - setData(data); -} - -RelativeVolumeFrame::~RelativeVolumeFrame() -{ - delete d; -} - -String RelativeVolumeFrame::toString() const -{ - return d->identification; -} - -List<RelativeVolumeFrame::ChannelType> RelativeVolumeFrame::channels() const -{ - List<ChannelType> l; - - Map<ChannelType, ChannelData>::ConstIterator it = d->channels.begin(); - for(; it != d->channels.end(); ++it) - l.append((*it).first); - - return l; -} - -// deprecated - -RelativeVolumeFrame::ChannelType RelativeVolumeFrame::channelType() const -{ - return MasterVolume; -} - -// deprecated - -void RelativeVolumeFrame::setChannelType(ChannelType) -{ - -} - -short RelativeVolumeFrame::volumeAdjustmentIndex(ChannelType type) const -{ - return d->channels.contains(type) ? d->channels[type].volumeAdjustment : 0; -} - -short RelativeVolumeFrame::volumeAdjustmentIndex() const -{ - return volumeAdjustmentIndex(MasterVolume); -} - -void RelativeVolumeFrame::setVolumeAdjustmentIndex(short index, ChannelType type) -{ - d->channels[type].volumeAdjustment = index; -} - -void RelativeVolumeFrame::setVolumeAdjustmentIndex(short index) -{ - setVolumeAdjustmentIndex(index, MasterVolume); -} - -float RelativeVolumeFrame::volumeAdjustment(ChannelType type) const -{ - return d->channels.contains(type) ? float(d->channels[type].volumeAdjustment) / float(512) : 0; -} - -float RelativeVolumeFrame::volumeAdjustment() const -{ - return volumeAdjustment(MasterVolume); -} - -void RelativeVolumeFrame::setVolumeAdjustment(float adjustment, ChannelType type) -{ - d->channels[type].volumeAdjustment = short(adjustment * float(512)); -} - -void RelativeVolumeFrame::setVolumeAdjustment(float adjustment) -{ - setVolumeAdjustment(adjustment, MasterVolume); -} - -RelativeVolumeFrame::PeakVolume RelativeVolumeFrame::peakVolume(ChannelType type) const -{ - return d->channels.contains(type) ? d->channels[type].peakVolume : PeakVolume(); -} - -RelativeVolumeFrame::PeakVolume RelativeVolumeFrame::peakVolume() const -{ - return peakVolume(MasterVolume); -} - -void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak, ChannelType type) -{ - d->channels[type].peakVolume = peak; -} - -void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak) -{ - setPeakVolume(peak, MasterVolume); -} - -String RelativeVolumeFrame::identification() const -{ - return d->identification; -} - -void RelativeVolumeFrame::setIdentification(const String &s) -{ - d->identification = s; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void RelativeVolumeFrame::parseFields(const ByteVector &data) -{ - int pos = 0; - d->identification = readStringField(data, String::Latin1, &pos); - - // Each channel is at least 4 bytes. - - while(pos <= (int)data.size() - 4) { - - - ChannelType type = ChannelType(data[pos]); - pos += 1; - - ChannelData &channel = d->channels[type]; - - channel.volumeAdjustment = data.toShort(static_cast<uint>(pos)); - pos += 2; - - channel.peakVolume.bitsRepresentingPeak = data[pos]; - pos += 1; - - int bytes = bitsToBytes(channel.peakVolume.bitsRepresentingPeak); - channel.peakVolume.peakVolume = data.mid(pos, bytes); - pos += bytes; - } -} - -ByteVector RelativeVolumeFrame::renderFields() const -{ - ByteVector data; - - data.append(d->identification.data(String::Latin1)); - data.append(textDelimiter(String::Latin1)); - - Map<ChannelType, ChannelData>::ConstIterator it = d->channels.begin(); - - for(; it != d->channels.end(); ++it) { - ChannelType type = (*it).first; - const ChannelData &channel = (*it).second; - - data.append(char(type)); - data.append(ByteVector::fromShort(channel.volumeAdjustment)); - data.append(char(channel.peakVolume.bitsRepresentingPeak)); - data.append(channel.peakVolume.peakVolume); - } - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -RelativeVolumeFrame::RelativeVolumeFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new RelativeVolumeFramePrivate; - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.h b/src/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.h deleted file mode 100644 index dad4e7d..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/relativevolumeframe.h +++ /dev/null @@ -1,274 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_RELATIVEVOLUMEFRAME_H -#define TAGLIB_RELATIVEVOLUMEFRAME_H - -#include "tlist.h" -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 relative volume adjustment frame implementation - - /*! - * This is an implementation of ID3v2 relative volume adjustment. The - * presence of this frame makes it possible to specify an increase in volume - * for an audio file or specific audio tracks in that file. - * - * Multiple relative volume adjustment frames may be present in the tag - * each with a unique identification and describing volume adjustment for - * different channel types. - */ - - class TAGLIB_EXPORT RelativeVolumeFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * This indicates the type of volume adjustment that should be applied. - */ - enum ChannelType { - //! A type not enumerated below - Other = 0x00, - //! The master volume for the track - MasterVolume = 0x01, - //! The front right audio channel - FrontRight = 0x02, - //! The front left audio channel - FrontLeft = 0x03, - //! The back right audio channel - BackRight = 0x04, - //! The back left audio channel - BackLeft = 0x05, - //! The front center audio channel - FrontCentre = 0x06, - //! The back center audio channel - BackCentre = 0x07, - //! The subwoofer audio channel - Subwoofer = 0x08 - }; - - //! Struct that stores the relevant values for ID3v2 peak volume - - /*! - * The peak volume is described as a series of bits that is padded to fill - * a block of bytes. These two values should always be updated in tandem. - */ - struct PeakVolume - { - /*! - * Constructs an empty peak volume description. - */ - PeakVolume() : bitsRepresentingPeak(0) {} - /*! - * The number of bits (in the range of 0 to 255) used to describe the - * peak volume. - */ - unsigned char bitsRepresentingPeak; - /*! - * The array of bits (represented as a series of bytes) used to describe - * the peak volume. - */ - ByteVector peakVolume; - }; - - /*! - * Constructs a RelativeVolumeFrame. The relevant data should be set - * manually. - */ - RelativeVolumeFrame(); - - /*! - * Constructs a RelativeVolumeFrame based on the contents of \a data. - */ - RelativeVolumeFrame(const ByteVector &data); - - /*! - * Destroys the RelativeVolumeFrame instance. - */ - virtual ~RelativeVolumeFrame(); - - /*! - * Returns the frame's identification. - * - * \see identification() - */ - virtual String toString() const; - - /*! - * Returns a list of channels with information currently in the frame. - */ - List<ChannelType> channels() const; - - /*! - * \deprecated Always returns master volume. - */ - ChannelType channelType() const; - - /*! - * \deprecated This method no longer has any effect. - */ - void setChannelType(ChannelType t); - - /* - * There was a terrible API goof here, and while this can't be changed to - * the way it appears below for binary compaibility reasons, let's at - * least pretend that it looks clean. - */ - -#ifdef DOXYGEN - - /*! - * Returns the relative volume adjustment "index". As indicated by the - * ID3v2 standard this is a 16-bit signed integer that reflects the - * decibils of adjustment when divided by 512. - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setVolumeAdjustmentIndex() - * \see volumeAjustment() - */ - short volumeAdjustmentIndex(ChannelType type = MasterVolume) const; - - /*! - * Set the volume adjustment to \a index. As indicated by the ID3v2 - * standard this is a 16-bit signed integer that reflects the decibils of - * adjustment when divided by 512. - * - * By default this sets the value for the master volume. - * - * \see volumeAdjustmentIndex() - * \see setVolumeAjustment() - */ - void setVolumeAdjustmentIndex(short index, ChannelType type = MasterVolume); - - /*! - * Returns the relative volume adjustment in decibels. - * - * \note Because this is actually stored internally as an "index" to this - * value the value returned by this method may not be identical to the - * value set using setVolumeAdjustment(). - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setVolumeAdjustment() - * \see volumeAdjustmentIndex() - */ - float volumeAdjustment(ChannelType type = MasterVolume) const; - - /*! - * Set the relative volume adjustment in decibels to \a adjustment. - * - * By default this sets the value for the master volume. - * - * \note Because this is actually stored internally as an "index" to this - * value the value set by this method may not be identical to the one - * returned by volumeAdjustment(). - * - * \see setVolumeAdjustment() - * \see volumeAdjustmentIndex() - */ - void setVolumeAdjustment(float adjustment, ChannelType type = MasterVolume); - - /*! - * Returns the peak volume (represented as a length and a string of bits). - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setPeakVolume() - */ - PeakVolume peakVolume(ChannelType type = MasterVolume) const; - - /*! - * Sets the peak volume to \a peak. - * - * By default this sets the value for the master volume. - * - * \see peakVolume() - */ - void setPeakVolume(const PeakVolume &peak, ChannelType type = MasterVolume); - -#else - - // BIC: Combine each of the following pairs of functions (or maybe just - // rework this junk altogether). - - short volumeAdjustmentIndex(ChannelType type) const; - short volumeAdjustmentIndex() const; - - void setVolumeAdjustmentIndex(short index, ChannelType type); - void setVolumeAdjustmentIndex(short index); - - float volumeAdjustment(ChannelType type) const; - float volumeAdjustment() const; - - void setVolumeAdjustment(float adjustment, ChannelType type); - void setVolumeAdjustment(float adjustment); - - PeakVolume peakVolume(ChannelType type) const; - PeakVolume peakVolume() const; - - void setPeakVolume(const PeakVolume &peak, ChannelType type); - void setPeakVolume(const PeakVolume &peak); - -#endif - - /*! - * Returns the identification for this frame. - */ - String identification() const; - - /*! - * Sets the identification of the frame to \a s. The string - * is used to identify the situation and/or device where this - * adjustment should apply. - */ - void setIdentification(const String &s); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - RelativeVolumeFrame(const ByteVector &data, Header *h); - RelativeVolumeFrame(const RelativeVolumeFrame &); - RelativeVolumeFrame &operator=(const RelativeVolumeFrame &); - - class RelativeVolumeFramePrivate; - RelativeVolumeFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.cpp deleted file mode 100644 index 70ea50f..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.cpp +++ /dev/null @@ -1,423 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include "textidentificationframe.h" -#include "tpropertymap.h" -#include "id3v1genres.h" - -using namespace TagLib; -using namespace ID3v2; - -class TextIdentificationFrame::TextIdentificationFramePrivate -{ -public: - TextIdentificationFramePrivate() : textEncoding(String::Latin1) {} - String::Type textEncoding; - StringList fieldList; -}; - -//////////////////////////////////////////////////////////////////////////////// -// TextIdentificationFrame public members -//////////////////////////////////////////////////////////////////////////////// - -TextIdentificationFrame::TextIdentificationFrame(const ByteVector &type, String::Type encoding) : - Frame(type) -{ - d = new TextIdentificationFramePrivate; - d->textEncoding = encoding; -} - -TextIdentificationFrame::TextIdentificationFrame(const ByteVector &data) : - Frame(data) -{ - d = new TextIdentificationFramePrivate; - setData(data); -} - -TextIdentificationFrame *TextIdentificationFrame::createTIPLFrame(const PropertyMap &properties) // static -{ - TextIdentificationFrame *frame = new TextIdentificationFrame("TIPL"); - StringList l; - for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it){ - l.append(it->first); - l.append(it->second.toString(",")); // comma-separated list of names - } - frame->setText(l); - return frame; -} - -TextIdentificationFrame *TextIdentificationFrame::createTMCLFrame(const PropertyMap &properties) // static -{ - TextIdentificationFrame *frame = new TextIdentificationFrame("TMCL"); - StringList l; - for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it){ - if(!it->first.startsWith(instrumentPrefix)) // should not happen - continue; - l.append(it->first.substr(instrumentPrefix.size())); - l.append(it->second.toString(",")); - } - frame->setText(l); - return frame; -} - -TextIdentificationFrame::~TextIdentificationFrame() -{ - delete d; -} - -void TextIdentificationFrame::setText(const StringList &l) -{ - d->fieldList = l; -} - -void TextIdentificationFrame::setText(const String &s) -{ - d->fieldList = s; -} - -String TextIdentificationFrame::toString() const -{ - return d->fieldList.toString(); -} - -StringList TextIdentificationFrame::fieldList() const -{ - return d->fieldList; -} - -String::Type TextIdentificationFrame::textEncoding() const -{ - return d->textEncoding; -} - -void TextIdentificationFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -// array of allowed TIPL prefixes and their corresponding key value -static const TagLib::uint involvedPeopleSize = 5; -static const char* involvedPeople[][2] = { - {"ARRANGER", "ARRANGER"}, - {"ENGINEER", "ENGINEER"}, - {"PRODUCER", "PRODUCER"}, - {"DJ-MIX", "DJMIXER"}, - {"MIX", "MIXER"}, -}; - -const KeyConversionMap &TextIdentificationFrame::involvedPeopleMap() // static -{ - static KeyConversionMap m; - if(m.isEmpty()) - for(uint i = 0; i < involvedPeopleSize; ++i) - m.insert(involvedPeople[i][1], involvedPeople[i][0]); - return m; -} - -PropertyMap TextIdentificationFrame::asProperties() const -{ - if(frameID() == "TIPL") - return makeTIPLProperties(); - if(frameID() == "TMCL") - return makeTMCLProperties(); - PropertyMap map; - String tagName = frameIDToKey(frameID()); - if(tagName.isNull()) { - map.unsupportedData().append(frameID()); - return map; - } - StringList values = fieldList(); - if(tagName == "GENRE") { - // Special case: Support ID3v1-style genre numbers. They are not officially supported in - // ID3v2, however it seems that still a lot of programs use them. - for(StringList::Iterator it = values.begin(); it != values.end(); ++it) { - bool ok = false; - int test = it->toInt(&ok); // test if the genre value is an integer - if(ok) - *it = ID3v1::genre(test); - } - } else if(tagName == "DATE") { - for(StringList::Iterator it = values.begin(); it != values.end(); ++it) { - // ID3v2 specifies ISO8601 timestamps which contain a 'T' as separator between date and time. - // Since this is unusual in other formats, the T is removed. - int tpos = it->find("T"); - if(tpos != -1) - (*it)[tpos] = ' '; - } - } - PropertyMap ret; - ret.insert(tagName, values); - return ret; -} - -//////////////////////////////////////////////////////////////////////////////// -// TextIdentificationFrame protected members -//////////////////////////////////////////////////////////////////////////////// - -void TextIdentificationFrame::parseFields(const ByteVector &data) -{ - // Don't try to parse invalid frames - - if(data.size() < 2) - return; - - // read the string data type (the first byte of the field data) - - d->textEncoding = String::Type(data[0]); - - // split the byte array into chunks based on the string type (two byte delimiter - // for unicode encodings) - - int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; - - // build a small counter to strip nulls off the end of the field - - int dataLength = data.size() - 1; - - while(dataLength > 0 && data[dataLength] == 0) - dataLength--; - - while(dataLength % byteAlign != 0) - dataLength++; - - ByteVectorList l = ByteVectorList::split(data.mid(1, dataLength), textDelimiter(d->textEncoding), byteAlign); - - d->fieldList.clear(); - - // append those split values to the list and make sure that the new string's - // type is the same specified for this frame - - for(ByteVectorList::Iterator it = l.begin(); it != l.end(); it++) { - if(!(*it).isEmpty()) { - if(d->textEncoding == String::Latin1) - d->fieldList.append(Tag::latin1StringHandler()->parse(*it)); - else - d->fieldList.append(String(*it, d->textEncoding)); - } - } -} - -ByteVector TextIdentificationFrame::renderFields() const -{ - String::Type encoding = checkTextEncoding(d->fieldList, d->textEncoding); - - ByteVector v; - - v.append(char(encoding)); - - for(StringList::ConstIterator it = d->fieldList.begin(); it != d->fieldList.end(); it++) { - - // Since the field list is null delimited, if this is not the first - // element in the list, append the appropriate delimiter for this - // encoding. - - if(it != d->fieldList.begin()) - v.append(textDelimiter(encoding)); - - v.append((*it).data(encoding)); - } - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// TextIdentificationFrame private members -//////////////////////////////////////////////////////////////////////////////// - -TextIdentificationFrame::TextIdentificationFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new TextIdentificationFramePrivate; - parseFields(fieldData(data)); -} - -PropertyMap TextIdentificationFrame::makeTIPLProperties() const -{ - PropertyMap map; - if(fieldList().size() % 2 != 0){ - // according to the ID3 spec, TIPL must contain an even number of entries - map.unsupportedData().append(frameID()); - return map; - } - StringList l = fieldList(); - for(StringList::ConstIterator it = l.begin(); it != l.end(); ++it) { - bool found = false; - for(uint i = 0; i < involvedPeopleSize; ++i) - if(*it == involvedPeople[i][0]) { - map.insert(involvedPeople[i][1], (++it)->split(",")); - found = true; - break; - } - if(!found){ - // invalid involved role -> mark whole frame as unsupported in order to be consisten with writing - map.clear(); - map.unsupportedData().append(frameID()); - return map; - } - } - return map; -} - -PropertyMap TextIdentificationFrame::makeTMCLProperties() const -{ - PropertyMap map; - if(fieldList().size() % 2 != 0){ - // according to the ID3 spec, TMCL must contain an even number of entries - map.unsupportedData().append(frameID()); - return map; - } - StringList l = fieldList(); - for(StringList::ConstIterator it = l.begin(); it != l.end(); ++it) { - String instrument = it->upper(); - if(instrument.isNull()) { - // instrument is not a valid key -> frame unsupported - map.clear(); - map.unsupportedData().append(frameID()); - return map; - } - map.insert(L"PERFORMER:" + instrument, (++it)->split(",")); - } - return map; -} - -//////////////////////////////////////////////////////////////////////////////// -// UserTextIdentificationFrame public members -//////////////////////////////////////////////////////////////////////////////// - -UserTextIdentificationFrame::UserTextIdentificationFrame(String::Type encoding) : - TextIdentificationFrame("TXXX", encoding), - d(0) -{ - StringList l; - l.append(String::null); - l.append(String::null); - setText(l); -} - - -UserTextIdentificationFrame::UserTextIdentificationFrame(const ByteVector &data) : - TextIdentificationFrame(data) -{ - checkFields(); -} - -UserTextIdentificationFrame::UserTextIdentificationFrame(const String &description, const StringList &values, String::Type encoding) : - TextIdentificationFrame("TXXX", encoding), - d(0) -{ - setDescription(description); - setText(values); -} - -String UserTextIdentificationFrame::toString() const -{ - return "[" + description() + "] " + fieldList().toString(); -} - -String UserTextIdentificationFrame::description() const -{ - return !TextIdentificationFrame::fieldList().isEmpty() - ? TextIdentificationFrame::fieldList().front() - : String::null; -} - -StringList UserTextIdentificationFrame::fieldList() const -{ - // TODO: remove this function - - return TextIdentificationFrame::fieldList(); -} - -void UserTextIdentificationFrame::setText(const String &text) -{ - if(description().isEmpty()) - setDescription(String::null); - - TextIdentificationFrame::setText(StringList(description()).append(text)); -} - -void UserTextIdentificationFrame::setText(const StringList &fields) -{ - if(description().isEmpty()) - setDescription(String::null); - - TextIdentificationFrame::setText(StringList(description()).append(fields)); -} - -void UserTextIdentificationFrame::setDescription(const String &s) -{ - StringList l = fieldList(); - - if(l.isEmpty()) - l.append(s); - else - l[0] = s; - - TextIdentificationFrame::setText(l); -} - -PropertyMap UserTextIdentificationFrame::asProperties() const -{ - PropertyMap map; - String tagName = txxxToKey(description()); - StringList v = fieldList(); - for(StringList::ConstIterator it = v.begin(); it != v.end(); ++it) - if(it != v.begin()) - map.insert(tagName, *it); - return map; -} - -UserTextIdentificationFrame *UserTextIdentificationFrame::find( - ID3v2::Tag *tag, const String &description) // static -{ - FrameList l = tag->frameList("TXXX"); - for(FrameList::Iterator it = l.begin(); it != l.end(); ++it) { - UserTextIdentificationFrame *f = dynamic_cast<UserTextIdentificationFrame *>(*it); - if(f && f->description() == description) - return f; - } - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// UserTextIdentificationFrame private members -//////////////////////////////////////////////////////////////////////////////// - -UserTextIdentificationFrame::UserTextIdentificationFrame(const ByteVector &data, Header *h) : - TextIdentificationFrame(data, h) -{ - checkFields(); -} - -void UserTextIdentificationFrame::checkFields() -{ - int fields = fieldList().size(); - - if(fields == 0) - setDescription(String::null); - if(fields <= 1) - setText(String::null); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.h b/src/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.h deleted file mode 100644 index 58ed63e..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/textidentificationframe.h +++ /dev/null @@ -1,313 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TEXTIDENTIFICATIONFRAME_H -#define TAGLIB_TEXTIDENTIFICATIONFRAME_H - -#include "tstringlist.h" -#include "tmap.h" -#include "taglib_export.h" - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - class Tag; - typedef Map<String, String> KeyConversionMap; - - //! An ID3v2 text identification frame implementation - - /*! - * This is an implementation of the most common type of ID3v2 frame -- text - * identification frames. There are a number of variations on this. Those - * enumerated in the ID3v2.4 standard are: - * - * <ul> - * <li><b>TALB</b> Album/Movie/Show title</li> - * <li><b>TBPM</b> BPM (beats per minute)</li> - * <li><b>TCOM</b> Composer</li> - * <li><b>TCON</b> Content type</li> - * <li><b>TCOP</b> Copyright message</li> - * <li><b>TDEN</b> Encoding time</li> - * <li><b>TDLY</b> Playlist delay</li> - * <li><b>TDOR</b> Original release time</li> - * <li><b>TDRC</b> Recording time</li> - * <li><b>TDRL</b> Release time</li> - * <li><b>TDTG</b> Tagging time</li> - * <li><b>TENC</b> Encoded by</li> - * <li><b>TEXT</b> Lyricist/Text writer</li> - * <li><b>TFLT</b> File type</li> - * <li><b>TIPL</b> Involved people list</li> - * <li><b>TIT1</b> Content group description</li> - * <li><b>TIT2</b> Title/songname/content description</li> - * <li><b>TIT3</b> Subtitle/Description refinement</li> - * <li><b>TKEY</b> Initial key</li> - * <li><b>TLAN</b> Language(s)</li> - * <li><b>TLEN</b> Length</li> - * <li><b>TMCL</b> Musician credits list</li> - * <li><b>TMED</b> Media type</li> - * <li><b>TMOO</b> Mood</li> - * <li><b>TOAL</b> Original album/movie/show title</li> - * <li><b>TOFN</b> Original filename</li> - * <li><b>TOLY</b> Original lyricist(s)/text writer(s)</li> - * <li><b>TOPE</b> Original artist(s)/performer(s)</li> - * <li><b>TOWN</b> File owner/licensee</li> - * <li><b>TPE1</b> Lead performer(s)/Soloist(s)</li> - * <li><b>TPE2</b> Band/orchestra/accompaniment</li> - * <li><b>TPE3</b> Conductor/performer refinement</li> - * <li><b>TPE4</b> Interpreted, remixed, or otherwise modified by</li> - * <li><b>TPOS</b> Part of a set</li> - * <li><b>TPRO</b> Produced notice</li> - * <li><b>TPUB</b> Publisher</li> - * <li><b>TRCK</b> Track number/Position in set</li> - * <li><b>TRSN</b> Internet radio station name</li> - * <li><b>TRSO</b> Internet radio station owner</li> - * <li><b>TSOA</b> Album sort order</li> - * <li><b>TSOP</b> Performer sort order</li> - * <li><b>TSOT</b> Title sort order</li> - * <li><b>TSRC</b> ISRC (international standard recording code)</li> - * <li><b>TSSE</b> Software/Hardware and settings used for encoding</li> - * <li><b>TSST</b> Set subtitle</li> - * </ul> - * - * The ID3v2 Frames document gives a description of each of these formats - * and the expected order of strings in each. ID3v2::Header::frameID() can - * be used to determine the frame type. - * - * \note If non-Latin1 compatible strings are used with this class, even if - * the text encoding is set to Latin1, the frame will be written using UTF8 - * (with the encoding flag appropriately set in the output). - */ - - class TAGLIB_EXPORT TextIdentificationFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty frame of type \a type. Uses \a encoding as the - * default text encoding. - * - * \note In this case you must specify the text encoding as it - * resolves the ambiguity between constructors. - * - * \note Please see the note in the class description regarding Latin1. - */ - TextIdentificationFrame(const ByteVector &type, String::Type encoding); - - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit TextIdentificationFrame(const ByteVector &data); - - /*! - * This is a special factory method to create a TIPL (involved people list) - * frame from the given \a properties. Will parse key=[list of values] data - * into the TIPL format as specified in the ID3 standard. - */ - static TextIdentificationFrame *createTIPLFrame(const PropertyMap &properties); - - /*! - * This is a special factory method to create a TMCL (musician credits list) - * frame from the given \a properties. Will parse key=[list of values] data - * into the TMCL format as specified in the ID3 standard, where key should be - * of the form instrumentPrefix:instrument. - */ - static TextIdentificationFrame *createTMCLFrame(const PropertyMap &properties); - /*! - * Destroys this TextIdentificationFrame instance. - */ - virtual ~TextIdentificationFrame(); - - /*! - * Text identification frames are a list of string fields. - * - * This function will accept either a StringList or a String (using the - * StringList constructor that accepts a single String). - * - * \note This will not change the text encoding of the frame even if the - * strings passed in are not of the same encoding. Please use - * setEncoding(s.type()) if you wish to change the encoding of the frame. - */ - void setText(const StringList &l); - - // Reimplementations. - - virtual void setText(const String &s); - virtual String toString() const; - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \note Please see the note in the class description regarding Latin1. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \note Please see the note in the class description regarding Latin1. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns a list of the strings in this frame. - */ - StringList fieldList() const; - - /*! - * Returns a KeyConversionMap mapping a role as it would be used in a PropertyMap - * to the corresponding key used in a TIPL ID3 frame to describe that role. - */ - static const KeyConversionMap &involvedPeopleMap(); - - PropertyMap asProperties() const; - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - TextIdentificationFrame(const ByteVector &data, Header *h); - - private: - TextIdentificationFrame(const TextIdentificationFrame &); - TextIdentificationFrame &operator=(const TextIdentificationFrame &); - - /*! - * Parses the special structure of a TIPL frame - * Only the whitelisted roles "ARRANGER", "ENGINEER", "PRODUCER", - * "DJMIXER" (ID3: "DJ-MIX") and "MIXER" (ID3: "MIX") are allowed. - */ - PropertyMap makeTIPLProperties() const; - /*! - * Parses the special structure of a TMCL frame. - */ - PropertyMap makeTMCLProperties() const; - class TextIdentificationFramePrivate; - TextIdentificationFramePrivate *d; - }; - - /*! - * This is a specialization of text identification frames that allows for - * user defined entries. Each entry has a description in addition to the - * normal list of fields that a text identification frame has. - * - * This description identifies the frame and must be unique. - */ - - //! An ID3v2 custom text identification frame implementationx - - class TAGLIB_EXPORT UserTextIdentificationFrame : public TextIdentificationFrame - { - friend class FrameFactory; - - public: - /*! - * Constructs an empty user defined text identification frame. For this to be - * a useful frame both a description and text must be set. - */ - explicit UserTextIdentificationFrame(String::Type encoding = String::Latin1); - - /*! - * Creates a frame based on \a data. - */ - explicit UserTextIdentificationFrame(const ByteVector &data); - - /*! - * Creates a user defined text identification frame with the given \a description - * and \a values. - */ - UserTextIdentificationFrame(const String &description, const StringList &values, String::Type encoding = String::UTF8); - - virtual String toString() const; - - /*! - * Returns the description for this frame. - */ - String description() const; - - /*! - * Sets the description of the frame to \a s. \a s must be unique. You can - * check for the presence of another user defined text frame of the same type - * using find() and testing for null. - */ - void setDescription(const String &s); - - StringList fieldList() const; - void setText(const String &text); - void setText(const StringList &fields); - - /*! - * A UserTextIdentificationFrame is parsed into a PropertyMap as follows: - * - the key is the frame's description, uppercased - * - if the description contains '::', only the substring after that - * separator is considered as key (compatibility with exfalso) - * - if the above rules don't yield a valid key (e.g. containing non-ASCII - * characters), the returned map will contain an entry "TXXX/<description>" - * in its unsupportedData() list. - * - The values will be copies of the fieldList(). - * - If the description() appears as value in fieldList(), it will be omitted - * in the value list, in order to be compatible with TagLib which copies - * the description() into the fieldList(). - */ - PropertyMap asProperties() const; - - /*! - * Searches for the user defined text frame with the description \a description - * in \a tag. This returns null if no matching frames were found. - */ - static UserTextIdentificationFrame *find(Tag *tag, const String &description); - - private: - UserTextIdentificationFrame(const ByteVector &data, Header *h); - UserTextIdentificationFrame(const TextIdentificationFrame &); - UserTextIdentificationFrame &operator=(const UserTextIdentificationFrame &); - - void checkFields(); - - class UserTextIdentificationFramePrivate; - UserTextIdentificationFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp deleted file mode 100644 index a0e842e..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <tdebug.h> - -#include "id3v2tag.h" -#include "uniquefileidentifierframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class UniqueFileIdentifierFrame::UniqueFileIdentifierFramePrivate -{ -public: - String owner; - ByteVector identifier; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data) : - ID3v2::Frame(data) -{ - d = new UniqueFileIdentifierFramePrivate; - setData(data); -} - -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const String &owner, const ByteVector &id) : - ID3v2::Frame("UFID") -{ - d = new UniqueFileIdentifierFramePrivate; - d->owner = owner; - d->identifier = id; -} - -UniqueFileIdentifierFrame::~UniqueFileIdentifierFrame() -{ - delete d; -} - -String UniqueFileIdentifierFrame::owner() const -{ - return d->owner; -} - -ByteVector UniqueFileIdentifierFrame::identifier() const -{ - return d->identifier; -} - -void UniqueFileIdentifierFrame::setOwner(const String &s) -{ - d->owner = s; -} - -void UniqueFileIdentifierFrame::setIdentifier(const ByteVector &v) -{ - d->identifier = v; -} - -String UniqueFileIdentifierFrame::toString() const -{ - return String::null; -} - -PropertyMap UniqueFileIdentifierFrame::asProperties() const -{ - PropertyMap map; - if(d->owner == "http://musicbrainz.org") { - map.insert("MUSICBRAINZ_TRACKID", String(d->identifier)); - } - else { - map.unsupportedData().append(frameID() + String("/") + d->owner); - } - return map; -} - -UniqueFileIdentifierFrame *UniqueFileIdentifierFrame::findByOwner(const ID3v2::Tag *tag, const String &o) // static -{ - ID3v2::FrameList comments = tag->frameList("UFID"); - - for(ID3v2::FrameList::ConstIterator it = comments.begin(); - it != comments.end(); - ++it) - { - UniqueFileIdentifierFrame *frame = dynamic_cast<UniqueFileIdentifierFrame *>(*it); - if(frame && frame->owner() == o) - return frame; - } - - return 0; -} - -void UniqueFileIdentifierFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 1) { - debug("An UFID frame must contain at least 1 byte."); - return; - } - - int pos = 0; - d->owner = readStringField(data, String::Latin1, &pos); - d->identifier = data.mid(pos); -} - -ByteVector UniqueFileIdentifierFrame::renderFields() const -{ - ByteVector data; - - data.append(d->owner.data(String::Latin1)); - data.append(char(0)); - data.append(d->identifier); - - return data; -} - -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data, Header *h) : - Frame(h) -{ - d = new UniqueFileIdentifierFramePrivate; - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h b/src/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h deleted file mode 100644 index add5a2e..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNIQUEFILEIDENTIFIERFRAME -#define TAGLIB_UNIQUEFILEIDENTIFIERFRAME - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - /*! - * This is an implementation of ID3v2 unique file identifier frames. This - * frame is used to identify the file in an arbitrary database identified - * by the owner field. - */ - - //! An implementation of ID3v2 unique identifier frames - - class TAGLIB_EXPORT UniqueFileIdentifierFrame : public ID3v2::Frame - { - friend class FrameFactory; - - public: - /*! - * Creates a uniqe file identifier frame based on \a data. - */ - UniqueFileIdentifierFrame(const ByteVector &data); - - /*! - * Creates a unique file identifier frame with the owner \a owner and - * the identification \a id. - */ - UniqueFileIdentifierFrame(const String &owner, const ByteVector &id); - - /*! - * Destroys the frame. - */ - ~UniqueFileIdentifierFrame(); - - /*! - * Returns the owner for the frame; essentially this is the key for - * determining which identification scheme this key belongs to. This - * will usually either be an email address or URL for the person or tool - * used to create the unique identifier. - * - * \see setOwner() - */ - String owner() const; - - /*! - * Returns the unique identifier. Though sometimes this is a text string - * it also may be binary data and as much should be assumed when handling - * it. - */ - ByteVector identifier() const; - - /*! - * Sets the owner of the identification scheme to \a s. - * - * \see owner() - */ - void setOwner(const String &s); - - /*! - * Sets the unique file identifier to \a v. - * - * \see identifier() - */ - void setIdentifier(const ByteVector &v); - - virtual String toString() const; - - PropertyMap asProperties() const; - - /*! - * UFID frames each have a unique owner. This searches for a UFID - * frame with the owner \a o and returns a pointer to it. - * - * \see owner() - */ - static UniqueFileIdentifierFrame *findByOwner(const Tag *tag, const String &o); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - UniqueFileIdentifierFrame(const UniqueFileIdentifierFrame &); - UniqueFileIdentifierFrame &operator=(const UniqueFileIdentifierFrame &); - - UniqueFileIdentifierFrame(const ByteVector &data, Header *h); - - class UniqueFileIdentifierFramePrivate; - UniqueFileIdentifierFramePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/unknownframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/unknownframe.cpp deleted file mode 100644 index 4def028..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/unknownframe.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "unknownframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class UnknownFrame::UnknownFramePrivate -{ -public: - ByteVector fieldData; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -UnknownFrame::UnknownFrame(const ByteVector &data) : Frame(data) -{ - d = new UnknownFramePrivate; - setData(data); -} - -UnknownFrame::~UnknownFrame() -{ - delete d; -} - -String UnknownFrame::toString() const -{ - return String::null; -} - -ByteVector UnknownFrame::data() const -{ - return d->fieldData; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void UnknownFrame::parseFields(const ByteVector &data) -{ - d->fieldData = data; -} - -ByteVector UnknownFrame::renderFields() const -{ - return d->fieldData; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -UnknownFrame::UnknownFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new UnknownFramePrivate; - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/unknownframe.h b/src/taglib/taglib/mpeg/id3v2/frames/unknownframe.h deleted file mode 100644 index 6559f4e..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/unknownframe.h +++ /dev/null @@ -1,79 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNKNOWNFRAME_H -#define TAGLIB_UNKNOWNFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! A frame type \e unknown to TagLib. - - /*! - * This class represents a frame type not known (or more often simply - * unimplemented) in TagLib. This is here provide a basic API for - * manipulating the binary data of unknown frames and to provide a means - * of rendering such \e unknown frames. - * - * Please note that a cleaner way of handling frame types that TagLib - * does not understand is to subclass ID3v2::Frame and ID3v2::FrameFactory - * to have your frame type supported through the standard ID3v2 mechanism. - */ - - class TAGLIB_EXPORT UnknownFrame : public Frame - { - friend class FrameFactory; - - public: - UnknownFrame(const ByteVector &data); - virtual ~UnknownFrame(); - - virtual String toString() const; - - /*! - * Returns the field data (everything but the header) for this frame. - */ - ByteVector data() const; - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - UnknownFrame(const ByteVector &data, Header *h); - UnknownFrame(const UnknownFrame &); - UnknownFrame &operator=(const UnknownFrame &); - - class UnknownFramePrivate; - UnknownFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp deleted file mode 100644 index 8f96cb8..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp +++ /dev/null @@ -1,193 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "unsynchronizedlyricsframe.h" -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include <tdebug.h> -#include <tpropertymap.h> - -using namespace TagLib; -using namespace ID3v2; - -class UnsynchronizedLyricsFrame::UnsynchronizedLyricsFramePrivate -{ -public: - UnsynchronizedLyricsFramePrivate() : textEncoding(String::Latin1) {} - String::Type textEncoding; - ByteVector language; - String description; - String text; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(String::Type encoding) : - Frame("USLT") -{ - d = new UnsynchronizedLyricsFramePrivate; - d->textEncoding = encoding; -} - -UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(const ByteVector &data) : - Frame(data) -{ - d = new UnsynchronizedLyricsFramePrivate; - setData(data); -} - -UnsynchronizedLyricsFrame::~UnsynchronizedLyricsFrame() -{ - delete d; -} - -String UnsynchronizedLyricsFrame::toString() const -{ - return d->text; -} - -ByteVector UnsynchronizedLyricsFrame::language() const -{ - return d->language; -} - -String UnsynchronizedLyricsFrame::description() const -{ - return d->description; -} - -String UnsynchronizedLyricsFrame::text() const -{ - return d->text; -} - -void UnsynchronizedLyricsFrame::setLanguage(const ByteVector &languageEncoding) -{ - d->language = languageEncoding.mid(0, 3); -} - -void UnsynchronizedLyricsFrame::setDescription(const String &s) -{ - d->description = s; -} - -void UnsynchronizedLyricsFrame::setText(const String &s) -{ - d->text = s; -} - - -String::Type UnsynchronizedLyricsFrame::textEncoding() const -{ - return d->textEncoding; -} - -void UnsynchronizedLyricsFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -PropertyMap UnsynchronizedLyricsFrame::asProperties() const -{ - PropertyMap map; - String key = description().upper(); - if(key.isEmpty() || key.upper() == "LYRICS") - map.insert("LYRICS", text()); - else if(key.isNull()) - map.unsupportedData().append(L"USLT/" + description()); - else - map.insert("LYRICS:" + key, text()); - return map; -} - -UnsynchronizedLyricsFrame *UnsynchronizedLyricsFrame::findByDescription(const ID3v2::Tag *tag, const String &d) // static -{ - ID3v2::FrameList lyrics = tag->frameList("USLT"); - - for(ID3v2::FrameList::ConstIterator it = lyrics.begin(); it != lyrics.end(); ++it){ - UnsynchronizedLyricsFrame *frame = dynamic_cast<UnsynchronizedLyricsFrame *>(*it); - if(frame && frame->description() == d) - return frame; - } - return 0; -} -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void UnsynchronizedLyricsFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 5) { - debug("An unsynchronized lyrics frame must contain at least 5 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - d->language = data.mid(1, 3); - - int byteAlign - = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; - - ByteVectorList l = - ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2); - - if(l.size() == 2) { - if(d->textEncoding == String::Latin1) { - d->description = Tag::latin1StringHandler()->parse(l.front()); - d->text = Tag::latin1StringHandler()->parse(l.back()); - } else { - d->description = String(l.front(), d->textEncoding); - d->text = String(l.back(), d->textEncoding); - } - } -} - -ByteVector UnsynchronizedLyricsFrame::renderFields() const -{ - ByteVector v; - - v.append(char(d->textEncoding)); - v.append(d->language.size() == 3 ? d->language : "XXX"); - v.append(d->description.data(d->textEncoding)); - v.append(textDelimiter(d->textEncoding)); - v.append(d->text.data(d->textEncoding)); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(const ByteVector &data, Header *h) - : Frame(h) -{ - d = new UnsynchronizedLyricsFramePrivate(); - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h b/src/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h deleted file mode 100644 index 3af354f..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h +++ /dev/null @@ -1,179 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H -#define TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 unsynchronized lyrics frame - /*! - * An implementation of ID3v2 unsynchronized lyrics. - */ - class TAGLIB_EXPORT UnsynchronizedLyricsFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty unsynchronized lyrics frame that will use the text encoding - * \a encoding. - */ - explicit UnsynchronizedLyricsFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a unsynchronized lyrics frame based on the data in \a data. - */ - explicit UnsynchronizedLyricsFrame(const ByteVector &data); - - /*! - * Destroys this UnsynchronizedLyricsFrame instance. - */ - virtual ~UnsynchronizedLyricsFrame(); - - /*! - * Returns the text of this unsynchronized lyrics frame. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the language encoding as a 3 byte encoding as specified by - * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>. - * - * \note Most taggers simply ignore this value. - * - * \see setLanguage() - */ - ByteVector language() const; - - /*! - * Returns the description of this unsynchronized lyrics frame. - * - * \note Most taggers simply ignore this value. - * - * \see setDescription() - */ - String description() const; - - /*! - * Returns the text of this unsynchronized lyrics frame. - * - * \see setText() - */ - String text() const; - - /*! - * Set the language using the 3 byte language code from - * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to - * \a languageCode. - * - * \see language() - */ - void setLanguage(const ByteVector &languageCode); - - /*! - * Sets the description of the unsynchronized lyrics frame to \a s. - * - * \see decription() - */ - void setDescription(const String &s); - - /*! - * Sets the text portion of the unsynchronized lyrics frame to \a s. - * - * \see text() - */ - virtual void setText(const String &s); - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - - /*! Parses this frame as PropertyMap with a single key. - * - if description() is empty or "LYRICS", the key will be "LYRICS" - * - if description() is not a valid PropertyMap key, the frame will be - * marked unsupported by an entry "USLT/<description>" in the unsupportedData() - * attribute of the returned map. - * - otherwise, the key will be "LYRICS:<description>" - * - The single value will be the frame's text(). - * Note that currently the language() field is not supported by the PropertyMap - * interface. - */ - PropertyMap asProperties() const; - - /*! - * LyricsFrames each have a unique description. This searches for a lyrics - * frame with the decription \a d and returns a pointer to it. If no - * frame is found that matches the given description null is returned. - * - * \see description() - */ - static UnsynchronizedLyricsFrame *findByDescription(const Tag *tag, const String &d); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - UnsynchronizedLyricsFrame(const ByteVector &data, Header *h); - UnsynchronizedLyricsFrame(const UnsynchronizedLyricsFrame &); - UnsynchronizedLyricsFrame &operator=(const UnsynchronizedLyricsFrame &); - - class UnsynchronizedLyricsFramePrivate; - UnsynchronizedLyricsFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/frames/urllinkframe.cpp b/src/taglib/taglib/mpeg/id3v2/frames/urllinkframe.cpp deleted file mode 100644 index 6bcbbda..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/urllinkframe.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "urllinkframe.h" -#include "id3v2tag.h" -#include <tdebug.h> -#include <tstringlist.h> -#include <tpropertymap.h> - -using namespace TagLib; -using namespace ID3v2; - -class UrlLinkFrame::UrlLinkFramePrivate -{ -public: - String url; -}; - -class UserUrlLinkFrame::UserUrlLinkFramePrivate -{ -public: - UserUrlLinkFramePrivate() : textEncoding(String::Latin1) {} - String::Type textEncoding; - String description; -}; - -UrlLinkFrame::UrlLinkFrame(const ByteVector &data) : - Frame(data) -{ - d = new UrlLinkFramePrivate; - setData(data); -} - -UrlLinkFrame::~UrlLinkFrame() -{ - delete d; -} - -void UrlLinkFrame::setUrl(const String &s) -{ - d->url = s; -} - -String UrlLinkFrame::url() const -{ - return d->url; -} - -void UrlLinkFrame::setText(const String &s) -{ - setUrl(s); -} - -String UrlLinkFrame::toString() const -{ - return url(); -} - -PropertyMap UrlLinkFrame::asProperties() const -{ - String key = frameIDToKey(frameID()); - PropertyMap map; - if(key.isNull()) - // unknown W*** frame - this normally shouldn't happen - map.unsupportedData().append(frameID()); - else - map.insert(key, url()); - return map; -} - -void UrlLinkFrame::parseFields(const ByteVector &data) -{ - d->url = String(data); -} - -ByteVector UrlLinkFrame::renderFields() const -{ - return d->url.data(String::Latin1); -} - -UrlLinkFrame::UrlLinkFrame(const ByteVector &data, Header *h) : Frame(h) -{ - d = new UrlLinkFramePrivate; - parseFields(fieldData(data)); -} - - -UserUrlLinkFrame::UserUrlLinkFrame(String::Type encoding) : - UrlLinkFrame("WXXX") -{ - d = new UserUrlLinkFramePrivate; - d->textEncoding = encoding; -} - -UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data) : - UrlLinkFrame(data) -{ - d = new UserUrlLinkFramePrivate; - setData(data); -} - -UserUrlLinkFrame::~UserUrlLinkFrame() -{ - delete d; -} - -String UserUrlLinkFrame::toString() const -{ - return "[" + description() + "] " + url(); -} - -String::Type UserUrlLinkFrame::textEncoding() const -{ - return d->textEncoding; -} - -void UserUrlLinkFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -String UserUrlLinkFrame::description() const -{ - return d->description; -} - -void UserUrlLinkFrame::setDescription(const String &s) -{ - d->description = s; -} - -PropertyMap UserUrlLinkFrame::asProperties() const -{ - PropertyMap map; - String key = description().upper(); - if(key.isEmpty() || key.upper() == "URL") - map.insert("URL", url()); - else if(key.isNull()) - map.unsupportedData().append(L"WXXX/" + description()); - else - map.insert("URL:" + key, url()); - return map; -} - -UserUrlLinkFrame *UserUrlLinkFrame::find(ID3v2::Tag *tag, const String &description) // static -{ - FrameList l = tag->frameList("WXXX"); - for(FrameList::Iterator it = l.begin(); it != l.end(); ++it) { - UserUrlLinkFrame *f = dynamic_cast<UserUrlLinkFrame *>(*it); - if(f && f->description() == description) - return f; - } - return 0; -} - -void UserUrlLinkFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 2) { - debug("A user URL link frame must contain at least 2 bytes."); - return; - } - - int pos = 0; - - d->textEncoding = String::Type(data[0]); - pos += 1; - - if(d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8) { - int offset = data.find(textDelimiter(d->textEncoding), pos); - if(offset < pos) - return; - - d->description = String(data.mid(pos, offset - pos), d->textEncoding); - pos = offset + 1; - } - else { - int len = data.mid(pos).find(textDelimiter(d->textEncoding), 0, 2); - if(len < 0) - return; - - d->description = String(data.mid(pos, len), d->textEncoding); - pos += len + 2; - } - - setUrl(String(data.mid(pos))); -} - -ByteVector UserUrlLinkFrame::renderFields() const -{ - ByteVector v; - - String::Type encoding = checkTextEncoding(d->description, d->textEncoding); - - v.append(char(encoding)); - v.append(d->description.data(encoding)); - v.append(textDelimiter(encoding)); - v.append(url().data(String::Latin1)); - - return v; -} - -UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data, Header *h) : UrlLinkFrame(data, h) -{ - d = new UserUrlLinkFramePrivate; - parseFields(fieldData(data)); -} diff --git a/src/taglib/taglib/mpeg/id3v2/frames/urllinkframe.h b/src/taglib/taglib/mpeg/id3v2/frames/urllinkframe.h deleted file mode 100644 index 7ac966b..0000000 --- a/src/taglib/taglib/mpeg/id3v2/frames/urllinkframe.h +++ /dev/null @@ -1,189 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_URLLINKFRAME_H -#define TAGLIB_URLLINKFRAME_H - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 URL frame - /*! - * An implementation of ID3v2 URL link frames. - */ - class TAGLIB_EXPORT UrlLinkFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit UrlLinkFrame(const ByteVector &data); - - /*! - * Destroys this UrlLinkFrame instance. - */ - virtual ~UrlLinkFrame(); - - /*! - * Returns the URL. - */ - virtual String url() const; - - /*! - * Sets the URL to \a s. - */ - virtual void setUrl(const String &s); - - // Reimplementations. - - virtual void setText(const String &s); - virtual String toString() const; - PropertyMap asProperties() const; - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - UrlLinkFrame(const ByteVector &data, Header *h); - - private: - UrlLinkFrame(const UrlLinkFrame &); - UrlLinkFrame &operator=(const UrlLinkFrame &); - - class UrlLinkFramePrivate; - UrlLinkFramePrivate *d; - }; - - //! ID3v2 User defined URL frame - - /*! - * This is a specialization of URL link frames that allows for - * user defined entries. Each entry has a description in addition to the - * normal list of fields that a URL link frame has. - * - * This description identifies the frame and must be unique. - */ - class TAGLIB_EXPORT UserUrlLinkFrame : public UrlLinkFrame - { - friend class FrameFactory; - - public: - /*! - * Constructs an empty user defined URL link frame. For this to be - * a useful frame both a description and text must be set. - */ - explicit UserUrlLinkFrame(String::Type encoding = String::Latin1); - - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit UserUrlLinkFrame(const ByteVector &data); - - /*! - * Destroys this UserUrlLinkFrame instance. - */ - virtual ~UserUrlLinkFrame(); - - // Reimplementations. - - virtual String toString() const; - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns the description for this frame. - */ - String description() const; - - /*! - * Sets the description of the frame to \a s. \a s must be unique. - */ - void setDescription(const String &s); - - /*! - * Parses the UserUrlLinkFrame as PropertyMap. The description() is taken as key, - * and the URL as single value. - * - if description() is empty, the key will be "URL". - * - otherwise, if description() is not a valid key (e.g. containing non-ASCII - * characters), the returned map will contain an entry "WXXX/<description>" - * in its unsupportedData() list. - */ - PropertyMap asProperties() const; - - /*! - * Searches for the user defined url frame with the description \a description - * in \a tag. This returns null if no matching frames were found. - */ - static UserUrlLinkFrame *find(Tag *tag, const String &description); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - UserUrlLinkFrame(const ByteVector &data, Header *h); - - private: - UserUrlLinkFrame(const UserUrlLinkFrame &); - UserUrlLinkFrame &operator=(const UserUrlLinkFrame &); - - class UserUrlLinkFramePrivate; - UserUrlLinkFramePrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2.2.0.txt b/src/taglib/taglib/mpeg/id3v2/id3v2.2.0.txt deleted file mode 100644 index a69bddd..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2.2.0.txt +++ /dev/null @@ -1,1660 +0,0 @@ - -Informal standard M. Nilsson -Document: id3v2-00.txt 26th March 1998 - - - ID3 tag version 2 - -Status of this document - - This document is an Informal standard and is released so that - implementors could have a set standard before the formal standard is - set. The formal standard will use another version number if not - identical to what is described in this document. The contents in this - document may change for clarifications but never for added or altered - functionallity. - - Distribution of this document is unlimited. - - -Abstract - - The recent gain of popularity for MPEG layer III audio files on the - internet forced a standardised way of storing information about an - audio file within itself to determinate its origin and contents. - - Today the most accepted way to do this is with the so called ID3 tag, - which is simple but very limited and in some cases very unsuitable. - The ID3 tag has very limited space in every field, very limited - numbers of fields, not expandable or upgradeable and is placed at the - end of a the file, which is unsuitable for streaming audio. This draft - is an attempt to answer these issues with a new version of the ID3 - tag. - - -1. Table of contents - - 2. Conventions in this document - 3. ID3v2 overview - 3.1. ID3v2 header - 3.2. ID3v2 frames overview - 4. Declared ID3v2 frames - 4.1. Unique file identifier - 4.2. Text information frames - 4.2.1. Text information frames - details - 4.2.2. User defined text information frame - 4.3. URL link frames - 4.3.1. URL link frames - details - 4.3.2. User defined URL link frame - 4.4. Involved people list - 4.5. Music CD Identifier - 4.6. Event timing codes - 4.7. MPEG location lookup table - 4.8. Synced tempo codes - 4.9. Unsychronised lyrics/text transcription - 4.10. Synchronised lyrics/text - 4.11. Comments - 4.12. Relative volume adjustment - 4.13. Equalisation - 4.14. Reverb - 4.15. Attached picture - 4.16. General encapsulated object - 4.17. Play counter - 4.18. Popularimeter - 4.19. Recommended buffer size - 4.20. Encrypted meta frame - 4.21. Audio encryption - 4.22. Linked information - 5. The 'unsynchronisation scheme' - 6. Copyright - 7. References - 8. Appendix - A. Appendix A - ID3-Tag Specification V1.1 - A.1. Overview - A.2. ID3v1 Implementation - A.3. Genre List - A.4. Track addition - ID3v1.1 - 9. Author's Address - - -2. Conventions in this document - - In the examples, text within "" is a text string exactly as it appears - in a file. Numbers preceded with $ are hexadecimal and numbers - preceded with % are binary. $xx is used to indicate a byte with - unknown content. %x is used to indicate a bit with unknown content. - The most significant bit (MSB) of a byte is called 'bit 7' and the - least significant bit (LSB) is called 'bit 0'. - - A tag is the whole tag described in this document. A frame is a block - of information in the tag. The tag consists of a header, frames and - optional padding. A field is a piece of information; one value, a - string etc. A numeric string is a string that consists of the - characters 0-9 only. - - -3. ID3v2 overview - - The two biggest design goals were to be able to implement ID3v2 - without disturbing old software too much and that ID3v2 should be - expandable. - - The first criterion is met by the simple fact that the MPEG [MPEG] - decoding software uses a syncsignal, embedded in the audiostream, to - 'lock on to' the audio. Since the ID3v2 tag doesn't contain a valid - syncsignal, no software will attempt to play the tag. If, for any - reason, coincidence make a syncsignal appear within the tag it will be - taken care of by the 'unsynchronisation scheme' described in section - 5. - - The second criterion has made a more noticeable impact on the design - of the ID3v2 tag. It is constructed as a container for several - information blocks, called frames, whose format need not be known to - the software that encounters them. At the start of every frame there - is an identifier that explains the frames's format and content, and a - size descriptor that allows software to skip unknown frames. - - If a total revision of the ID3v2 tag should be needed, there is a - version number and a size descriptor in the ID3v2 header. - - The ID3 tag described in this document is mainly targeted to files - encoded with MPEG-2 layer I, MPEG-2 layer II, MPEG-2 layer III and - MPEG-2.5, but may work with other types of encoded audio. - - The bitorder in ID3v2 is most significant bit first (MSB). The - byteorder in multibyte numbers is most significant byte first (e.g. - $12345678 would be encoded $12 34 56 78). - - It is permitted to include padding after all the final frame (at the - end of the ID3 tag), making the size of all the frames together - smaller than the size given in the head of the tag. A possible purpose - of this padding is to allow for adding a few additional frames or - enlarge existing frames within the tag without having to rewrite the - entire file. The value of the padding bytes must be $00. - - -3.1. ID3v2 header - - The ID3v2 tag header, which should be the first information in the - file, is 10 bytes as follows: - - ID3/file identifier "ID3" - ID3 version $02 00 - ID3 flags %xx000000 - ID3 size 4 * %0xxxxxxx - - The first three bytes of the tag are always "ID3" to indicate that - this is an ID3 tag, directly followed by the two version bytes. The - first byte of ID3 version is it's major version, while the second byte - is its revision number. All revisions are backwards compatible while - major versions are not. If software with ID3v2 and below support - should encounter version three or higher it should simply ignore the - whole tag. Version and revision will never be $FF. - - The first bit (bit 7) in the 'ID3 flags' is indicating whether or not - unsynchronisation is used (see section 5 for details); a set bit - indicates usage. - - The second bit (bit 6) is indicating whether or not compression is - used; a set bit indicates usage. Since no compression scheme has been - decided yet, the ID3 decoder (for now) should just ignore the entire - tag if the compression bit is set. - - The ID3 tag size is encoded with four bytes where the first bit (bit - 7) is set to zero in every byte, making a total of 28 bits. The zeroed - bits are ignored, so a 257 bytes long tag is represented as $00 00 02 - 01. - - The ID3 tag size is the size of the complete tag after - unsychronisation, including padding, excluding the header (total tag - size - 10). The reason to use 28 bits (representing up to 256MB) for - size description is that we don't want to run out of space here. - - A ID3v2 tag can be detected with the following pattern: - $49 44 33 yy yy xx zz zz zz zz - Where yy is less than $FF, xx is the 'flags' byte and zz is less than - $80. - - -3.2. ID3v2 frames overview - - The headers of the frames are similar in their construction. They - consist of one three character identifier (capital A-Z and 0-9) and - one three byte size field, making a total of six bytes. The header is - excluded from the size. Identifiers beginning with "X", "Y" and "Z" - are for experimental use and free for everyone to use. Have in mind - that someone else might have used the same identifier as you. All - other identifiers are either used or reserved for future use. - - The three character frame identifier is followed by a three byte size - descriptor, making a total header size of six bytes in every frame. - The size is calculated as framesize excluding frame identifier and - size descriptor (frame size - 6). - - There is no fixed order of the frames' appearance in the tag, although - it is desired that the frames are arranged in order of significance - concerning the recognition of the file. An example of such order: - UFI, MCI, TT2 ... - - A tag must contain at least one frame. A frame must be at least 1 byte - big, excluding the 6-byte header. - - If nothing else is said a string is represented as ISO-8859-1 - [ISO-8859-1] characters in the range $20 - $FF. All unicode strings - [UNICODE] use 16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). All - numeric strings are always encoded as ISO-8859-1. Terminated strings - are terminated with $00 if encoded with ISO-8859-1 and $00 00 if - encoded as unicode. If nothing else is said newline character is - forbidden. In ISO-8859-1 a new line is represented, when allowed, with - $0A only. Frames that allow different types of text encoding have a - text encoding description byte directly after the frame size. If - ISO-8859-1 is used this byte should be $00, if unicode is used it - should be $01. - - The three byte language field is used to describe the language of the - frame's content, according to ISO-639-2 [ISO-639-2]. - - All URLs [URL] may be relative, e.g. "picture.png", "../doc.txt". - - If a frame is longer than it should be, e.g. having more fields than - specified in this document, that indicates that additions to the - frame have been made in a later version of the ID3 standard. This - is reflected by the revision number in the header of the tag. - - -4. Declared ID3v2 frames - - The following frames are declared in this draft. - - 4.19 BUF Recommended buffer size - - 4.17 CNT Play counter - 4.11 COM Comments - 4.21 CRA Audio encryption - 4.20 CRM Encrypted meta frame - - 4.6 ETC Event timing codes - 4.13 EQU Equalization - - 4.16 GEO General encapsulated object - - 4.4 IPL Involved people list - - 4.22 LNK Linked information - - 4.5 MCI Music CD Identifier - 4.7 MLL MPEG location lookup table - - 4.15 PIC Attached picture - 4.18 POP Popularimeter - - 4.14 REV Reverb - 4.12 RVA Relative volume adjustment - - 4.10 SLT Synchronized lyric/text - 4.8 STC Synced tempo codes - - 4.2.1 TAL Album/Movie/Show title - 4.2.1 TBP BPM (Beats Per Minute) - 4.2.1 TCM Composer - 4.2.1 TCO Content type - 4.2.1 TCR Copyright message - 4.2.1 TDA Date - 4.2.1 TDY Playlist delay - 4.2.1 TEN Encoded by - 4.2.1 TFT File type - 4.2.1 TIM Time - 4.2.1 TKE Initial key - 4.2.1 TLA Language(s) - 4.2.1 TLE Length - 4.2.1 TMT Media type - 4.2.1 TOA Original artist(s)/performer(s) - 4.2.1 TOF Original filename - 4.2.1 TOL Original Lyricist(s)/text writer(s) - 4.2.1 TOR Original release year - 4.2.1 TOT Original album/Movie/Show title - 4.2.1 TP1 Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group - 4.2.1 TP2 Band/Orchestra/Accompaniment - 4.2.1 TP3 Conductor/Performer refinement - 4.2.1 TP4 Interpreted, remixed, or otherwise modified by - 4.2.1 TPA Part of a set - 4.2.1 TPB Publisher - 4.2.1 TRC ISRC (International Standard Recording Code) - 4.2.1 TRD Recording dates - 4.2.1 TRK Track number/Position in set - 4.2.1 TSI Size - 4.2.1 TSS Software/hardware and settings used for encoding - 4.2.1 TT1 Content group description - 4.2.1 TT2 Title/Songname/Content description - 4.2.1 TT3 Subtitle/Description refinement - 4.2.1 TXT Lyricist/text writer - 4.2.2 TXX User defined text information frame - 4.2.1 TYE Year - - 4.1 UFI Unique file identifier - 4.9 ULT Unsychronized lyric/text transcription - - 4.3.1 WAF Official audio file webpage - 4.3.1 WAR Official artist/performer webpage - 4.3.1 WAS Official audio source webpage - 4.3.1 WCM Commercial information - 4.3.1 WCP Copyright/Legal information - 4.3.1 WPB Publishers official webpage - 4.3.2 WXX User defined URL link frame - - -4.1. Unique file identifier - - This frame's purpose is to be able to identify the audio file in a - database that may contain more information relevant to the content. - Since standardisation of such a database is beyond this document, all - frames begin with a null-terminated string with a URL [URL] containing - an email address, or a link to a location where an email address can - be found, that belongs to the organisation responsible for this - specific database implementation. Questions regarding the database - should be sent to the indicated email address. The URL should not be - used for the actual database queries. If a $00 is found directly after - the 'Frame size' the whole frame should be ignored, and preferably be - removed. The 'Owner identifier' is then followed by the actual - identifier, which may be up to 64 bytes. There may be more than one - "UFI" frame in a tag, but only one with the same 'Owner identifier'. - - Unique file identifier "UFI" - Frame size $xx xx xx - Owner identifier <textstring> $00 - Identifier <up to 64 bytes binary data> - - -4.2. Text information frames - - The text information frames are the most important frames, containing - information like artist, album and more. There may only be one text - information frame of its kind in an tag. If the textstring is followed - by a termination ($00 (00)) all the following information should be - ignored and not be displayed. All the text information frames have the - following format: - - Text information identifier "T00" - "TZZ" , excluding "TXX", - described in 4.2.2. - Frame size $xx xx xx - Text encoding $xx - Information <textstring> - - -4.2.1. Text information frames - details - - TT1 - The 'Content group description' frame is used if the sound belongs to - a larger category of sounds/music. For example, classical music is - often sorted in different musical sections (e.g. "Piano Concerto", - "Weather - Hurricane"). - - TT2 - The 'Title/Songname/Content description' frame is the actual name of - the piece (e.g. "Adagio", "Hurricane Donna"). - - TT3 - The 'Subtitle/Description refinement' frame is used for information - directly related to the contents title (e.g. "Op. 16" or "Performed - live at wembley"). - - TP1 - The 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group' is - used for the main artist(s). They are seperated with the "/" - character. - - TP2 - The 'Band/Orchestra/Accompaniment' frame is used for additional - information about the performers in the recording. - - TP3 - The 'Conductor' frame is used for the name of the conductor. - - TP4 - The 'Interpreted, remixed, or otherwise modified by' frame contains - more information about the people behind a remix and similar - interpretations of another existing piece. - - TCM - The 'Composer(s)' frame is intended for the name of the composer(s). - They are seperated with the "/" character. - - TXT - The 'Lyricist(s)/text writer(s)' frame is intended for the writer(s) - of the text or lyrics in the recording. They are seperated with the - "/" character. - - TLA - The 'Language(s)' frame should contain the languages of the text or - lyrics in the audio file. The language is represented with three - characters according to ISO-639-2. If more than one language is used - in the text their language codes should follow according to their - usage. - - TCO - The content type, which previously (in ID3v1.1, see appendix A) was - stored as a one byte numeric value only, is now a numeric string. You - may use one or several of the types as ID3v1.1 did or, since the - category list would be impossible to maintain with accurate and up to - date categories, define your own. - References to the ID3v1 genres can be made by, as first byte, enter - "(" followed by a number from the genres list (section A.3.) and - ended with a ")" character. This is optionally followed by a - refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be - made in the same frame, e.g. "(51)(39)". If the refinement should - begin with a "(" character it should be replaced with "((", e.g. "((I - can figure out any genre)" or "(55)((I think...)". The following new - content types is defined in ID3v2 and is implemented in the same way - as the numerig content types, e.g. "(RX)". - - RX Remix - CR Cover - - TAL - The 'Album/Movie/Show title' frame is intended for the title of the - recording(/source of sound) which the audio in the file is taken from. - - TPA - The 'Part of a set' frame is a numeric string that describes which - part of a set the audio came from. This frame is used if the source - described in the "TAL" frame is divided into several mediums, e.g. a - double CD. The value may be extended with a "/" character and a - numeric string containing the total number of parts in the set. E.g. - "1/2". - - TRK - The 'Track number/Position in set' frame is a numeric string - containing the order number of the audio-file on its original - recording. This may be extended with a "/" character and a numeric - string containing the total numer of tracks/elements on the original - recording. E.g. "4/9". - - TRC - The 'ISRC' frame should contian the International Standard Recording - Code [ISRC]. - - TYE - The 'Year' frame is a numeric string with a year of the recording. - This frames is always four characters long (until the year 10000). - - TDA - The 'Date' frame is a numeric string in the DDMM format containing - the date for the recording. This field is always four characters - long. - - TIM - The 'Time' frame is a numeric string in the HHMM format containing - the time for the recording. This field is always four characters - long. - - TRD - The 'Recording dates' frame is a intended to be used as complement to - the "TYE", "TDA" and "TIM" frames. E.g. "4th-7th June, 12th June" in - combination with the "TYE" frame. - - TMT - The 'Media type' frame describes from which media the sound - originated. This may be a textstring or a reference to the predefined - media types found in the list below. References are made within "(" - and ")" and are optionally followed by a text refinement, e.g. "(MC) - with four channels". If a text refinement should begin with a "(" - character it should be replaced with "((" in the same way as in the - "TCO" frame. Predefined refinements is appended after the media type, - e.g. "(CD/S)" or "(VID/PAL/VHS)". - - DIG Other digital media - /A Analog transfer from media - - ANA Other analog media - /WAC Wax cylinder - /8CA 8-track tape cassette - - CD CD - /A Analog transfer from media - /DD DDD - /AD ADD - /AA AAD - - LD Laserdisc - /A Analog transfer from media - - TT Turntable records - /33 33.33 rpm - /45 45 rpm - /71 71.29 rpm - /76 76.59 rpm - /78 78.26 rpm - /80 80 rpm - - MD MiniDisc - /A Analog transfer from media - - DAT DAT - /A Analog transfer from media - /1 standard, 48 kHz/16 bits, linear - /2 mode 2, 32 kHz/16 bits, linear - /3 mode 3, 32 kHz/12 bits, nonlinear, low speed - /4 mode 4, 32 kHz/12 bits, 4 channels - /5 mode 5, 44.1 kHz/16 bits, linear - /6 mode 6, 44.1 kHz/16 bits, 'wide track' play - - DCC DCC - /A Analog transfer from media - - DVD DVD - /A Analog transfer from media - - TV Television - /PAL PAL - /NTSC NTSC - /SECAM SECAM - - VID Video - /PAL PAL - /NTSC NTSC - /SECAM SECAM - /VHS VHS - /SVHS S-VHS - /BETA BETAMAX - - RAD Radio - /FM FM - /AM AM - /LW LW - /MW MW - - TEL Telephone - /I ISDN - - MC MC (normal cassette) - /4 4.75 cm/s (normal speed for a two sided cassette) - /9 9.5 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - REE Reel - /9 9.5 cm/s - /19 19 cm/s - /38 38 cm/s - /76 76 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - TFT - The 'File type' frame indicates which type of audio this tag defines. - The following type and refinements are defined: - - MPG MPEG Audio - /1 MPEG 2 layer I - /2 MPEG 2 layer II - /3 MPEG 2 layer III - /2.5 MPEG 2.5 - /AAC Advanced audio compression - - but other types may be used, not for these types though. This is used - in a similar way to the predefined types in the "TMT" frame, but - without parenthesis. If this frame is not present audio type is - assumed to be "MPG". - - TBP - BPM is short for beats per minute, and is easily computed by - dividing the number of beats in a musical piece with its length. To - get a more accurate result, do the BPM calculation on the main-part - only. To acquire best result measure the time between each beat and - calculate individual BPM for each beat and use the median value as - result. BPM is an integer and represented as a numerical string. - - TCR - The 'Copyright message' frame, which must begin with a year and a - space character (making five characters), is intended for the - copyright holder of the original sound, not the audio file itself. The - absence of this frame means only that the copyright information is - unavailable or has been removed, and must not be interpreted to mean - that the sound is public domain. Every time this field is displayed - the field must be preceded with "Copyright " (C) " ", where (C) is one - character showing a C in a circle. - - TPB - The 'Publisher' frame simply contains the name of the label or - publisher. - - TEN - The 'Encoded by' frame contains the name of the person or - organisation that encoded the audio file. This field may contain a - copyright message, if the audio file also is copyrighted by the - encoder. - - TSS - The 'Software/hardware and settings used for encoding' frame - includes the used audio encoder and its settings when the file was - encoded. Hardware refers to hardware encoders, not the computer on - which a program was run. - - TOF - The 'Original filename' frame contains the preferred filename for the - file, since some media doesn't allow the desired length of the - filename. The filename is case sensitive and includes its suffix. - - TLE - The 'Length' frame contains the length of the audiofile in - milliseconds, represented as a numeric string. - - TSI - The 'Size' frame contains the size of the audiofile in bytes - excluding the tag, represented as a numeric string. - - TDY - The 'Playlist delay' defines the numbers of milliseconds of silence - between every song in a playlist. The player should use the "ETC" - frame, if present, to skip initial silence and silence at the end of - the audio to match the 'Playlist delay' time. The time is represented - as a numeric string. - - TKE - The 'Initial key' frame contains the musical key in which the sound - starts. It is represented as a string with a maximum length of three - characters. The ground keys are represented with "A","B","C","D","E", - "F" and "G" and halfkeys represented with "b" and "#". Minor is - represented as "m". Example "Cbm". Off key is represented with an "o" - only. - - TOT - The 'Original album/Movie/Show title' frame is intended for the title - of the original recording(/source of sound), if for example the music - in the file should be a cover of a previously released song. - - TOA - The 'Original artist(s)/performer(s)' frame is intended for the - performer(s) of the original recording, if for example the music in - the file should be a cover of a previously released song. The - performers are seperated with the "/" character. - - TOL - The 'Original Lyricist(s)/text writer(s)' frame is intended for the - text writer(s) of the original recording, if for example the music in - the file should be a cover of a previously released song. The text - writers are seperated with the "/" character. - - TOR - The 'Original release year' frame is intended for the year when the - original recording, if for example the music in the file should be a - cover of a previously released song, was released. The field is - formatted as in the "TDY" frame. - - -4.2.2. User defined text information frame - - This frame is intended for one-string text information concerning the - audiofile in a similar way to the other "T"xx frames. The frame body - consists of a description of the string, represented as a terminated - string, followed by the actual string. There may be more than one - "TXX" frame in each tag, but only one with the same description. - - User defined... "TXX" - Frame size $xx xx xx - Text encoding $xx - Description <textstring> $00 (00) - Value <textstring> - - -4.3. URL link frames - - With these frames dynamic data such as webpages with touring - information, price information or plain ordinary news can be added to - the tag. There may only be one URL [URL] link frame of its kind in an - tag, except when stated otherwise in the frame description. If the - textstring is followed by a termination ($00 (00)) all the following - information should be ignored and not be displayed. All URL link - frames have the following format: - - URL link frame "W00" - "WZZ" , excluding "WXX" - (described in 4.3.2.) - Frame size $xx xx xx - URL <textstring> - - -4.3.1. URL link frames - details - - WAF - The 'Official audio file webpage' frame is a URL pointing at a file - specific webpage. - - WAR - The 'Official artist/performer webpage' frame is a URL pointing at - the artists official webpage. There may be more than one "WAR" frame - in a tag if the audio contains more than one performer. - - WAS - The 'Official audio source webpage' frame is a URL pointing at the - official webpage for the source of the audio file, e.g. a movie. - - WCM - The 'Commercial information' frame is a URL pointing at a webpage - with information such as where the album can be bought. There may be - more than one "WCM" frame in a tag. - - WCP - The 'Copyright/Legal information' frame is a URL pointing at a - webpage where the terms of use and ownership of the file is described. - - WPB - The 'Publishers official webpage' frame is a URL pointing at the - official wepage for the publisher. - - -4.3.2. User defined URL link frame - - This frame is intended for URL [URL] links concerning the audiofile in - a similar way to the other "W"xx frames. The frame body consists of a - description of the string, represented as a terminated string, - followed by the actual URL. The URL is always encoded with ISO-8859-1 - [ISO-8859-1]. There may be more than one "WXX" frame in each tag, but - only one with the same description. - - User defined... "WXX" - Frame size $xx xx xx - Text encoding $xx - Description <textstring> $00 (00) - URL <textstring> - - -4.4. Involved people list - - Since there might be a lot of people contributing to an audio file in - various ways, such as musicians and technicians, the 'Text - information frames' are often insufficient to list everyone involved - in a project. The 'Involved people list' is a frame containing the - names of those involved, and how they were involved. The body simply - contains a terminated string with the involvement directly followed by - a terminated string with the involvee followed by a new involvement - and so on. There may only be one "IPL" frame in each tag. - - Involved people list "IPL" - Frame size $xx xx xx - Text encoding $xx - People list strings <textstrings> - - -4.5. Music CD Identifier - - This frame is intended for music that comes from a CD, so that the CD - can be identified in databases such as the CDDB [CDDB]. The frame - consists of a binary dump of the Table Of Contents, TOC, from the CD, - which is a header of 4 bytes and then 8 bytes/track on the CD making a - maximum of 804 bytes. This frame requires a present and valid "TRK" - frame. There may only be one "MCI" frame in each tag. - - Music CD identifier "MCI" - Frame size $xx xx xx - CD TOC <binary data> - - -4.6. Event timing codes - - This frame allows synchronisation with key events in a song or sound. - The head is: - - Event timing codes "ETC" - Frame size $xx xx xx - Time stamp format $xx - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - Followed by a list of key events in the following format: - - Type of event $xx - Time stamp $xx (xx ...) - - The 'Time stamp' is set to zero if directly at the beginning of the - sound or after the previous event. All events should be sorted in - chronological order. The type of event is as follows: - - $00 padding (has no meaning) - $01 end of initial silence - $02 intro start - $03 mainpart start - $04 outro start - $05 outro end - $06 verse begins - $07 refrain begins - $08 interlude - $09 theme start - $0A variation - $0B key change - $0C time change - $0D unwanted noise (Snap, Crackle & Pop) - - $0E-$DF reserved for future use - - $E0-$EF not predefined sync 0-F - - $F0-$FC reserved for future use - - $FD audio end (start of silence) - $FE audio file ends - $FF one more byte of events follows (all the following bytes with - the value $FF have the same function) - - The 'Not predefined sync's ($E0-EF) are for user events. You might - want to synchronise your music to something, like setting of an - explosion on-stage, turning on your screensaver etc. - - There may only be one "ETC" frame in each tag. - - -4.7. MPEG location lookup table - - To increase performance and accuracy of jumps within a MPEG [MPEG] - audio file, frames with timecodes in different locations in the file - might be useful. The ID3 frame includes references that the software - can use to calculate positions in the file. After the frame header is - a descriptor of how much the 'frame counter' should increase for every - reference. If this value is two then the first reference points out - the second frame, the 2nd reference the 4th frame, the 3rd reference - the 6th frame etc. In a similar way the 'bytes between reference' and - 'milliseconds between reference' points out bytes and milliseconds - respectively. - - Each reference consists of two parts; a certain number of bits, as - defined in 'bits for bytes deviation', that describes the difference - between what is said in 'bytes between reference' and the reality and - a certain number of bits, as defined in 'bits for milliseconds - deviation', that describes the difference between what is said in - 'milliseconds between reference' and the reality. The number of bits - in every reference, i.e. 'bits for bytes deviation'+'bits for - milliseconds deviation', must be a multiple of four. There may only be - one "MLL" frame in each tag. - - Location lookup table "MLL" - ID3 frame size $xx xx xx - MPEG frames between reference $xx xx - Bytes between reference $xx xx xx - Milliseconds between reference $xx xx xx - Bits for bytes deviation $xx - Bits for milliseconds dev. $xx - - Then for every reference the following data is included; - - Deviation in bytes %xxx.... - Deviation in milliseconds %xxx.... - - -4.8. Synced tempo codes - - For a more accurate description of the tempo of a musical piece this - frame might be used. After the header follows one byte describing - which time stamp format should be used. Then follows one or more tempo - codes. Each tempo code consists of one tempo part and one time part. - The tempo is in BPM described with one or two bytes. If the first byte - has the value $FF, one more byte follows, which is added to the first - giving a range from 2 - 510 BPM, since $00 and $01 is reserved. $00 is - used to describe a beat-free time period, which is not the same as a - music-free time period. $01 is used to indicate one single beat-stroke - followed by a beat-free period. - - The tempo descriptor is followed by a time stamp. Every time the tempo - in the music changes, a tempo descriptor may indicate this for the - player. All tempo descriptors should be sorted in chronological order. - The first beat-stroke in a time-period is at the same time as the beat - description occurs. There may only be one "STC" frame in each tag. - - Synced tempo codes "STC" - Frame size $xx xx xx - Time stamp format $xx - Tempo data <binary data> - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - -4.9. Unsychronised lyrics/text transcription - - This frame contains the lyrics of the song or a text transcription of - other vocal activities. The head includes an encoding descriptor and - a content descriptor. The body consists of the actual text. The - 'Content descriptor' is a terminated string. If no descriptor is - entered, 'Content descriptor' is $00 (00) only. Newline characters - are allowed in the text. Maximum length for the descriptor is 64 - bytes. There may be more than one lyrics/text frame in each tag, but - only one with the same language and content descriptor. - - Unsynced lyrics/text "ULT" - Frame size $xx xx xx - Text encoding $xx - Language $xx xx xx - Content descriptor <textstring> $00 (00) - Lyrics/text <textstring> - - -4.10. Synchronised lyrics/text - - This is another way of incorporating the words, said or sung lyrics, - in the audio file as text, this time, however, in sync with the audio. - It might also be used to describing events e.g. occurring on a stage - or on the screen in sync with the audio. The header includes a content - descriptor, represented with as terminated textstring. If no - descriptor is entered, 'Content descriptor' is $00 (00) only. - - Synced lyrics/text "SLT" - Frame size $xx xx xx - Text encoding $xx - Language $xx xx xx - Time stamp format $xx - Content type $xx - Content descriptor <textstring> $00 (00) - - - Encoding: $00 ISO-8859-1 [ISO-8859-1] character set is used => $00 - is sync identifier. - $01 Unicode [UNICODE] character set is used => $00 00 is - sync identifier. - - Content type: $00 is other - $01 is lyrics - $02 is text transcription - $03 is movement/part name (e.g. "Adagio") - $04 is events (e.g. "Don Quijote enters the stage") - $05 is chord (e.g. "Bb F Fsus") - - Time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - The text that follows the frame header differs from that of the - unsynchronised lyrics/text transcription in one major way. Each - syllable (or whatever size of text is considered to be convenient by - the encoder) is a null terminated string followed by a time stamp - denoting where in the sound file it belongs. Each sync thus has the - following structure: - - Terminated text to be synced (typically a syllable) - Sync identifier (terminator to above string) $00 (00) - Time stamp $xx (xx ...) - - The 'time stamp' is set to zero or the whole sync is omitted if - located directly at the beginning of the sound. All time stamps should - be sorted in chronological order. The sync can be considered as a - validator of the subsequent string. - - Newline characters are allowed in all "SLT" frames and should be used - after every entry (name, event etc.) in a frame with the content type - $03 - $04. - - A few considerations regarding whitespace characters: Whitespace - separating words should mark the beginning of a new word, thus - occurring in front of the first syllable of a new word. This is also - valid for new line characters. A syllable followed by a comma should - not be broken apart with a sync (both the syllable and the comma - should be before the sync). - - An example: The "ULT" passage - - "Strangers in the night" $0A "Exchanging glances" - - would be "SLT" encoded as: - - "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx - " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx - xx "glan" $00 xx xx "ces" $00 xx xx - - There may be more than one "SLT" frame in each tag, but only one with - the same language and content descriptor. - - -4.11. Comments - - This frame replaces the old 30-character comment field in ID3v1. It - consists of a frame head followed by encoding, language and content - descriptors and is ended with the actual comment as a text string. - Newline characters are allowed in the comment text string. There may - be more than one comment frame in each tag, but only one with the same - language and content descriptor. - - Comment "COM" - Frame size $xx xx xx - Text encoding $xx - Language $xx xx xx - Short content description <textstring> $00 (00) - The actual text <textstring> - - -4.12. Relative volume adjustment - - This is a more subjective function than the previous ones. It allows - the user to say how much he wants to increase/decrease the volume on - each channel while the file is played. The purpose is to be able to - align all files to a reference volume, so that you don't have to - change the volume constantly. This frame may also be used to balance - adjust the audio. If the volume peak levels are known then this could - be described with the 'Peak volume right' and 'Peak volume left' - field. If Peakvolume is not known these fields could be left zeroed - or completely omitted. There may only be one "RVA" frame in each - tag. - - Relative volume adjustment "RVA" - Frame size $xx xx xx - Increment/decrement %000000xx - Bits used for volume descr. $xx - Relative volume change, right $xx xx (xx ...) - Relative volume change, left $xx xx (xx ...) - Peak volume right $xx xx (xx ...) - Peak volume left $xx xx (xx ...) - - In the increment/decrement field bit 0 is used to indicate the right - channel and bit 1 is used to indicate the left channel. 1 is - increment and 0 is decrement. - - The 'bits used for volume description' field is normally $10 (16 bits) - for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not - be $00. The volume is always represented with whole bytes, padded in - the beginning (highest bits) when 'bits used for volume description' - is not a multiple of eight. - - -4.13. Equalisation - - This is another subjective, alignment frame. It allows the user to - predefine an equalisation curve within the audio file. There may only - be one "EQU" frame in each tag. - - Equalisation "EQU" - Frame size $xx xx xx - Adjustment bits $xx - - The 'adjustment bits' field defines the number of bits used for - representation of the adjustment. This is normally $10 (16 bits) for - MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be - $00. - - This is followed by 2 bytes + ('adjustment bits' rounded up to the - nearest byte) for every equalisation band in the following format, - giving a frequency range of 0 - 32767Hz: - - Increment/decrement %x (MSB of the Frequency) - Frequency (lower 15 bits) - Adjustment $xx (xx ...) - - The increment/decrement bit is 1 for increment and 0 for decrement. - The equalisation bands should be ordered increasingly with reference - to frequency. All frequencies don't have to be declared. Adjustments - with the value $00 should be omitted. A frequency should only be - described once in the frame. - - -4.14. Reverb - - Yet another subjective one. You may here adjust echoes of different - kinds. Reverb left/right is the delay between every bounce in ms. - Reverb bounces left/right is the number of bounces that should be - made. $FF equals an infinite number of bounces. Feedback is the amount - of volume that should be returned to the next echo bounce. $00 is 0%, - $FF is 100%. If this value were $7F, there would be 50% volume - reduction on the first bounce, yet 50% on the second and so on. Left - to left means the sound from the left bounce to be played in the left - speaker, while left to right means sound from the left bounce to be - played in the right speaker. - - 'Premix left to right' is the amount of left sound to be mixed in the - right before any reverb is applied, where $00 id 0% and $FF is 100%. - 'Premix right to left' does the same thing, but right to left. Setting - both premix to $FF would result in a mono output (if the reverb is - applied symmetric). There may only be one "REV" frame in each tag. - - Reverb settings "REV" - Frame size $00 00 0C - Reverb left (ms) $xx xx - Reverb right (ms) $xx xx - Reverb bounces, left $xx - Reverb bounces, right $xx - Reverb feedback, left to left $xx - Reverb feedback, left to right $xx - Reverb feedback, right to right $xx - Reverb feedback, right to left $xx - Premix left to right $xx - Premix right to left $xx - - -4.15. Attached picture - - This frame contains a picture directly related to the audio file. - Image format is preferably "PNG" [PNG] or "JPG" [JFIF]. Description - is a short description of the picture, represented as a terminated - textstring. The description has a maximum length of 64 characters, - but may be empty. There may be several pictures attached to one file, - each in their individual "PIC" frame, but only one with the same - content descriptor. There may only be one picture with the picture - type declared as picture type $01 and $02 respectively. There is a - possibility to put only a link to the image file by using the 'image - format' "-->" and having a complete URL [URL] instead of picture data. - The use of linked files should however be used restrictively since - there is the risk of separation of files. - - Attached picture "PIC" - Frame size $xx xx xx - Text encoding $xx - Image format $xx xx xx - Picture type $xx - Description <textstring> $00 (00) - Picture data <binary data> - - - Picture type: $00 Other - $01 32x32 pixels 'file icon' (PNG only) - $02 Other file icon - $03 Cover (front) - $04 Cover (back) - $05 Leaflet page - $06 Media (e.g. lable side of CD) - $07 Lead artist/lead performer/soloist - $08 Artist/performer - $09 Conductor - $0A Band/Orchestra - $0B Composer - $0C Lyricist/text writer - $0D Recording Location - $0E During recording - $0F During performance - $10 Movie/video screen capture - $11 A bright coloured fish - $12 Illustration - $13 Band/artist logotype - $14 Publisher/Studio logotype - - -4.16. General encapsulated object - - In this frame any type of file can be encapsulated. After the header, - 'Frame size' and 'Encoding' follows 'MIME type' [MIME] and 'Filename' - for the encapsulated object, both represented as terminated strings - encoded with ISO 8859-1 [ISO-8859-1]. The filename is case sensitive. - Then follows a content description as terminated string, encoded as - 'Encoding'. The last thing in the frame is the actual object. The - first two strings may be omitted, leaving only their terminations. - MIME type is always an ISO-8859-1 text string. There may be more than - one "GEO" frame in each tag, but only one with the same content - descriptor. - - General encapsulated object "GEO" - Frame size $xx xx xx - Text encoding $xx - MIME type <textstring> $00 - Filename <textstring> $00 (00) - Content description <textstring> $00 (00) - Encapsulated object <binary data> - - -4.17. Play counter - - This is simply a counter of the number of times a file has been - played. The value is increased by one every time the file begins to - play. There may only be one "CNT" frame in each tag. When the counter - reaches all one's, one byte is inserted in front of the counter thus - making the counter eight bits bigger. The counter must be at least - 32-bits long to begin with. - - Play counter "CNT" - Frame size $xx xx xx - Counter $xx xx xx xx (xx ...) - - -4.18. Popularimeter - - The purpose of this frame is to specify how good an audio file is. - Many interesting applications could be found to this frame such as a - playlist that features better audiofiles more often than others or it - could be used to profile a persons taste and find other 'good' files - by comparing people's profiles. The frame is very simple. It contains - the email address to the user, one rating byte and a four byte play - counter, intended to be increased with one for every time the file is - played. The email is a terminated string. The rating is 1-255 where - 1 is worst and 255 is best. 0 is unknown. If no personal counter is - wanted it may be omitted. When the counter reaches all one's, one - byte is inserted in front of the counter thus making the counter - eight bits bigger in the same away as the play counter ("CNT"). - There may be more than one "POP" frame in each tag, but only one with - the same email address. - - Popularimeter "POP" - Frame size $xx xx xx - Email to user <textstring> $00 - Rating $xx - Counter $xx xx xx xx (xx ...) - - -4.19. Recommended buffer size - - Sometimes the server from which a audio file is streamed is aware of - transmission or coding problems resulting in interruptions in the - audio stream. In these cases, the size of the buffer can be - recommended by the server using this frame. If the 'embedded info - flag' is true (1) then this indicates that an ID3 tag with the - maximum size described in 'Buffer size' may occur in the audiostream. - In such case the tag should reside between two MPEG [MPEG] frames, if - the audio is MPEG encoded. If the position of the next tag is known, - 'offset to next tag' may be used. The offset is calculated from the - end of tag in which this frame resides to the first byte of the header - in the next. This field may be omitted. Embedded tags is currently not - recommended since this could render unpredictable behaviour from - present software/hardware. The 'Buffer size' should be kept to a - minimum. There may only be one "BUF" frame in each tag. - - Recommended buffer size "BUF" - Frame size $xx xx xx - Buffer size $xx xx xx - Embedded info flag %0000000x - Offset to next tag $xx xx xx xx - - -4.20. Encrypted meta frame - - This frame contains one or more encrypted frames. This enables - protection of copyrighted information such as pictures and text, that - people might want to pay extra for. Since standardisation of such an - encryption scheme is beyond this document, all "CRM" frames begin with - a terminated string with a URL [URL] containing an email address, or a - link to a location where an email adress can be found, that belongs to - the organisation responsible for this specific encrypted meta frame. - - Questions regarding the encrypted frame should be sent to the - indicated email address. If a $00 is found directly after the 'Frame - size', the whole frame should be ignored, and preferably be removed. - The 'Owner identifier' is then followed by a short content description - and explanation as to why it's encrypted. After the - 'content/explanation' description, the actual encrypted block follows. - - When an ID3v2 decoder encounters a "CRM" frame, it should send the - datablock to the 'plugin' with the corresponding 'owner identifier' - and expect to receive either a datablock with one or several ID3v2 - frames after each other or an error. There may be more than one "CRM" - frames in a tag, but only one with the same 'owner identifier'. - - Encrypted meta frame "CRM" - Frame size $xx xx xx - Owner identifier <textstring> $00 (00) - Content/explanation <textstring> $00 (00) - Encrypted datablock <binary data> - - -4.21. Audio encryption - - This frame indicates if the actual audio stream is encrypted, and by - whom. Since standardisation of such encrypion scheme is beyond this - document, all "CRA" frames begin with a terminated string with a - URL containing an email address, or a link to a location where an - email address can be found, that belongs to the organisation - responsible for this specific encrypted audio file. Questions - regarding the encrypted audio should be sent to the email address - specified. If a $00 is found directly after the 'Frame size' and the - audiofile indeed is encrypted, the whole file may be considered - useless. - - After the 'Owner identifier', a pointer to an unencrypted part of the - audio can be specified. The 'Preview start' and 'Preview length' is - described in frames. If no part is unencrypted, these fields should be - left zeroed. After the 'preview length' field follows optionally a - datablock required for decryption of the audio. There may be more than - one "CRA" frames in a tag, but only one with the same 'Owner - identifier'. - - Audio encryption "CRA" - Frame size $xx xx xx - Owner identifier <textstring> $00 (00) - Preview start $xx xx - Preview length $xx xx - Encryption info <binary data> - - -4.22. Linked information - - To keep space waste as low as possible this frame may be used to link - information from another ID3v2 tag that might reside in another audio - file or alone in a binary file. It is recommended that this method is - only used when the files are stored on a CD-ROM or other circumstances - when the risk of file seperation is low. The frame contains a frame - identifier, which is the frame that should be linked into this tag, a - URL [URL] field, where a reference to the file where the frame is - given, and additional ID data, if needed. Data should be retrieved - from the first tag found in the file to which this link points. There - may be more than one "LNK" frame in a tag, but only one with the same - contents. A linked frame is to be considered as part of the tag and - has the same restrictions as if it was a physical part of the tag - (i.e. only one "REV" frame allowed, whether it's linked or not). - - Linked information "LNK" - Frame size $xx xx xx - Frame identifier $xx xx xx - URL <textstring> $00 (00) - Additional ID data <textstring(s)> - - Frames that may be linked and need no additional data are "IPL", - "MCI", "ETC", "LLT", "STC", "RVA", "EQU", "REV", "BUF", the text - information frames and the URL link frames. - - The "TXX", "PIC", "GEO", "CRM" and "CRA" frames may be linked with the - content descriptor as additional ID data. - - The "COM", "SLT" and "ULT" frames may be linked with three bytes of - language descriptor directly followed by a content descriptor as - additional ID data. - - -5. The 'unsynchronisation scheme' - - The only purpose of the 'unsychronisation scheme' is to make the ID3v2 - tag as compatible as possible with existing software. There is no use - in 'unsynchronising' tags if the file is only to be processed by new - software. Unsynchronisation may only be made with MPEG 2 layer I, II - and III and MPEG 2.5 files. - - Whenever a false synchronisation is found within the tag, one zeroed - byte is inserted after the first false synchronisation byte. The - format of a correct sync that should be altered by ID3 encoders is as - follows: - - %11111111 111xxxxx - - And should be replaced with: - - %11111111 00000000 111xxxxx - - This has the side effect that all $FF 00 combinations have to be - altered, so they won't be affected by the decoding process. Therefore - all the $FF 00 combinations have to be replaced with the $FF 00 00 - combination during the unsynchonisation. - - To indicate usage of the unsynchronisation, the first bit in 'ID3 - flags' should be set. This bit should only be set if the tag - contained a, now corrected, false synchronisation. The bit should - only be clear if the tag does not contain any false synchronisations. - - Do bear in mind, that if a compression scheme is used by the encoder, - the unsyncronisation scheme should be applied *afterwards*. When - decoding a compressed, 'unsyncronised' file, the 'unsyncronisation - scheme' should be parsed first, compression afterwards. - - -6. Copyright - - Copyright (C) Martin Nilsson 1998. All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that a reference to this document is included on all - such copies and derivative works. However, this document itself may - not be modified in any way and reissued as the original document. - - The limited permissions granted above are perpetual and will not be - revoked. - - This document and the information contained herein is provided on an - "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE - INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED - WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - -7. References - - [CDDB] Compact Disc Data Base - - <url:http://www.cddb.com> - - [ISO-639-2] ISO/FDIS 639-2. - Codes for the representation of names of languages, Part 2: Alpha-3 - code. Technical committee / subcommittee: TC 37 / SC 2 - - [ISO-8859-1] ISO/IEC DIS 8859-1. - 8-bit single-byte coded graphic character sets, Part 1: Latin - alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 - - [ISRC] ISO 3901:1986 - International Standard Recording Code (ISRC). - Technical committee / subcommittee: TC 46 / SC 9 - - [JFIF] JPEG File Interchange Format, version 1.02 - - <url:http://www.w3.org/Graphics/JPEG/jfif.txt> - - [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail - Extensions (MIME) Part One: Format of Internet Message Bodies", - RFC 2045, November 1996. - - <url:ftp://ftp.isi.edu/in-notes/rfc2045.txt> - - [MPEG] ISO/IEC 11172-3:1993. - Coding of moving pictures and associated audio for digital storage - media at up to about 1,5 Mbit/s, Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC 13818-3:1995 - Generic coding of moving pictures and associated audio information, - Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC DIS 13818-3 - Generic coding of moving pictures and associated audio information, - Part 3: Audio (Revision of ISO/IEC 13818-3:1995) - - - [PNG] Portable Network Graphics, version 1.0 - - <url:http://www.w3.org/TR/REC-png-multi.html> - - [UNICODE] ISO/IEC 10646-1:1993. - Universal Multiple-Octet Coded Character Set (UCS), Part 1: - Architecture and Basic Multilingual Plane. Technical committee - / subcommittee: JTC 1 / SC 2 - - <url:http://www.unicode.org> - - [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource - Locators (URL).", RFC 1738, December 1994. - - <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> - - -8. Appendix - - -A. Appendix A - ID3-Tag Specification V1.1 - - ID3-Tag Specification V1.1 (12 dec 1997) by Michael Mutschler - <amiga2@info2.rus.uni-stuttgart.de>, edited for space and clarity - reasons. - - -A.1. Overview - - The ID3-Tag is an information field for MPEG Layer 3 audio files. - Since a standalone MP3 doesn't provide a method of storing other - information than those directly needed for replay reasons, the - ID3-tag was invented by Eric Kemp in 1996. - - A revision from ID3v1 to ID3v1.1 was made by Michael Mutschler to - support track number information is described in A.4. - - -A.2. ID3v1 Implementation - - The Information is stored in the last 128 bytes of an MP3. The Tag - has got the following fields, and the offsets given here, are from - 0-127. - - Field Length Offsets - Tag 3 0-2 - Songname 30 3-32 - Artist 30 33-62 - Album 30 63-92 - Year 4 93-96 - Comment 30 97-126 - Genre 1 127 - - - The string-fields contain ASCII-data, coded in ISO-Latin 1 codepage. - Strings which are smaller than the field length are padded with zero- - bytes. - - Tag: The tag is valid if this field contains the string "TAG". This - has to be uppercase! - - Songname: This field contains the title of the MP3 (string as - above). - - Artist: This field contains the artist of the MP3 (string as above). - - Album: this field contains the album where the MP3 comes from - (string as above). - - Year: this field contains the year when this song has originally - been released (string as above). - - Comment: this field contains a comment for the MP3 (string as - above). Revision to this field has been made in ID3v1.1. See - A.4. - - Genre: this byte contains the offset of a genre in a predefined - list the byte is treated as an unsigned byte. The offset is - starting from 0. See A.3. - - -A.3. Genre List - - The following genres is defined in ID3v1 - - 0.Blues - 1.Classic Rock - 2.Country - 3.Dance - 4.Disco - 5.Funk - 6.Grunge - 7.Hip-Hop - 8.Jazz - 9.Metal - 10.New Age - 11.Oldies - 12.Other - 13.Pop - 14.R&B - 15.Rap - 16.Reggae - 17.Rock - 18.Techno - 19.Industrial - 20.Alternative - 21.Ska - 22.Death Metal - 23.Pranks - 24.Soundtrack - 25.Euro-Techno - 26.Ambient - 27.Trip-Hop - 28.Vocal - 29.Jazz+Funk - 30.Fusion - 31.Trance - 32.Classical - 33.Instrumental - 34.Acid - 35.House - 36.Game - 37.Sound Clip - 38.Gospel - 39.Noise - 40.AlternRock - 41.Bass - 42.Soul - 43.Punk - 44.Space - 45.Meditative - 46.Instrumental Pop - 47.Instrumental Rock - 48.Ethnic - 49.Gothic - 50.Darkwave - 51.Techno-Industrial - 52.Electronic - 53.Pop-Folk - 54.Eurodance - 55.Dream - 56.Southern Rock - 57.Comedy - 58.Cult - 59.Gangsta - 60.Top 40 - 61.Christian Rap - 62.Pop/Funk - 63.Jungle - 64.Native American - 65.Cabaret - 66.New Wave - 67.Psychadelic - 68.Rave - 69.Showtunes - 70.Trailer - 71.Lo-Fi - 72.Tribal - 73.Acid Punk - 74.Acid Jazz - 75.Polka - 76.Retro - 77.Musical - 78.Rock & Roll - 79.Hard Rock - - The following genres are Winamp extensions - - 80.Folk - 81.Folk-Rock - 82.National Folk - 83.Swing - 84.Fast Fusion - 85.Bebob - 86.Latin - 87.Revival - 88.Celtic - 89.Bluegrass - 90.Avantgarde - 91.Gothic Rock - 92.Progressive Rock - 93.Psychedelic Rock - 94.Symphonic Rock - 95.Slow Rock - 96.Big Band - 97.Chorus - 98.Easy Listening - 99.Acoustic - 100.Humour - 101.Speech - 102.Chanson - 103.Opera - 104.Chamber Music - 105.Sonata - 106.Symphony - 107.Booty Bass - 108.Primus - 109.Porn Groove - 110.Satire - 111.Slow Jam - 112.Club - 113.Tango - 114.Samba - 115.Folklore - 116.Ballad - 117.Power Ballad - 118.Rhythmic Soul - 119.Freestyle - 120.Duet - 121.Punk Rock - 122.Drum Solo - 123.A capella - 124.Euro-House - 125.Dance Hall - - -A.4. Track addition - ID3v1.1 - - In ID3v1.1, Michael Mutschler revised the specification of the - comment field in order to implement the track number. The new format - of the comment field is a 28 character string followed by a mandatory - null ($00) character and the original album tracknumber stored as an - unsigned byte-size integer. In such cases where the 29th byte is not - the null character or when the 30th is a null character, the - tracknumber is to be considered undefined. - - -9. Author's Address - - Martin Nilsson - Rydsvägen 246 C. 30 - S-584 34 Linköping - Sweden - - Email: nilsson@id3.org - - Co-authors: - - Johan Sundström Email: johan@id3.org - - diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2.3.0.txt b/src/taglib/taglib/mpeg/id3v2/id3v2.3.0.txt deleted file mode 100644 index b4ed763..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2.3.0.txt +++ /dev/null @@ -1,2022 +0,0 @@ -Informal standard M. Nilsson -Document: id3v2.3.0.txt 3rd February 1999 - - - ID3 tag version 2.3.0 - -Status of this document - - This document is an informal standard and replaces the ID3v2.2.0 - standard [ID3v2]. The informal standard is released so that - implementors could have a set standard before a formal standard is - set. The formal standard will use another version or revision number - if not identical to what is described in this document. The contents - in this document may change for clarifications but never for added or - altered functionallity. - - Distribution of this document is unlimited. - - -Abstract - - This document describes the ID3v2.3.0, which is a more developed - version of the ID3v2 informal standard [ID3v2] (version 2.2.0), - evolved from the ID3 tagging system. The ID3v2 offers a flexible way - of storing information about an audio file within itself to determine - its origin and contents. The information may be technical - information, such as equalisation curves, as well as related meta - information, such as title, performer, copyright etc. - - -1. Table of contents - - 2. Conventions in this document - 3. ID3v2 overview - 3.1. ID3v2 header - 3.2. ID3v2 extended header - 3.3. ID3v2 frames overview - 3.3.1. Frame header flags - 3.3.2. Default flags - 4. Declared ID3v2 frames - 4.1. Unique file identifier - 4.2. Text information frames - 4.2.1. Text information frames - details - 4.2.2. User defined text information frame - 4.3. URL link frames - 4.3.1. URL link frames - details - 4.3.2. User defined URL link frame - 4.4. Involved people list - 4.5. Music CD Identifier - 4.6. Event timing codes - 4.7. MPEG location lookup table - 4.8. Synced tempo codes - 4.9. Unsychronised lyrics/text transcription - 4.10. Synchronised lyrics/text - 4.11. Comments - 4.12. Relative volume adjustment - 4.13. Equalisation - 4.14. Reverb - 4.15. Attached picture - 4.16. General encapsulated object - 4.17. Play counter - 4.18. Popularimeter - 4.19. Recommended buffer size - 4.20. Audio encryption - 4.21. Linked information - 4.22. Position synchronisation frame - 4.23. Terms of use - 4.24. Ownership frame - 4.25. Commercial frame - 4.26. Encryption method registration - 4.27. Group identification registration - 4.28. Private frame - 5. The 'unsynchronisation scheme' - 6. Copyright - 7. References - 8. Appendix - A. Appendix A - Genre List from ID3v1 - 9. Author's Address - - -2. Conventions in this document - - In the examples, text within "" is a text string exactly as it - appears in a file. Numbers preceded with $ are hexadecimal and - numbers preceded with % are binary. $xx is used to indicate a byte - with unknown content. %x is used to indicate a bit with unknown - content. The most significant bit (MSB) of a byte is called 'bit 7' - and the least significant bit (LSB) is called 'bit 0'. - - A tag is the whole tag described in this document. A frame is a block - of information in the tag. The tag consists of a header, frames and - optional padding. A field is a piece of information; one value, a - string etc. A numeric string is a string that consists of the - characters 0-9 only. - - -3. ID3v2 overview - - The two biggest design goals were to be able to implement ID3v2 - without disturbing old software too much and that ID3v2 should be - as flexible and expandable as possible. - - The first criterion is met by the simple fact that the MPEG [MPEG] - decoding software uses a syncsignal, embedded in the audiostream, to - 'lock on to' the audio. Since the ID3v2 tag doesn't contain a valid - syncsignal, no software will attempt to play the tag. If, for any - reason, coincidence make a syncsignal appear within the tag it will - be taken care of by the 'unsynchronisation scheme' described in - section 5. - - The second criterion has made a more noticeable impact on the design - of the ID3v2 tag. It is constructed as a container for several - information blocks, called frames, whose format need not be known to - the software that encounters them. At the start of every frame there - is an identifier that explains the frames' format and content, and a - size descriptor that allows software to skip unknown frames. - - If a total revision of the ID3v2 tag should be needed, there is a - version number and a size descriptor in the ID3v2 header. - - The ID3 tag described in this document is mainly targeted at files - encoded with MPEG-1/2 layer I, MPEG-1/2 layer II, MPEG-1/2 layer III - and MPEG-2.5, but may work with other types of encoded audio. - - The bitorder in ID3v2 is most significant bit first (MSB). The - byteorder in multibyte numbers is most significant byte first (e.g. - $12345678 would be encoded $12 34 56 78). - - It is permitted to include padding after all the final frame (at the - end of the ID3 tag), making the size of all the frames together - smaller than the size given in the head of the tag. A possible - purpose of this padding is to allow for adding a few additional - frames or enlarge existing frames within the tag without having to - rewrite the entire file. The value of the padding bytes must be $00. - - -3.1. ID3v2 header - - The ID3v2 tag header, which should be the first information in the - file, is 10 bytes as follows: - - ID3v2/file identifier "ID3" - ID3v2 version $03 00 - ID3v2 flags %abc00000 - ID3v2 size 4 * %0xxxxxxx - - The first three bytes of the tag are always "ID3" to indicate that - this is an ID3v2 tag, directly followed by the two version bytes. The - first byte of ID3v2 version is it's major version, while the second - byte is its revision number. In this case this is ID3v2.3.0. All - revisions are backwards compatible while major versions are not. If - software with ID3v2.2.0 and below support should encounter version - three or higher it should simply ignore the whole tag. Version and - revision will never be $FF. - - The version is followed by one the ID3v2 flags field, of which - currently only three flags are used. - - - a - Unsynchronisation - - Bit 7 in the 'ID3v2 flags' indicates whether or not - unsynchronisation is used (see section 5 for details); a set bit - indicates usage. - - - b - Extended header - - The second bit (bit 6) indicates whether or not the header is - followed by an extended header. The extended header is described in - section 3.2. - - - c - Experimental indicator - - The third bit (bit 5) should be used as an 'experimental - indicator'. This flag should always be set when the tag is in an - experimental stage. - - All the other flags should be cleared. If one of these undefined - flags are set that might mean that the tag is not readable for a - parser that does not know the flags function. - - The ID3v2 tag size is encoded with four bytes where the most - significant bit (bit 7) is set to zero in every byte, making a total - of 28 bits. The zeroed bits are ignored, so a 257 bytes long tag is - represented as $00 00 02 01. - - The ID3v2 tag size is the size of the complete tag after - unsychronisation, including padding, excluding the header but not - excluding the extended header (total tag size - 10). Only 28 bits - (representing up to 256MB) are used in the size description to avoid - the introducuction of 'false syncsignals'. - - An ID3v2 tag can be detected with the following pattern: - $49 44 33 yy yy xx zz zz zz zz - Where yy is less than $FF, xx is the 'flags' byte and zz is less than - $80. - - -3.2. ID3v2 extended header - - The extended header contains information that is not vital to the - correct parsing of the tag information, hence the extended header is - optional. - - Extended header size $xx xx xx xx - Extended Flags $xx xx - Size of padding $xx xx xx xx - - Where the 'Extended header size', currently 6 or 10 bytes, excludes - itself. The 'Size of padding' is simply the total tag size excluding - the frames and the headers, in other words the padding. The extended - header is considered separate from the header proper, and as such is - subject to unsynchronisation. - - The extended flags are a secondary flag set which describes further - attributes of the tag. These attributes are currently defined as - follows - - %x0000000 00000000 - - - x - CRC data present - - If this flag is set four bytes of CRC-32 data is appended to the - extended header. The CRC should be calculated before - unsynchronisation on the data between the extended header and the - padding, i.e. the frames and only the frames. - - Total frame CRC $xx xx xx xx - - -3.3. ID3v2 frame overview - - As the tag consists of a tag header and a tag body with one or more - frames, all the frames consists of a frame header followed by one or - more fields containing the actual information. The layout of the - frame header: - - Frame ID $xx xx xx xx (four characters) - Size $xx xx xx xx - Flags $xx xx - - The frame ID made out of the characters capital A-Z and 0-9. - Identifiers beginning with "X", "Y" and "Z" are for experimental use - and free for everyone to use, without the need to set the - experimental bit in the tag header. Have in mind that someone else - might have used the same identifier as you. All other identifiers are - either used or reserved for future use. - - The frame ID is followed by a size descriptor, making a total header - size of ten bytes in every frame. The size is calculated as frame - size excluding frame header (frame size - 10). - - In the frame header the size descriptor is followed by two flags - bytes. These flags are described in section 3.3.1. - - There is no fixed order of the frames' appearance in the tag, - although it is desired that the frames are arranged in order of - significance concerning the recognition of the file. An example of - such order: UFID, TIT2, MCDI, TRCK ... - - A tag must contain at least one frame. A frame must be at least 1 - byte big, excluding the header. - - If nothing else is said a string is represented as ISO-8859-1 - [ISO-8859-1] characters in the range $20 - $FF. Such strings are - represented as <text string>, or <full text string> if newlines are - allowed, in the frame descriptions. All Unicode strings [UNICODE] use - 16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). Unicode strings - must begin with the Unicode BOM ($FF FE or $FE FF) to identify the - byte order. - - All numeric strings and URLs [URL] are always encoded as ISO-8859-1. - Terminated strings are terminated with $00 if encoded with ISO-8859-1 - and $00 00 if encoded as unicode. If nothing else is said newline - character is forbidden. In ISO-8859-1 a new line is represented, when - allowed, with $0A only. Frames that allow different types of text - encoding have a text encoding description byte directly after the - frame size. If ISO-8859-1 is used this byte should be $00, if Unicode - is used it should be $01. Strings dependent on encoding is - represented as <text string according to encoding>, or <full text - string according to encoding> if newlines are allowed. Any empty - Unicode strings which are NULL-terminated may have the Unicode BOM - followed by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00). - - The three byte language field is used to describe the language of the - frame's content, according to ISO-639-2 [ISO-639-2]. - - All URLs [URL] may be relative, e.g. "picture.png", "../doc.txt". - - If a frame is longer than it should be, e.g. having more fields than - specified in this document, that indicates that additions to the - frame have been made in a later version of the ID3v2 standard. This - is reflected by the revision number in the header of the tag. - - -3.3.1. Frame header flags - - In the frame header the size descriptor is followed by two flags - bytes. All unused flags must be cleared. The first byte is for - 'status messages' and the second byte is for encoding purposes. If an - unknown flag is set in the first byte the frame may not be changed - without the bit cleared. If an unknown flag is set in the second byte - it is likely to not be readable. The flags field is defined as - follows. - - %abc00000 %ijk00000 - - - a - Tag alter preservation - - This flag tells the software what to do with this frame if it is - unknown and the tag is altered in any way. This applies to all - kinds of alterations, including adding more padding and reordering - the frames. - - 0 Frame should be preserved. - 1 Frame should be discarded. - - - b - File alter preservation - - This flag tells the software what to do with this frame if it is - unknown and the file, excluding the tag, is altered. This does not - apply when the audio is completely replaced with other audio data. - - 0 Frame should be preserved. - 1 Frame should be discarded. - - - c - Read only - - This flag, if set, tells the software that the contents of this - frame is intended to be read only. Changing the contents might - break something, e.g. a signature. If the contents are changed, - without knowledge in why the frame was flagged read only and - without taking the proper means to compensate, e.g. recalculating - the signature, the bit should be cleared. - - - i - Compression - - This flag indicates whether or not the frame is compressed. - - 0 Frame is not compressed. - 1 Frame is compressed using zlib [zlib] with 4 bytes for - 'decompressed size' appended to the frame header. - - - j - Encryption - - This flag indicates wether or not the frame is enrypted. If set - one byte indicating with which method it was encrypted will be - appended to the frame header. See section 4.26. for more - information about encryption method registration. - - 0 Frame is not encrypted. - 1 Frame is encrypted. - - - k - Grouping identity - - This flag indicates whether or not this frame belongs in a group - with other frames. If set a group identifier byte is added to the - frame header. Every frame with the same group identifier belongs - to the same group. - - 0 Frame does not contain group information - 1 Frame contains group information - - - Some flags indicates that the frame header is extended with - additional information. This information will be added to the frame - header in the same order as the flags indicating the additions. I.e. - the four bytes of decompressed size will preceed the encryption - method byte. These additions to the frame header, while not included - in the frame header size but are included in the 'frame size' field, - are not subject to encryption or compression. - - -3.3.2. Default flags - - The default settings for the frames described in this document can be - divided into the following classes. The flags may be set differently - if found more suitable by the software. - - 1. Discarded if tag is altered, discarded if file is altered. - - None. - - 2. Discarded if tag is altered, preserved if file is altered. - - None. - - 3. Preserved if tag is altered, discarded if file is altered. - - AENC, ETCO, EQUA, MLLT, POSS, SYLT, SYTC, RVAD, TENC, TLEN, TSIZ - - 4. Preserved if tag is altered, preserved if file is altered. - - The rest of the frames. - - -4. Declared ID3v2 frames - - The following frames are declared in this draft. - - 4.21 AENC Audio encryption - 4.15 APIC Attached picture - - 4.11 COMM Comments - 4.25 COMR Commercial frame - - 4.26 ENCR Encryption method registration - 4.13 EQUA Equalization - 4.6 ETCO Event timing codes - - 4.16 GEOB General encapsulated object - 4.27 GRID Group identification registration - - 4.4 IPLS Involved people list - - 4.21 LINK Linked information - - 4.5 MCDI Music CD identifier - 4.7 MLLT MPEG location lookup table - - 4.24 OWNE Ownership frame - - 4.28. PRIV Private frame - 4.17 PCNT Play counter - 4.18 POPM Popularimeter - 4.22 POSS Position synchronisation frame - - 4.19 RBUF Recommended buffer size - 4.12 RVAD Relative volume adjustment - 4.14 RVRB Reverb - - 4.10 SYLT Synchronized lyric/text - 4.8 SYTC Synchronized tempo codes - - 4.2.1 TALB Album/Movie/Show title - 4.2.1 TBPM BPM (beats per minute) - 4.2.1 TCOM Composer - 4.2.1 TCON Content type - 4.2.1 TCOP Copyright message - 4.2.1 TDAT Date - 4.2.1 TDLY Playlist delay - 4.2.1 TENC Encoded by - 4.2.1 TEXT Lyricist/Text writer - 4.2.1 TFLT File type - 4.2.1 TIME Time - 4.2.1 TIT1 Content group description - 4.2.1 TIT2 Title/songname/content description - 4.2.1 TIT3 Subtitle/Description refinement - 4.2.1 TKEY Initial key - 4.2.1 TLAN Language(s) - 4.2.1 TLEN Length - 4.2.1 TMED Media type - 4.2.1 TOAL Original album/movie/show title - 4.2.1 TOFN Original filename - 4.2.1 TOLY Original lyricist(s)/text writer(s) - 4.2.1 TOPE Original artist(s)/performer(s) - 4.2.1 TORY Original release year - 4.2.1 TOWN File owner/licensee - 4.2.1 TPE1 Lead performer(s)/Soloist(s) - 4.2.1 TPE2 Band/orchestra/accompaniment - 4.2.1 TPE3 Conductor/performer refinement - 4.2.1 TPE4 Interpreted, remixed, or otherwise modified by - 4.2.1 TPOS Part of a set - 4.2.1 TPUB Publisher - 4.2.1 TRCK Track number/Position in set - 4.2.1 TRDA Recording dates - 4.2.1 TRSN Internet radio station name - 4.2.1 TRSO Internet radio station owner - 4.2.1 TSIZ Size - 4.2.1 TSRC ISRC (international standard recording code) - 4.2.1 TSSE Software/Hardware and settings used for encoding - 4.2.1 TYER Year - 4.2.2 TXXX User defined text information frame - - 4.1 UFID Unique file identifier - 4.23 USER Terms of use - 4.9 USLT Unsychronized lyric/text transcription - - 4.3.1 WCOM Commercial information - 4.3.1 WCOP Copyright/Legal information - 4.3.1 WOAF Official audio file webpage - 4.3.1 WOAR Official artist/performer webpage - 4.3.1 WOAS Official audio source webpage - 4.3.1 WORS Official internet radio station homepage - 4.3.1 WPAY Payment - 4.3.1 WPUB Publishers official webpage - 4.3.2 WXXX User defined URL link frame - - -4.1. Unique file identifier - - This frame's purpose is to be able to identify the audio file in a - database that may contain more information relevant to the content. - Since standardisation of such a database is beyond this document, all - frames begin with a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for this specific database implementation. Questions regarding the - database should be sent to the indicated email address. The URL - should not be used for the actual database queries. The string - "<a href="http://www.id3.org/dummy/ufid.html">http://www.id3.org/dummy/ufid.html</a>" should be used for tests. - Software that isn't told otherwise may safely remove such frames. The - 'Owner identifier' must be non-empty (more than just a termination). - The 'Owner identifier' is then followed by the actual identifier, - which may be up to 64 bytes. There may be more than one "UFID" frame - in a tag, but only one with the same 'Owner identifier'. - - <Header for 'Unique file identifier', ID: "UFID"> - Owner identifier <text string> $00 - Identifier <up to 64 bytes binary data> - - -4.2. Text information frames - - The text information frames are the most important frames, containing - information like artist, album and more. There may only be one text - information frame of its kind in an tag. If the textstring is - followed by a termination ($00 (00)) all the following information - should be ignored and not be displayed. All text frame identifiers - begin with "T". Only text frame identifiers begin with "T", with the - exception of the "TXXX" frame. All the text information frames have - the following format: - - <Header for 'Text information frame', ID: "T000" - "TZZZ", - excluding "TXXX" described in 4.2.2.> - Text encoding $xx - Information <text string according to encoding> - - -4.2.1. Text information frames - details - - TALB - The 'Album/Movie/Show title' frame is intended for the title of the - recording(/source of sound) which the audio in the file is taken - from. - - TBPM - The 'BPM' frame contains the number of beats per minute in the - mainpart of the audio. The BPM is an integer and represented as a - numerical string. - - TCOM - The 'Composer(s)' frame is intended for the name of the composer(s). - They are seperated with the "/" character. - - TCON - The 'Content type', which previously was stored as a one byte numeric - value only, is now a numeric string. You may use one or several of - the types as ID3v1.1 did or, since the category list would be - impossible to maintain with accurate and up to date categories, - define your own. - - References to the ID3v1 genres can be made by, as first byte, enter - "(" followed by a number from the genres list (appendix A.) and - ended with a ")" character. This is optionally followed by a - refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be - made in the same frame, e.g. "(51)(39)". If the refinement should - begin with a "(" character it should be replaced with "((", e.g. "((I - can figure out any genre)" or "(55)((I think...)". The following new - content types is defined in ID3v2 and is implemented in the same way - as the numerig content types, e.g. "(RX)". - - RX Remix - CR Cover - - TCOP - The 'Copyright message' frame, which must begin with a year and a - space character (making five characters), is intended for the - copyright holder of the original sound, not the audio file itself. - The absence of this frame means only that the copyright information - is unavailable or has been removed, and must not be interpreted to - mean that the sound is public domain. Every time this field is - displayed the field must be preceded with "Copyright " (C) " ", where - (C) is one character showing a C in a circle. - - TDAT - The 'Date' frame is a numeric string in the DDMM format containing - the date for the recording. This field is always four characters - long. - - TDLY - The 'Playlist delay' defines the numbers of milliseconds of silence - between every song in a playlist. The player should use the "ETC" - frame, if present, to skip initial silence and silence at the end of - the audio to match the 'Playlist delay' time. The time is represented - as a numeric string. - - TENC - The 'Encoded by' frame contains the name of the person or - organisation that encoded the audio file. This field may contain a - copyright message, if the audio file also is copyrighted by the - encoder. - - TEXT - The 'Lyricist(s)/Text writer(s)' frame is intended for the writer(s) - of the text or lyrics in the recording. They are seperated with the - "/" character. - - TFLT - The 'File type' frame indicates which type of audio this tag defines. - The following type and refinements are defined: - - MPG MPEG Audio - /1 MPEG 1/2 layer I - /2 MPEG 1/2 layer II - /3 MPEG 1/2 layer III - /2.5 MPEG 2.5 - /AAC Advanced audio compression - VQF Transform-domain Weighted Interleave Vector Quantization - PCM Pulse Code Modulated audio - - but other types may be used, not for these types though. This is used - in a similar way to the predefined types in the "TMED" frame, but - without parentheses. If this frame is not present audio type is - assumed to be "MPG". - - TIME - The 'Time' frame is a numeric string in the HHMM format containing - the time for the recording. This field is always four characters - long. - - TIT1 - The 'Content group description' frame is used if the sound belongs to - a larger category of sounds/music. For example, classical music is - often sorted in different musical sections (e.g. "Piano Concerto", - "Weather - Hurricane"). - - TIT2 - The 'Title/Songname/Content description' frame is the actual name of - the piece (e.g. "Adagio", "Hurricane Donna"). - - TIT3 - The 'Subtitle/Description refinement' frame is used for information - directly related to the contents title (e.g. "Op. 16" or "Performed - live at Wembley"). - - TKEY - The 'Initial key' frame contains the musical key in which the sound - starts. It is represented as a string with a maximum length of three - characters. The ground keys are represented with "A","B","C","D","E", - "F" and "G" and halfkeys represented with "b" and "#". Minor is - represented as "m". Example "Cbm". Off key is represented with an "o" - only. - - TLAN - The 'Language(s)' frame should contain the languages of the text or - lyrics spoken or sung in the audio. The language is represented with - three characters according to ISO-639-2. If more than one language is - used in the text their language codes should follow according to - their usage. - - TLEN - The 'Length' frame contains the length of the audiofile in - milliseconds, represented as a numeric string. - - TMED - The 'Media type' frame describes from which media the sound - originated. This may be a text string or a reference to the - predefined media types found in the list below. References are made - within "(" and ")" and are optionally followed by a text refinement, - e.g. "(MC) with four channels". If a text refinement should begin - with a "(" character it should be replaced with "((" in the same way - as in the "TCO" frame. Predefined refinements is appended after the - media type, e.g. "(CD/A)" or "(VID/PAL/VHS)". - - DIG Other digital media - /A Analog transfer from media - - ANA Other analog media - /WAC Wax cylinder - /8CA 8-track tape cassette - - CD CD - /A Analog transfer from media - /DD DDD - /AD ADD - /AA AAD - - LD Laserdisc - /A Analog transfer from media - - TT Turntable records - /33 33.33 rpm - /45 45 rpm - /71 71.29 rpm - /76 76.59 rpm - /78 78.26 rpm - /80 80 rpm - - MD MiniDisc - /A Analog transfer from media - - DAT DAT - /A Analog transfer from media - /1 standard, 48 kHz/16 bits, linear - /2 mode 2, 32 kHz/16 bits, linear - /3 mode 3, 32 kHz/12 bits, nonlinear, low speed - /4 mode 4, 32 kHz/12 bits, 4 channels - /5 mode 5, 44.1 kHz/16 bits, linear - /6 mode 6, 44.1 kHz/16 bits, 'wide track' play - - DCC DCC - /A Analog transfer from media - - DVD DVD - /A Analog transfer from media - - TV Television - /PAL PAL - /NTSC NTSC - /SECAM SECAM - - VID Video - /PAL PAL - /NTSC NTSC - /SECAM SECAM - /VHS VHS - /SVHS S-VHS - /BETA BETAMAX - - RAD Radio - /FM FM - /AM AM - /LW LW - /MW MW - - TEL Telephone - /I ISDN - - MC MC (normal cassette) - /4 4.75 cm/s (normal speed for a two sided cassette) - /9 9.5 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - REE Reel - /9 9.5 cm/s - /19 19 cm/s - /38 38 cm/s - /76 76 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - TOAL - The 'Original album/movie/show title' frame is intended for the title - of the original recording (or source of sound), if for example the - music in the file should be a cover of a previously released song. - - TOFN - The 'Original filename' frame contains the preferred filename for the - file, since some media doesn't allow the desired length of the - filename. The filename is case sensitive and includes its suffix. - - TOLY - The 'Original lyricist(s)/text writer(s)' frame is intended for the - text writer(s) of the original recording, if for example the music in - the file should be a cover of a previously released song. The text - writers are seperated with the "/" character. - - TOPE - The 'Original artist(s)/performer(s)' frame is intended for the - performer(s) of the original recording, if for example the music in - the file should be a cover of a previously released song. The - performers are seperated with the "/" character. - - TORY - The 'Original release year' frame is intended for the year when the - original recording, if for example the music in the file should be a - cover of a previously released song, was released. The field is - formatted as in the "TYER" frame. - - TOWN - The 'File owner/licensee' frame contains the name of the owner or - licensee of the file and it's contents. - - TPE1 - The 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group' is - used for the main artist(s). They are seperated with the "/" - character. - - TPE2 - The 'Band/Orchestra/Accompaniment' frame is used for additional - information about the performers in the recording. - - TPE3 - The 'Conductor' frame is used for the name of the conductor. - - TPE4 - The 'Interpreted, remixed, or otherwise modified by' frame contains - more information about the people behind a remix and similar - interpretations of another existing piece. - - TPOS - The 'Part of a set' frame is a numeric string that describes which - part of a set the audio came from. This frame is used if the source - described in the "TALB" frame is divided into several mediums, e.g. a - double CD. The value may be extended with a "/" character and a - numeric string containing the total number of parts in the set. E.g. - "1/2". - - TPUB - The 'Publisher' frame simply contains the name of the label or - publisher. - - TRCK - The 'Track number/Position in set' frame is a numeric string - containing the order number of the audio-file on its original - recording. This may be extended with a "/" character and a numeric - string containing the total numer of tracks/elements on the original - recording. E.g. "4/9". - - TRDA - The 'Recording dates' frame is a intended to be used as complement to - the "TYER", "TDAT" and "TIME" frames. E.g. "4th-7th June, 12th June" - in combination with the "TYER" frame. - - TRSN - The 'Internet radio station name' frame contains the name of the - internet radio station from which the audio is streamed. - - TRSO - The 'Internet radio station owner' frame contains the name of the - owner of the internet radio station from which the audio is - streamed. - - TSIZ - The 'Size' frame contains the size of the audiofile in bytes, - excluding the ID3v2 tag, represented as a numeric string. - - TSRC - The 'ISRC' frame should contain the International Standard Recording - Code [ISRC] (12 characters). - - TSSE - The 'Software/Hardware and settings used for encoding' frame - includes the used audio encoder and its settings when the file was - encoded. Hardware refers to hardware encoders, not the computer on - which a program was run. - - TYER - The 'Year' frame is a numeric string with a year of the recording. - This frames is always four characters long (until the year 10000). - - -4.2.2. User defined text information frame - - This frame is intended for one-string text information concerning the - audiofile in a similar way to the other "T"-frames. The frame body - consists of a description of the string, represented as a terminated - string, followed by the actual string. There may be more than one - "TXXX" frame in each tag, but only one with the same description. - - <Header for 'User defined text information frame', ID: "TXXX"> - Text encoding $xx - Description <text string according to encoding> $00 (00) - Value <text string according to encoding> - - -4.3. URL link frames - - With these frames dynamic data such as webpages with touring - information, price information or plain ordinary news can be added to - the tag. There may only be one URL [URL] link frame of its kind in an - tag, except when stated otherwise in the frame description. If the - textstring is followed by a termination ($00 (00)) all the following - information should be ignored and not be displayed. All URL link - frame identifiers begins with "W". Only URL link frame identifiers - begins with "W". All URL link frames have the following format: - - <Header for 'URL link frame', ID: "W000" - "WZZZ", excluding "WXXX" - described in 4.3.2.> - URL <text string> - - -4.3.1. URL link frames - details - - WCOM - The 'Commercial information' frame is a URL pointing at a webpage - with information such as where the album can be bought. There may be - more than one "WCOM" frame in a tag, but not with the same content. - - WCOP - The 'Copyright/Legal information' frame is a URL pointing at a - webpage where the terms of use and ownership of the file is - described. - - WOAF - The 'Official audio file webpage' frame is a URL pointing at a file - specific webpage. - - WOAR - The 'Official artist/performer webpage' frame is a URL pointing at - the artists official webpage. There may be more than one "WOAR" frame - in a tag if the audio contains more than one performer, but not with - the same content. - - WOAS - The 'Official audio source webpage' frame is a URL pointing at the - official webpage for the source of the audio file, e.g. a movie. - - WORS - The 'Official internet radio station homepage' contains a URL - pointing at the homepage of the internet radio station. - - WPAY - The 'Payment' frame is a URL pointing at a webpage that will handle - the process of paying for this file. - - WPUB - The 'Publishers official webpage' frame is a URL pointing at the - official wepage for the publisher. - - -4.3.2. User defined URL link frame - - This frame is intended for URL [URL] links concerning the audiofile - in a similar way to the other "W"-frames. The frame body consists - of a description of the string, represented as a terminated string, - followed by the actual URL. The URL is always encoded with ISO-8859-1 - [ISO-8859-1]. There may be more than one "WXXX" frame in each tag, - but only one with the same description. - - <Header for 'User defined URL link frame', ID: "WXXX"> - Text encoding $xx - Description <text string according to encoding> $00 (00) - URL <text string> - - -4.4. Involved people list - - Since there might be a lot of people contributing to an audio file in - various ways, such as musicians and technicians, the 'Text - information frames' are often insufficient to list everyone involved - in a project. The 'Involved people list' is a frame containing the - names of those involved, and how they were involved. The body simply - contains a terminated string with the involvement directly followed - by a terminated string with the involvee followed by a new - involvement and so on. There may only be one "IPLS" frame in each - tag. - - <Header for 'Involved people list', ID: "IPLS"> - Text encoding $xx - People list strings <text strings according to encoding> - - -4.5. Music CD identifier - - This frame is intended for music that comes from a CD, so that the CD - can be identified in databases such as the CDDB [CDDB]. The frame - consists of a binary dump of the Table Of Contents, TOC, from the CD, - which is a header of 4 bytes and then 8 bytes/track on the CD plus 8 - bytes for the 'lead out' making a maximum of 804 bytes. The offset to - the beginning of every track on the CD should be described with a - four bytes absolute CD-frame address per track, and not with absolute - time. This frame requires a present and valid "TRCK" frame, even if - the CD's only got one track. There may only be one "MCDI" frame in - each tag. - - <Header for 'Music CD identifier', ID: "MCDI"> - CD TOC <binary data> - - -4.6. Event timing codes - - This frame allows synchronisation with key events in a song or sound. - The header is: - - <Header for 'Event timing codes', ID: "ETCO"> - Time stamp format $xx - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - Followed by a list of key events in the following format: - - Type of event $xx - Time stamp $xx (xx ...) - - The 'Time stamp' is set to zero if directly at the beginning of the - sound or after the previous event. All events should be sorted in - chronological order. The type of event is as follows: - - $00 padding (has no meaning) - $01 end of initial silence - $02 intro start - $03 mainpart start - $04 outro start - $05 outro end - $06 verse start - $07 refrain start - $08 interlude start - $09 theme start - $0A variation start - $0B key change - $0C time change - $0D momentary unwanted noise (Snap, Crackle & Pop) - $0E sustained noise - $0F sustained noise end - $10 intro end - $11 mainpart end - $12 verse end - $13 refrain end - $14 theme end - - $15-$DF reserved for future use - - $E0-$EF not predefined sync 0-F - - $F0-$FC reserved for future use - - $FD audio end (start of silence) - $FE audio file ends - $FF one more byte of events follows (all the following bytes with - the value $FF have the same function) - - Terminating the start events such as "intro start" is not required. - The 'Not predefined sync's ($E0-EF) are for user events. You might - want to synchronise your music to something, like setting of an - explosion on-stage, turning on your screensaver etc. - - There may only be one "ETCO" frame in each tag. - - -4.7. MPEG location lookup table - - To increase performance and accuracy of jumps within a MPEG [MPEG] - audio file, frames with timecodes in different locations in the file - might be useful. The ID3v2 frame includes references that the - software can use to calculate positions in the file. After the frame - header is a descriptor of how much the 'frame counter' should - increase for every reference. If this value is two then the first - reference points out the second frame, the 2nd reference the 4th - frame, the 3rd reference the 6th frame etc. In a similar way the - 'bytes between reference' and 'milliseconds between reference' points - out bytes and milliseconds respectively. - - Each reference consists of two parts; a certain number of bits, as - defined in 'bits for bytes deviation', that describes the difference - between what is said in 'bytes between reference' and the reality and - a certain number of bits, as defined in 'bits for milliseconds - deviation', that describes the difference between what is said in - 'milliseconds between reference' and the reality. The number of bits - in every reference, i.e. 'bits for bytes deviation'+'bits for - milliseconds deviation', must be a multiple of four. There may only - be one "MLLT" frame in each tag. - - <Header for 'Location lookup table', ID: "MLLT"> - MPEG frames between reference $xx xx - Bytes between reference $xx xx xx - Milliseconds between reference $xx xx xx - Bits for bytes deviation $xx - Bits for milliseconds dev. $xx - - Then for every reference the following data is included; - - Deviation in bytes %xxx.... - Deviation in milliseconds %xxx.... - - -4.8. Synchronised tempo codes - - For a more accurate description of the tempo of a musical piece this - frame might be used. After the header follows one byte describing - which time stamp format should be used. Then follows one or more - tempo codes. Each tempo code consists of one tempo part and one time - part. The tempo is in BPM described with one or two bytes. If the - first byte has the value $FF, one more byte follows, which is added - to the first giving a range from 2 - 510 BPM, since $00 and $01 is - reserved. $00 is used to describe a beat-free time period, which is - not the same as a music-free time period. $01 is used to indicate one - single beat-stroke followed by a beat-free period. - - The tempo descriptor is followed by a time stamp. Every time the - tempo in the music changes, a tempo descriptor may indicate this for - the player. All tempo descriptors should be sorted in chronological - order. The first beat-stroke in a time-period is at the same time as - the beat description occurs. There may only be one "SYTC" frame in - each tag. - - <Header for 'Synchronised tempo codes', ID: "SYTC"> - Time stamp format $xx - Tempo data <binary data> - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - -4.9. Unsychronised lyrics/text transcription - - This frame contains the lyrics of the song or a text transcription of - other vocal activities. The head includes an encoding descriptor and - a content descriptor. The body consists of the actual text. The - 'Content descriptor' is a terminated string. If no descriptor is - entered, 'Content descriptor' is $00 (00) only. Newline characters - are allowed in the text. There may be more than one 'Unsynchronised - lyrics/text transcription' frame in each tag, but only one with the - same language and content descriptor. - - <Header for 'Unsynchronised lyrics/text transcription', ID: "USLT"> - Text encoding $xx - Language $xx xx xx - Content descriptor <text string according to encoding> $00 (00) - Lyrics/text <full text string according to encoding> - - -4.10. Synchronised lyrics/text - - This is another way of incorporating the words, said or sung lyrics, - in the audio file as text, this time, however, in sync with the - audio. It might also be used to describing events e.g. occurring on a - stage or on the screen in sync with the audio. The header includes a - content descriptor, represented with as terminated textstring. If no - descriptor is entered, 'Content descriptor' is $00 (00) only. - - <Header for 'Synchronised lyrics/text', ID: "SYLT"> - Text encoding $xx - Language $xx xx xx - Time stamp format $xx - Content type $xx - Content descriptor <text string according to encoding> $00 (00) - - - Encoding: $00 ISO-8859-1 [ISO-8859-1] character set is used => $00 - is sync identifier. - $01 Unicode [UNICODE] character set is used => $00 00 is - sync identifier. - - Content type: $00 is other - $01 is lyrics - $02 is text transcription - $03 is movement/part name (e.g. "Adagio") - $04 is events (e.g. "Don Quijote enters the stage") - $05 is chord (e.g. "Bb F Fsus") - $06 is trivia/'pop up' information - - Time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - The text that follows the frame header differs from that of the - unsynchronised lyrics/text transcription in one major way. Each - syllable (or whatever size of text is considered to be convenient by - the encoder) is a null terminated string followed by a time stamp - denoting where in the sound file it belongs. Each sync thus has the - following structure: - - Terminated text to be synced (typically a syllable) - Sync identifier (terminator to above string) $00 (00) - Time stamp $xx (xx ...) - - The 'time stamp' is set to zero or the whole sync is omitted if - located directly at the beginning of the sound. All time stamps - should be sorted in chronological order. The sync can be considered - as a validator of the subsequent string. - - Newline ($0A) characters are allowed in all "SYLT" frames and should - be used after every entry (name, event etc.) in a frame with the - content type $03 - $04. - - A few considerations regarding whitespace characters: Whitespace - separating words should mark the beginning of a new word, thus - occurring in front of the first syllable of a new word. This is also - valid for new line characters. A syllable followed by a comma should - not be broken apart with a sync (both the syllable and the comma - should be before the sync). - - An example: The "USLT" passage - - "Strangers in the night" $0A "Exchanging glances" - - would be "SYLT" encoded as: - - "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx - " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx - xx "glan" $00 xx xx "ces" $00 xx xx - - There may be more than one "SYLT" frame in each tag, but only one - with the same language and content descriptor. - - -4.11. Comments - - This frame is indended for any kind of full text information that - does not fit in any other frame. It consists of a frame header - followed by encoding, language and content descriptors and is ended - with the actual comment as a text string. Newline characters are - allowed in the comment text string. There may be more than one - comment frame in each tag, but only one with the same language and - content descriptor. - - <Header for 'Comment', ID: "COMM"> - Text encoding $xx - Language $xx xx xx - Short content descrip. <text string according to encoding> $00 (00) - The actual text <full text string according to encoding> - - -4.12. Relative volume adjustment - - This is a more subjective function than the previous ones. It allows - the user to say how much he wants to increase/decrease the volume on - each channel while the file is played. The purpose is to be able to - align all files to a reference volume, so that you don't have to - change the volume constantly. This frame may also be used to balance - adjust the audio. If the volume peak levels are known then this could - be described with the 'Peak volume right' and 'Peak volume left' - field. If Peakvolume is not known these fields could be left zeroed - or, if no other data follows, be completely omitted. There may only - be one "RVAD" frame in each tag. - - <Header for 'Relative volume adjustment', ID: "RVAD"> - Increment/decrement %00xxxxxx - Bits used for volume descr. $xx - Relative volume change, right $xx xx (xx ...) - Relative volume change, left $xx xx (xx ...) - Peak volume right $xx xx (xx ...) - Peak volume left $xx xx (xx ...) - - In the increment/decrement field bit 0 is used to indicate the right - channel and bit 1 is used to indicate the left channel. 1 is - increment and 0 is decrement. - - The 'bits used for volume description' field is normally $10 (16 - bits) for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value - may not be $00. The volume is always represented with whole bytes, - padded in the beginning (highest bits) when 'bits used for volume - description' is not a multiple of eight. - - This datablock is then optionally followed by a volume definition for - the left and right back channels. If this information is appended to - the frame the first two channels will be treated as front channels. - In the increment/decrement field bit 2 is used to indicate the right - back channel and bit 3 for the left back channel. - - Relative volume change, right back $xx xx (xx ...) - Relative volume change, left back $xx xx (xx ...) - Peak volume right back $xx xx (xx ...) - Peak volume left back $xx xx (xx ...) - - If the center channel adjustment is present the following is appended - to the existing frame, after the left and right back channels. The - center channel is represented by bit 4 in the increase/decrease - field. - - Relative volume change, center $xx xx (xx ...) - Peak volume center $xx xx (xx ...) - - If the bass channel adjustment is present the following is appended - to the existing frame, after the center channel. The bass channel is - represented by bit 5 in the increase/decrease field. - - Relative volume change, bass $xx xx (xx ...) - Peak volume bass $xx xx (xx ...) - - -4.13. Equalisation - - This is another subjective, alignment frame. It allows the user to - predefine an equalisation curve within the audio file. There may only - be one "EQUA" frame in each tag. - - <Header of 'Equalisation', ID: "EQUA"> - Adjustment bits $xx - - The 'adjustment bits' field defines the number of bits used for - representation of the adjustment. This is normally $10 (16 bits) for - MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be - $00. - - This is followed by 2 bytes + ('adjustment bits' rounded up to the - nearest byte) for every equalisation band in the following format, - giving a frequency range of 0 - 32767Hz: - - Increment/decrement %x (MSB of the Frequency) - Frequency (lower 15 bits) - Adjustment $xx (xx ...) - - The increment/decrement bit is 1 for increment and 0 for decrement. - The equalisation bands should be ordered increasingly with reference - to frequency. All frequencies don't have to be declared. The - equalisation curve in the reading software should be interpolated - between the values in this frame. Three equal adjustments for three - subsequent frequencies. A frequency should only be described once in - the frame. - - -4.14. Reverb - - Yet another subjective one. You may here adjust echoes of different - kinds. Reverb left/right is the delay between every bounce in ms. - Reverb bounces left/right is the number of bounces that should be - made. $FF equals an infinite number of bounces. Feedback is the - amount of volume that should be returned to the next echo bounce. $00 - is 0%, $FF is 100%. If this value were $7F, there would be 50% volume - reduction on the first bounce, 50% of that on the second and so on. - Left to left means the sound from the left bounce to be played in the - left speaker, while left to right means sound from the left bounce to - be played in the right speaker. - - 'Premix left to right' is the amount of left sound to be mixed in the - right before any reverb is applied, where $00 id 0% and $FF is 100%. - 'Premix right to left' does the same thing, but right to left. - Setting both premix to $FF would result in a mono output (if the - reverb is applied symmetric). There may only be one "RVRB" frame in - each tag. - - <Header for 'Reverb', ID: "RVRB"> - Reverb left (ms) $xx xx - Reverb right (ms) $xx xx - Reverb bounces, left $xx - Reverb bounces, right $xx - Reverb feedback, left to left $xx - Reverb feedback, left to right $xx - Reverb feedback, right to right $xx - Reverb feedback, right to left $xx - Premix left to right $xx - Premix right to left $xx - - -4.15. Attached picture - - This frame contains a picture directly related to the audio file. - Image format is the MIME type and subtype [MIME] for the image. In - the event that the MIME media type name is omitted, "image/" will be - implied. The "image/png" [PNG] or "image/jpeg" [JFIF] picture format - should be used when interoperability is wanted. Description is a - short description of the picture, represented as a terminated - textstring. The description has a maximum length of 64 characters, - but may be empty. There may be several pictures attached to one file, - each in their individual "APIC" frame, but only one with the same - content descriptor. There may only be one picture with the picture - type declared as picture type $01 and $02 respectively. There is the - possibility to put only a link to the image file by using the 'MIME - type' "-->" and having a complete URL [URL] instead of picture data. - The use of linked files should however be used sparingly since there - is the risk of separation of files. - - <Header for 'Attached picture', ID: "APIC"> - Text encoding $xx - MIME type <text string> $00 - Picture type $xx - Description <text string according to encoding> $00 (00) - Picture data <binary data> - - - Picture type: $00 Other - $01 32x32 pixels 'file icon' (PNG only) - $02 Other file icon - $03 Cover (front) - $04 Cover (back) - $05 Leaflet page - $06 Media (e.g. lable side of CD) - $07 Lead artist/lead performer/soloist - $08 Artist/performer - $09 Conductor - $0A Band/Orchestra - $0B Composer - $0C Lyricist/text writer - $0D Recording Location - $0E During recording - $0F During performance - $10 Movie/video screen capture - $11 A bright coloured fish - $12 Illustration - $13 Band/artist logotype - $14 Publisher/Studio logotype - - -4.16. General encapsulated object - - In this frame any type of file can be encapsulated. After the header, - 'Frame size' and 'Encoding' follows 'MIME type' [MIME] represented as - as a terminated string encoded with ISO 8859-1 [ISO-8859-1]. The - filename is case sensitive and is encoded as 'Encoding'. Then follows - a content description as terminated string, encoded as 'Encoding'. - The last thing in the frame is the actual object. The first two - strings may be omitted, leaving only their terminations. MIME type is - always an ISO-8859-1 text string. There may be more than one "GEOB" - frame in each tag, but only one with the same content descriptor. - - <Header for 'General encapsulated object', ID: "GEOB"> - Text encoding $xx - MIME type <text string> $00 - Filename <text string according to encoding> $00 (00) - Content description <text string according to encóding> $00 (00) - Encapsulated object <binary data> - - -4.17. Play counter - - This is simply a counter of the number of times a file has been - played. The value is increased by one every time the file begins to - play. There may only be one "PCNT" frame in each tag. When the - counter reaches all one's, one byte is inserted in front of the - counter thus making the counter eight bits bigger. The counter must - be at least 32-bits long to begin with. - - <Header for 'Play counter', ID: "PCNT"> - Counter $xx xx xx xx (xx ...) - - -4.18. Popularimeter - - The purpose of this frame is to specify how good an audio file is. - Many interesting applications could be found to this frame such as a - playlist that features better audiofiles more often than others or it - could be used to profile a person's taste and find other 'good' files - by comparing people's profiles. The frame is very simple. It contains - the email address to the user, one rating byte and a four byte play - counter, intended to be increased with one for every time the file is - played. The email is a terminated string. The rating is 1-255 where - 1 is worst and 255 is best. 0 is unknown. If no personal counter is - wanted it may be omitted. When the counter reaches all one's, one - byte is inserted in front of the counter thus making the counter - eight bits bigger in the same away as the play counter ("PCNT"). - There may be more than one "POPM" frame in each tag, but only one - with the same email address. - - <Header for 'Popularimeter', ID: "POPM"> - Email to user <text string> $00 - Rating $xx - Counter $xx xx xx xx (xx ...) - - -4.19. Recommended buffer size - - Sometimes the server from which a audio file is streamed is aware of - transmission or coding problems resulting in interruptions in the - audio stream. In these cases, the size of the buffer can be - recommended by the server using this frame. If the 'embedded info - flag' is true (1) then this indicates that an ID3 tag with the - maximum size described in 'Buffer size' may occur in the audiostream. - In such case the tag should reside between two MPEG [MPEG] frames, if - the audio is MPEG encoded. If the position of the next tag is known, - 'offset to next tag' may be used. The offset is calculated from the - end of tag in which this frame resides to the first byte of the - header in the next. This field may be omitted. Embedded tags are - generally not recommended since this could render unpredictable - behaviour from present software/hardware. - - For applications like streaming audio it might be an idea to embed - tags into the audio stream though. If the clients connects to - individual connections like HTTP and there is a possibility to begin - every transmission with a tag, then this tag should include a - 'recommended buffer size' frame. If the client is connected to a - arbitrary point in the stream, such as radio or multicast, then the - 'recommended buffer size' frame should be included in every tag. - Every tag that is picked up after the initial/first tag is to be - considered as an update of the previous one. E.g. if there is a - "TIT2" frame in the first received tag and one in the second tag, - then the first should be 'replaced' with the second. - - The 'Buffer size' should be kept to a minimum. There may only be one - "RBUF" frame in each tag. - - <Header for 'Recommended buffer size', ID: "RBUF"> - Buffer size $xx xx xx - Embedded info flag %0000000x - Offset to next tag $xx xx xx xx - - -4.20. Audio encryption - - This frame indicates if the actual audio stream is encrypted, and by - whom. Since standardisation of such encrypion scheme is beyond this - document, all "AENC" frames begin with a terminated string with a - URL containing an email address, or a link to a location where an - email address can be found, that belongs to the organisation - responsible for this specific encrypted audio file. Questions - regarding the encrypted audio should be sent to the email address - specified. If a $00 is found directly after the 'Frame size' and the - audiofile indeed is encrypted, the whole file may be considered - useless. - - After the 'Owner identifier', a pointer to an unencrypted part of the - audio can be specified. The 'Preview start' and 'Preview length' is - described in frames. If no part is unencrypted, these fields should - be left zeroed. After the 'preview length' field follows optionally a - datablock required for decryption of the audio. There may be more - than one "AENC" frames in a tag, but only one with the same 'Owner - identifier'. - - <Header for 'Audio encryption', ID: "AENC"> - Owner identifier <text string> $00 - Preview start $xx xx - Preview length $xx xx - Encryption info <binary data> - - -4.21. Linked information - - To keep space waste as low as possible this frame may be used to link - information from another ID3v2 tag that might reside in another audio - file or alone in a binary file. It is recommended that this method is - only used when the files are stored on a CD-ROM or other - circumstances when the risk of file seperation is low. The frame - contains a frame identifier, which is the frame that should be linked - into this tag, a URL [URL] field, where a reference to the file where - the frame is given, and additional ID data, if needed. Data should be - retrieved from the first tag found in the file to which this link - points. There may be more than one "LINK" frame in a tag, but only - one with the same contents. A linked frame is to be considered as - part of the tag and has the same restrictions as if it was a physical - part of the tag (i.e. only one "RVRB" frame allowed, whether it's - linked or not). - - <Header for 'Linked information', ID: "LINK"> - Frame identifier $xx xx xx - URL <text string> $00 - ID and additional data <text string(s)> - - Frames that may be linked and need no additional data are "IPLS", - "MCID", "ETCO", "MLLT", "SYTC", "RVAD", "EQUA", "RVRB", "RBUF", the - text information frames and the URL link frames. - - The "TXXX", "APIC", "GEOB" and "AENC" frames may be linked with - the content descriptor as additional ID data. - - The "COMM", "SYLT" and "USLT" frames may be linked with three bytes - of language descriptor directly followed by a content descriptor as - additional ID data. - - -4.22. Position synchronisation frame - - This frame delivers information to the listener of how far into the - audio stream he picked up; in effect, it states the time offset of - the first frame in the stream. The frame layout is: - - <Head for 'Position synchronisation', ID: "POSS"> - Time stamp format $xx - Position $xx (xx ...) - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - and position is where in the audio the listener starts to receive, - i.e. the beginning of the next frame. If this frame is used in the - beginning of a file the value is always 0. There may only be one - "POSS" frame in each tag. - - -4.23. Terms of use frame - - This frame contains a brief description of the terms of use and - ownership of the file. More detailed information concerning the legal - terms might be available through the "WCOP" frame. Newlines are - allowed in the text. There may only be one "USER" frame in a tag. - - <Header for 'Terms of use frame', ID: "USER"> - Text encoding $xx - Language $xx xx xx - The actual text <text string according to encoding> - - -4.24. Ownership frame - - The ownership frame might be used as a reminder of a made transaction - or, if signed, as proof. Note that the "USER" and "TOWN" frames are - good to use in conjunction with this one. The frame begins, after the - frame ID, size and encoding fields, with a 'price payed' field. The - first three characters of this field contains the currency used for - the transaction, encoded according to ISO 4217 [ISO-4217] alphabetic - currency code. Concatenated to this is the actual price payed, as a - numerical string using "." as the decimal separator. Next is an 8 - character date string (YYYYMMDD) followed by a string with the name - of the seller as the last field in the frame. There may only be one - "OWNE" frame in a tag. - - <Header for 'Ownership frame', ID: "OWNE"> - Text encoding $xx - Price payed <text string> $00 - Date of purch. <text string> - Seller <text string according to encoding> - - -4.25. Commercial frame - - This frame enables several competing offers in the same tag by - bundling all needed information. That makes this frame rather complex - but it's an easier solution than if one tries to achieve the same - result with several frames. The frame begins, after the frame ID, - size and encoding fields, with a price string field. A price is - constructed by one three character currency code, encoded according - to ISO 4217 [ISO-4217] alphabetic currency code, followed by a - numerical value where "." is used as decimal seperator. In the price - string several prices may be concatenated, seperated by a "/" - character, but there may only be one currency of each type. - - The price string is followed by an 8 character date string in the - format YYYYMMDD, describing for how long the price is valid. After - that is a contact URL, with which the user can contact the seller, - followed by a one byte 'received as' field. It describes how the - audio is delivered when bought according to the following list: - - $00 Other - $01 Standard CD album with other songs - $02 Compressed audio on CD - $03 File over the Internet - $04 Stream over the Internet - $05 As note sheets - $06 As note sheets in a book with other sheets - $07 Music on other media - $08 Non-musical merchandise - - Next follows a terminated string with the name of the seller followed - by a terminated string with a short description of the product. The - last thing is the ability to include a company logotype. The first of - them is the 'Picture MIME type' field containing information about - which picture format is used. In the event that the MIME media type - name is omitted, "image/" will be implied. Currently only "image/png" - and "image/jpeg" are allowed. This format string is followed by the - binary picture data. This two last fields may be omitted if no - picture is to attach. - - <Header for 'Commercial frame', ID: "COMR"> - Text encoding $xx - Price string <text string> $00 - Valid until <text string> - Contact URL <text string> $00 - Received as $xx - Name of seller <text string according to encoding> $00 (00) - Description <text string according to encoding> $00 (00) - Picture MIME type <string> $00 - Seller logo <binary data> - - -4.26. Encryption method registration - - To identify with which method a frame has been encrypted the - encryption method must be registered in the tag with this frame. The - 'Owner identifier' is a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for this specific encryption method. Questions regarding the - encryption method should be sent to the indicated email address. The - 'Method symbol' contains a value that is associated with this method - throughout the whole tag. Values below $80 are reserved. The 'Method - symbol' may optionally be followed by encryption specific data. There - may be several "ENCR" frames in a tag but only one containing the - same symbol and only one containing the same owner identifier. The - method must be used somewhere in the tag. See section 3.3.1, flag j - for more information. - - <Header for 'Encryption method registration', ID: "ENCR"> - Owner identifier <text string> $00 - Method symbol $xx - Encryption data <binary data> - - -4.27. Group identification registration - - This frame enables grouping of otherwise unrelated frames. This can - be used when some frames are to be signed. To identify which frames - belongs to a set of frames a group identifier must be registered in - the tag with this frame. The 'Owner identifier' is a null-terminated - string with a URL [URL] containing an email address, or a link to a - location where an email address can be found, that belongs to the - organisation responsible for this grouping. Questions regarding the - grouping should be sent to the indicated email address. The 'Group - symbol' contains a value that associates the frame with this group - throughout the whole tag. Values below $80 are reserved. The 'Group - symbol' may optionally be followed by some group specific data, e.g. - a digital signature. There may be several "GRID" frames in a tag but - only one containing the same symbol and only one containing the same - owner identifier. The group symbol must be used somewhere in the tag. - See section 3.3.1, flag j for more information. - - <Header for 'Group ID registration', ID: "GRID"> - Owner identifier <text string> $00 - Group symbol $xx - Group dependent data <binary data> - - -4.28. Private frame - - This frame is used to contain information from a software producer - that its program uses and does not fit into the other frames. The - frame consists of an 'Owner identifier' string and the binary data. - The 'Owner identifier' is a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for the frame. Questions regarding the frame should be sent to the - indicated email address. The tag may contain more than one "PRIV" - frame but only with different contents. It is recommended to keep the - number of "PRIV" frames as low as possible. - - <Header for 'Private frame', ID: "PRIV"> - Owner identifier <text string> $00 - The private data <binary data> - - -5. The 'unsynchronisation scheme' - - The only purpose of the 'unsynchronisation scheme' is to make the - ID3v2 tag as compatible as possible with existing software. There is - no use in 'unsynchronising' tags if the file is only to be processed - by new software. Unsynchronisation may only be made with MPEG 2 layer - I, II and III and MPEG 2.5 files. - - Whenever a false synchronisation is found within the tag, one zeroed - byte is inserted after the first false synchronisation byte. The - format of a correct sync that should be altered by ID3 encoders is as - follows: - - %11111111 111xxxxx - - And should be replaced with: - - %11111111 00000000 111xxxxx - - This has the side effect that all $FF 00 combinations have to be - altered, so they won't be affected by the decoding process. Therefore - all the $FF 00 combinations have to be replaced with the $FF 00 00 - combination during the unsynchronisation. - - To indicate usage of the unsynchronisation, the first bit in 'ID3 - flags' should be set. This bit should only be set if the tag - contains a, now corrected, false synchronisation. The bit should - only be clear if the tag does not contain any false synchronisations. - - Do bear in mind, that if a compression scheme is used by the encoder, - the unsynchronisation scheme should be applied *afterwards*. When - decoding a compressed, 'unsynchronised' file, the 'unsynchronisation - scheme' should be parsed first, decompression afterwards. - - If the last byte in the tag is $FF, and there is a need to eliminate - false synchronisations in the tag, at least one byte of padding - should be added. - - -6. Copyright - - Copyright (C) Martin Nilsson 1998. All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that a reference to this document is included on all - such copies and derivative works. However, this document itself may - not be modified in any way and reissued as the original document. - - The limited permissions granted above are perpetual and will not be - revoked. - - This document and the information contained herein is provided on an - "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF - THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED - WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - -7. References - - [CDDB] Compact Disc Data Base - - http://www.cddb.com - - [ID3v2] Martin Nilsson, "ID3v2 informal standard". - - http://www.id3lib.org/id3/id3v2-00.txt - - [ISO-639-2] ISO/FDIS 639-2. - Codes for the representation of names of languages, Part 2: Alpha-3 - code. Technical committee / subcommittee: TC 37 / SC 2 - - [ISO-4217] ISO 4217:1995. - Codes for the representation of currencies and funds. - Technical committee / subcommittee: TC 68 - - [ISO-8859-1] ISO/IEC DIS 8859-1. - 8-bit single-byte coded graphic character sets, Part 1: Latin - alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 - - [ISRC] ISO 3901:1986 - International Standard Recording Code (ISRC). - Technical committee / subcommittee: TC 46 / SC 9 - - [JFIF] JPEG File Interchange Format, version 1.02 - - http://www.w3.org/Graphics/JPEG/jfif.txt">http://www.w3.org/Graphics/JPEG/jfif.txt - - [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail - Extensions (MIME) Part One: Format of Internet Message Bodies", - RFC 2045, November 1996. - - ftp://ftp.isi.edu/in-notes/rfc2045.txt">ftp://ftp.isi.edu/in-notes/rfc2045.txt - - [MPEG] ISO/IEC 11172-3:1993. - Coding of moving pictures and associated audio for digital storage - media at up to about 1,5 Mbit/s, Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC 13818-3:1995 - Generic coding of moving pictures and associated audio information, - Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC DIS 13818-3 - Generic coding of moving pictures and associated audio information, - Part 3: Audio (Revision of ISO/IEC 13818-3:1995) - - - [PNG] Portable Network Graphics, version 1.0 - - http://www.w3.org/TR/REC-png-multi.html - - [UNICODE] ISO/IEC 10646-1:1993. - Universal Multiple-Octet Coded Character Set (UCS), Part 1: - Architecture and Basic Multilingual Plane. - Technical committee / subcommittee: JTC 1 / SC 2 - - http://www.unicode.org/ - - [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource - Locators (URL).", RFC 1738, December 1994. - - ftp://ftp.isi.edu/in-notes/rfc1738.txt - - [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, "ZLIB - Compressed - Data Format Specification version 3.3", RFC 1950, May 1996. - - ftp://ftp.isi.edu/in-notes/rfc1950.txt - - -8. Appendix - - -A. Appendix A - Genre List from ID3v1 - - The following genres is defined in ID3v1 - - 0.Blues - 1.Classic Rock - 2.Country - 3.Dance - 4.Disco - 5.Funk - 6.Grunge - 7.Hip-Hop - 8.Jazz - 9.Metal - 10.New Age - 11.Oldies - 12.Other - 13.Pop - 14.R&B - 15.Rap - 16.Reggae - 17.Rock - 18.Techno - 19.Industrial - 20.Alternative - 21.Ska - 22.Death Metal - 23.Pranks - 24.Soundtrack - 25.Euro-Techno - 26.Ambient - 27.Trip-Hop - 28.Vocal - 29.Jazz+Funk - 30.Fusion - 31.Trance - 32.Classical - 33.Instrumental - 34.Acid - 35.House - 36.Game - 37.Sound Clip - 38.Gospel - 39.Noise - 40.AlternRock - 41.Bass - 42.Soul - 43.Punk - 44.Space - 45.Meditative - 46.Instrumental Pop - 47.Instrumental Rock - 48.Ethnic - 49.Gothic - 50.Darkwave - 51.Techno-Industrial - 52.Electronic - 53.Pop-Folk - 54.Eurodance - 55.Dream - 56.Southern Rock - 57.Comedy - 58.Cult - 59.Gangsta - 60.Top 40 - 61.Christian Rap - 62.Pop/Funk - 63.Jungle - 64.Native American - 65.Cabaret - 66.New Wave - 67.Psychadelic - 68.Rave - 69.Showtunes - 70.Trailer - 71.Lo-Fi - 72.Tribal - 73.Acid Punk - 74.Acid Jazz - 75.Polka - 76.Retro - 77.Musical - 78.Rock & Roll - 79.Hard Rock - - The following genres are Winamp extensions - - 80.Folk - 81.Folk-Rock - 82.National Folk - 83.Swing - 84.Fast Fusion - 85.Bebob - 86.Latin - 87.Revival - 88.Celtic - 89.Bluegrass - 90.Avantgarde - 91.Gothic Rock - 92.Progressive Rock - 93.Psychedelic Rock - 94.Symphonic Rock - 95.Slow Rock - 96.Big Band - 97.Chorus - 98.Easy Listening - 99.Acoustic - 100.Humour - 101.Speech - 102.Chanson - 103.Opera - 104.Chamber Music - 105.Sonata - 106.Symphony - 107.Booty Bass - 108.Primus - 109.Porn Groove - 110.Satire - 111.Slow Jam - 112.Club - 113.Tango - 114.Samba - 115.Folklore - 116.Ballad - 117.Power Ballad - 118.Rhythmic Soul - 119.Freestyle - 120.Duet - 121.Punk Rock - 122.Drum Solo - 123.Acapella - 124.Euro-House - 125.Dance Hall - - -9. Author's Address - - Written by - - Martin Nilsson - Rydsvägen 246 C. 30 - S-584 34 Linköping - Sweden - - Email: nilsson@id3.org - - - Edited by - - Dirk Mahoney - 57 Pechey Street - Chermside Q - Australia 4032 - - Email: dirk@id3.org - - - Johan Sundström - Alsättersgatan 5 A. 34 - S-584 35 Linköping - Sweden - - Email: johan@id3.org diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2.4.0-frames.txt b/src/taglib/taglib/mpeg/id3v2/id3v2.4.0-frames.txt deleted file mode 100644 index 74a21be..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2.4.0-frames.txt +++ /dev/null @@ -1,1734 +0,0 @@ -$Id$ - -Informal standard M. Nilsson -Document: id3v2.4.0-frames.txt 1st November 2000 - - - ID3 tag version 2.4.0 - Native Frames - -Status of this document - - This document is an informal standard and replaces the ID3v2.3.0 - standard [ID3v2]. A formal standard will use another revision number - even if the content is identical to document. The contents in this - document may change for clarifications but never for added or altered - functionallity. - - Distribution of this document is unlimited. - - -Abstract - - This document describes the frames natively supported by ID3v2.4.0, - which is a revised version of the ID3v2 informal standard [ID3v2.3.0] - version 2.3.0. The ID3v2 offers a flexible way of storing audio meta - information within audio file itself. The information may be - technical information, such as equalisation curves, as well as title, - performer, copyright etc. - - ID3v2.4.0 is meant to be as close as possible to ID3v2.3.0 in order - to allow for implementations to be revised as easily as possible. - - -1. Table of contents - - 2. Conventions in this document - 3. Default flags - 4. Declared ID3v2 frames - 4.1. Unique file identifier - 4.2. Text information frames - 4.2.1. Identification frames - 4.2.2. Involved persons frames - 4.2.3. Derived and subjective properties frames - 4.2.4. Rights and license frames - 4.2.5. Other text frames - 4.2.6. User defined text information frame - 4.3. URL link frames - 4.3.1. URL link frames - details - 4.3.2. User defined URL link frame - 4.4. Music CD Identifier - 4.5. Event timing codes - 4.6. MPEG location lookup table - 4.7. Synced tempo codes - 4.8. Unsynchronised lyrics/text transcription - 4.9. Synchronised lyrics/text - 4.10. Comments - 4.11. Relative volume adjustment (2) - 4.12. Equalisation (2) - 4.13. Reverb - 4.14. Attached picture - 4.15. General encapsulated object - 4.16. Play counter - 4.17. Popularimeter - 4.18. Recommended buffer size - 4.19. Audio encryption - 4.20. Linked information - 4.21. Position synchronisation frame - 4.22. Terms of use - 4.23. Ownership frame - 4.24. Commercial frame - 4.25. Encryption method registration - 4.26. Group identification registration - 4.27. Private frame - 4.28. Signature frame - 4.29. Seek frame - 4.30. Audio seek point index - 5. Copyright - 6. References - 7. Appendix - A. Appendix A - Genre List from ID3v1 - 8. Author's Address - - -2. Conventions in this document - - Text within "" is a text string exactly as it appears in a tag. - Numbers preceded with $ are hexadecimal and numbers preceded with % - are binary. $xx is used to indicate a byte with unknown content. %x - is used to indicate a bit with unknown content. The most significant - bit (MSB) of a byte is called 'bit 7' and the least significant bit - (LSB) is called 'bit 0'. - - A tag is the whole tag described the ID3v2 main structure document - [ID3v2-strct]. A frame is a block of information in the tag. The tag - consists of a header, frames and optional padding. A field is a piece - of information; one value, a string etc. A numeric string is a string - that consists of the characters "0123456789" only. - - The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", - "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this - document are to be interpreted as described in RFC 2119 [KEYWORDS]. - - -3. Default flags - - The default settings for the frames described in this document can be - divided into the following classes. The flags may be set differently - if found more suitable by the software. - - 1. Discarded if tag is altered, discarded if file is altered. - - None. - - 2. Discarded if tag is altered, preserved if file is altered. - - None. - - 3. Preserved if tag is altered, discarded if file is altered. - - ASPI, AENC, ETCO, EQU2, MLLT, POSS, SEEK, SYLT, SYTC, RVA2, TENC, - TLEN - - 4. Preserved if tag is altered, preserved if file is altered. - - The rest of the frames. - - -4. Declared ID3v2 frames - - The following frames are declared in this draft. - - 4.19 AENC Audio encryption - 4.14 APIC Attached picture - 4.30 ASPI Audio seek point index - - 4.10 COMM Comments - 4.24 COMR Commercial frame - - 4.25 ENCR Encryption method registration - 4.12 EQU2 Equalisation (2) - 4.5 ETCO Event timing codes - - 4.15 GEOB General encapsulated object - 4.26 GRID Group identification registration - - 4.20 LINK Linked information - - 4.4 MCDI Music CD identifier - 4.6 MLLT MPEG location lookup table - - 4.23 OWNE Ownership frame - - 4.27 PRIV Private frame - 4.16 PCNT Play counter - 4.17 POPM Popularimeter - 4.21 POSS Position synchronisation frame - - 4.18 RBUF Recommended buffer size - 4.11 RVA2 Relative volume adjustment (2) - 4.13 RVRB Reverb - - 4.29 SEEK Seek frame - 4.28 SIGN Signature frame - 4.9 SYLT Synchronised lyric/text - 4.7 SYTC Synchronised tempo codes - - 4.2.1 TALB Album/Movie/Show title - 4.2.3 TBPM BPM (beats per minute) - 4.2.2 TCOM Composer - 4.2.3 TCON Content type - 4.2.4 TCOP Copyright message - 4.2.5 TDEN Encoding time - 4.2.5 TDLY Playlist delay - 4.2.5 TDOR Original release time - 4.2.5 TDRC Recording time - 4.2.5 TDRL Release time - 4.2.5 TDTG Tagging time - 4.2.2 TENC Encoded by - 4.2.2 TEXT Lyricist/Text writer - 4.2.3 TFLT File type - 4.2.2 TIPL Involved people list - 4.2.1 TIT1 Content group description - 4.2.1 TIT2 Title/songname/content description - 4.2.1 TIT3 Subtitle/Description refinement - 4.2.3 TKEY Initial key - 4.2.3 TLAN Language(s) - 4.2.3 TLEN Length - 4.2.2 TMCL Musician credits list - 4.2.3 TMED Media type - 4.2.3 TMOO Mood - 4.2.1 TOAL Original album/movie/show title - 4.2.5 TOFN Original filename - 4.2.2 TOLY Original lyricist(s)/text writer(s) - 4.2.2 TOPE Original artist(s)/performer(s) - 4.2.4 TOWN File owner/licensee - 4.2.2 TPE1 Lead performer(s)/Soloist(s) - 4.2.2 TPE2 Band/orchestra/accompaniment - 4.2.2 TPE3 Conductor/performer refinement - 4.2.2 TPE4 Interpreted, remixed, or otherwise modified by - 4.2.1 TPOS Part of a set - 4.2.4 TPRO Produced notice - 4.2.4 TPUB Publisher - 4.2.1 TRCK Track number/Position in set - 4.2.4 TRSN Internet radio station name - 4.2.4 TRSO Internet radio station owner - 4.2.5 TSOA Album sort order - 4.2.5 TSOP Performer sort order - 4.2.5 TSOT Title sort order - 4.2.1 TSRC ISRC (international standard recording code) - 4.2.5 TSSE Software/Hardware and settings used for encoding - 4.2.1 TSST Set subtitle - 4.2.2 TXXX User defined text information frame - - 4.1 UFID Unique file identifier - 4.22 USER Terms of use - 4.8 USLT Unsynchronised lyric/text transcription - - 4.3.1 WCOM Commercial information - 4.3.1 WCOP Copyright/Legal information - 4.3.1 WOAF Official audio file webpage - 4.3.1 WOAR Official artist/performer webpage - 4.3.1 WOAS Official audio source webpage - 4.3.1 WORS Official Internet radio station homepage - 4.3.1 WPAY Payment - 4.3.1 WPUB Publishers official webpage - 4.3.2 WXXX User defined URL link frame - - -4.1. Unique file identifier - - This frame's purpose is to be able to identify the audio file in a - database, that may provide more information relevant to the content. - Since standardisation of such a database is beyond this document, all - UFID frames begin with an 'owner identifier' field. It is a null- - terminated string with a URL [URL] containing an email address, or a - link to a location where an email address can be found, that belongs - to the organisation responsible for this specific database - implementation. Questions regarding the database should be sent to - the indicated email address. The URL should not be used for the - actual database queries. The string - "http://www.id3.org/dummy/ufid.html" should be used for tests. The - 'Owner identifier' must be non-empty (more than just a termination). - The 'Owner identifier' is then followed by the actual identifier, - which may be up to 64 bytes. There may be more than one "UFID" frame - in a tag, but only one with the same 'Owner identifier'. - - <Header for 'Unique file identifier', ID: "UFID"> - Owner identifier <text string> $00 - Identifier <up to 64 bytes binary data> - - -4.2. Text information frames - - The text information frames are often the most important frames, - containing information like artist, album and more. There may only be - one text information frame of its kind in an tag. All text - information frames supports multiple strings, stored as a null - separated list, where null is reperesented by the termination code - for the charater encoding. All text frame identifiers begin with "T". - Only text frame identifiers begin with "T", with the exception of the - "TXXX" frame. All the text information frames have the following - format: - - <Header for 'Text information frame', ID: "T000" - "TZZZ", - excluding "TXXX" described in 4.2.6.> - Text encoding $xx - Information <text string(s) according to encoding> - - -4.2.1. Identification frames - - TIT1 - The 'Content group description' frame is used if the sound belongs to - a larger category of sounds/music. For example, classical music is - often sorted in different musical sections (e.g. "Piano Concerto", - "Weather - Hurricane"). - - TIT2 - The 'Title/Songname/Content description' frame is the actual name of - the piece (e.g. "Adagio", "Hurricane Donna"). - - TIT3 - The 'Subtitle/Description refinement' frame is used for information - directly related to the contents title (e.g. "Op. 16" or "Performed - live at Wembley"). - - TALB - The 'Album/Movie/Show title' frame is intended for the title of the - recording (or source of sound) from which the audio in the file is - taken. - - TOAL - The 'Original album/movie/show title' frame is intended for the title - of the original recording (or source of sound), if for example the - music in the file should be a cover of a previously released song. - - TRCK - The 'Track number/Position in set' frame is a numeric string - containing the order number of the audio-file on its original - recording. This MAY be extended with a "/" character and a numeric - string containing the total number of tracks/elements on the original - recording. E.g. "4/9". - - TPOS - The 'Part of a set' frame is a numeric string that describes which - part of a set the audio came from. This frame is used if the source - described in the "TALB" frame is divided into several mediums, e.g. a - double CD. The value MAY be extended with a "/" character and a - numeric string containing the total number of parts in the set. E.g. - "1/2". - - TSST - The 'Set subtitle' frame is intended for the subtitle of the part of - a set this track belongs to. - - TSRC - The 'ISRC' frame should contain the International Standard Recording - Code [ISRC] (12 characters). - - -4.2.2. Involved persons frames - - TPE1 - The 'Lead artist/Lead performer/Soloist/Performing group' is - used for the main artist. - - TPE2 - The 'Band/Orchestra/Accompaniment' frame is used for additional - information about the performers in the recording. - - TPE3 - The 'Conductor' frame is used for the name of the conductor. - - TPE4 - The 'Interpreted, remixed, or otherwise modified by' frame contains - more information about the people behind a remix and similar - interpretations of another existing piece. - - TOPE - The 'Original artist/performer' frame is intended for the performer - of the original recording, if for example the music in the file - should be a cover of a previously released song. - - TEXT - The 'Lyricist/Text writer' frame is intended for the writer of the - text or lyrics in the recording. - - TOLY - The 'Original lyricist/text writer' frame is intended for the - text writer of the original recording, if for example the music in - the file should be a cover of a previously released song. - - TCOM - The 'Composer' frame is intended for the name of the composer. - - TMCL - The 'Musician credits list' is intended as a mapping between - instruments and the musician that played it. Every odd field is an - instrument and every even is an artist or a comma delimited list of - artists. - - TIPL - The 'Involved people list' is very similar to the musician credits - list, but maps between functions, like producer, and names. - - TENC - The 'Encoded by' frame contains the name of the person or - organisation that encoded the audio file. This field may contain a - copyright message, if the audio file also is copyrighted by the - encoder. - - -4.2.3. Derived and subjective properties frames - - TBPM - The 'BPM' frame contains the number of beats per minute in the - main part of the audio. The BPM is an integer and represented as a - numerical string. - - TLEN - The 'Length' frame contains the length of the audio file in - milliseconds, represented as a numeric string. - - TKEY - The 'Initial key' frame contains the musical key in which the sound - starts. It is represented as a string with a maximum length of three - characters. The ground keys are represented with "A","B","C","D","E", - "F" and "G" and halfkeys represented with "b" and "#". Minor is - represented as "m", e.g. "Dbm" $00. Off key is represented with an - "o" only. - - TLAN - The 'Language' frame should contain the languages of the text or - lyrics spoken or sung in the audio. The language is represented with - three characters according to ISO-639-2 [ISO-639-2]. If more than one - language is used in the text their language codes should follow - according to the amount of their usage, e.g. "eng" $00 "sve" $00. - - TCON - The 'Content type', which ID3v1 was stored as a one byte numeric - value only, is now a string. You may use one or several of the ID3v1 - types as numerical strings, or, since the category list would be - impossible to maintain with accurate and up to date categories, - define your own. Example: "21" $00 "Eurodisco" $00 - - You may also use any of the following keywords: - - RX Remix - CR Cover - - TFLT - The 'File type' frame indicates which type of audio this tag defines. - The following types and refinements are defined: - - MIME MIME type follows - MPG MPEG Audio - /1 MPEG 1/2 layer I - /2 MPEG 1/2 layer II - /3 MPEG 1/2 layer III - /2.5 MPEG 2.5 - /AAC Advanced audio compression - VQF Transform-domain Weighted Interleave Vector Quantisation - PCM Pulse Code Modulated audio - - but other types may be used, but not for these types though. This is - used in a similar way to the predefined types in the "TMED" frame, - but without parentheses. If this frame is not present audio type is - assumed to be "MPG". - - TMED - The 'Media type' frame describes from which media the sound - originated. This may be a text string or a reference to the - predefined media types found in the list below. Example: - "VID/PAL/VHS" $00. - - DIG Other digital media - /A Analogue transfer from media - - ANA Other analogue media - /WAC Wax cylinder - /8CA 8-track tape cassette - - CD CD - /A Analogue transfer from media - /DD DDD - /AD ADD - /AA AAD - - LD Laserdisc - - TT Turntable records - /33 33.33 rpm - /45 45 rpm - /71 71.29 rpm - /76 76.59 rpm - /78 78.26 rpm - /80 80 rpm - - MD MiniDisc - /A Analogue transfer from media - - DAT DAT - /A Analogue transfer from media - /1 standard, 48 kHz/16 bits, linear - /2 mode 2, 32 kHz/16 bits, linear - /3 mode 3, 32 kHz/12 bits, non-linear, low speed - /4 mode 4, 32 kHz/12 bits, 4 channels - /5 mode 5, 44.1 kHz/16 bits, linear - /6 mode 6, 44.1 kHz/16 bits, 'wide track' play - - DCC DCC - /A Analogue transfer from media - - DVD DVD - /A Analogue transfer from media - - TV Television - /PAL PAL - /NTSC NTSC - /SECAM SECAM - - VID Video - /PAL PAL - /NTSC NTSC - /SECAM SECAM - /VHS VHS - /SVHS S-VHS - /BETA BETAMAX - - RAD Radio - /FM FM - /AM AM - /LW LW - /MW MW - - TEL Telephone - /I ISDN - - MC MC (normal cassette) - /4 4.75 cm/s (normal speed for a two sided cassette) - /9 9.5 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - REE Reel - /9 9.5 cm/s - /19 19 cm/s - /38 38 cm/s - /76 76 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - TMOO - The 'Mood' frame is intended to reflect the mood of the audio with a - few keywords, e.g. "Romantic" or "Sad". - - -4.2.4. Rights and license frames - - TCOP - The 'Copyright message' frame, in which the string must begin with a - year and a space character (making five characters), is intended for - the copyright holder of the original sound, not the audio file - itself. The absence of this frame means only that the copyright - information is unavailable or has been removed, and must not be - interpreted to mean that the audio is public domain. Every time this - field is displayed the field must be preceded with "Copyright " (C) " - ", where (C) is one character showing a C in a circle. - - TPRO - The 'Produced notice' frame, in which the string must begin with a - year and a space character (making five characters), is intended for - the production copyright holder of the original sound, not the audio - file itself. The absence of this frame means only that the production - copyright information is unavailable or has been removed, and must - not be interpreted to mean that the audio is public domain. Every - time this field is displayed the field must be preceded with - "Produced " (P) " ", where (P) is one character showing a P in a - circle. - - TPUB - The 'Publisher' frame simply contains the name of the label or - publisher. - - TOWN - The 'File owner/licensee' frame contains the name of the owner or - licensee of the file and it's contents. - - TRSN - The 'Internet radio station name' frame contains the name of the - internet radio station from which the audio is streamed. - - TRSO - The 'Internet radio station owner' frame contains the name of the - owner of the internet radio station from which the audio is - streamed. - -4.2.5. Other text frames - - TOFN - The 'Original filename' frame contains the preferred filename for the - file, since some media doesn't allow the desired length of the - filename. The filename is case sensitive and includes its suffix. - - TDLY - The 'Playlist delay' defines the numbers of milliseconds of silence - that should be inserted before this audio. The value zero indicates - that this is a part of a multifile audio track that should be played - continuously. - - TDEN - The 'Encoding time' frame contains a timestamp describing when the - audio was encoded. Timestamp format is described in the ID3v2 - structure document [ID3v2-strct]. - - TDOR - The 'Original release time' frame contains a timestamp describing - when the original recording of the audio was released. Timestamp - format is described in the ID3v2 structure document [ID3v2-strct]. - - TDRC - The 'Recording time' frame contains a timestamp describing when the - audio was recorded. Timestamp format is described in the ID3v2 - structure document [ID3v2-strct]. - - TDRL - The 'Release time' frame contains a timestamp describing when the - audio was first released. Timestamp format is described in the ID3v2 - structure document [ID3v2-strct]. - - TDTG - The 'Tagging time' frame contains a timestamp describing then the - audio was tagged. Timestamp format is described in the ID3v2 - structure document [ID3v2-strct]. - - TSSE - The 'Software/Hardware and settings used for encoding' frame - includes the used audio encoder and its settings when the file was - encoded. Hardware refers to hardware encoders, not the computer on - which a program was run. - - TSOA - The 'Album sort order' frame defines a string which should be used - instead of the album name (TALB) for sorting purposes. E.g. an album - named "A Soundtrack" might preferably be sorted as "Soundtrack". - - TSOP - The 'Performer sort order' frame defines a string which should be - used instead of the performer (TPE2) for sorting purposes. - - TSOT - The 'Title sort order' frame defines a string which should be used - instead of the title (TIT2) for sorting purposes. - - -4.2.6. User defined text information frame - - This frame is intended for one-string text information concerning the - audio file in a similar way to the other "T"-frames. The frame body - consists of a description of the string, represented as a terminated - string, followed by the actual string. There may be more than one - "TXXX" frame in each tag, but only one with the same description. - - <Header for 'User defined text information frame', ID: "TXXX"> - Text encoding $xx - Description <text string according to encoding> $00 (00) - Value <text string according to encoding> - - -4.3. URL link frames - - With these frames dynamic data such as webpages with touring - information, price information or plain ordinary news can be added to - the tag. There may only be one URL [URL] link frame of its kind in an - tag, except when stated otherwise in the frame description. If the - text string is followed by a string termination, all the following - information should be ignored and not be displayed. All URL link - frame identifiers begins with "W". Only URL link frame identifiers - begins with "W", except for "WXXX". All URL link frames have the - following format: - - <Header for 'URL link frame', ID: "W000" - "WZZZ", excluding "WXXX" - described in 4.3.2.> - URL <text string> - - -4.3.1. URL link frames - details - - WCOM - The 'Commercial information' frame is a URL pointing at a webpage - with information such as where the album can be bought. There may be - more than one "WCOM" frame in a tag, but not with the same content. - - WCOP - The 'Copyright/Legal information' frame is a URL pointing at a - webpage where the terms of use and ownership of the file is - described. - - WOAF - The 'Official audio file webpage' frame is a URL pointing at a file - specific webpage. - - WOAR - The 'Official artist/performer webpage' frame is a URL pointing at - the artists official webpage. There may be more than one "WOAR" frame - in a tag if the audio contains more than one performer, but not with - the same content. - - WOAS - The 'Official audio source webpage' frame is a URL pointing at the - official webpage for the source of the audio file, e.g. a movie. - - WORS - The 'Official Internet radio station homepage' contains a URL - pointing at the homepage of the internet radio station. - - WPAY - The 'Payment' frame is a URL pointing at a webpage that will handle - the process of paying for this file. - - WPUB - The 'Publishers official webpage' frame is a URL pointing at the - official webpage for the publisher. - - -4.3.2. User defined URL link frame - - This frame is intended for URL [URL] links concerning the audio file - in a similar way to the other "W"-frames. The frame body consists - of a description of the string, represented as a terminated string, - followed by the actual URL. The URL is always encoded with ISO-8859-1 - [ISO-8859-1]. There may be more than one "WXXX" frame in each tag, - but only one with the same description. - - <Header for 'User defined URL link frame', ID: "WXXX"> - Text encoding $xx - Description <text string according to encoding> $00 (00) - URL <text string> - - -4.4. Music CD identifier - - This frame is intended for music that comes from a CD, so that the CD - can be identified in databases such as the CDDB [CDDB]. The frame - consists of a binary dump of the Table Of Contents, TOC, from the CD, - which is a header of 4 bytes and then 8 bytes/track on the CD plus 8 - bytes for the 'lead out', making a maximum of 804 bytes. The offset - to the beginning of every track on the CD should be described with a - four bytes absolute CD-frame address per track, and not with absolute - time. When this frame is used the presence of a valid "TRCK" frame is - REQUIRED, even if the CD's only got one track. It is recommended that - this frame is always added to tags originating from CDs. There may - only be one "MCDI" frame in each tag. - - <Header for 'Music CD identifier', ID: "MCDI"> - CD TOC <binary data> - - -4.5. Event timing codes - - This frame allows synchronisation with key events in the audio. The - header is: - - <Header for 'Event timing codes', ID: "ETCO"> - Time stamp format $xx - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Absolute time means that every stamp contains the time from the - beginning of the file. - - Followed by a list of key events in the following format: - - Type of event $xx - Time stamp $xx (xx ...) - - The 'Time stamp' is set to zero if directly at the beginning of the - sound or after the previous event. All events MUST be sorted in - chronological order. The type of event is as follows: - - $00 padding (has no meaning) - $01 end of initial silence - $02 intro start - $03 main part start - $04 outro start - $05 outro end - $06 verse start - $07 refrain start - $08 interlude start - $09 theme start - $0A variation start - $0B key change - $0C time change - $0D momentary unwanted noise (Snap, Crackle & Pop) - $0E sustained noise - $0F sustained noise end - $10 intro end - $11 main part end - $12 verse end - $13 refrain end - $14 theme end - $15 profanity - $16 profanity end - - $17-$DF reserved for future use - - $E0-$EF not predefined synch 0-F - - $F0-$FC reserved for future use - - $FD audio end (start of silence) - $FE audio file ends - $FF one more byte of events follows (all the following bytes with - the value $FF have the same function) - - Terminating the start events such as "intro start" is OPTIONAL. The - 'Not predefined synch's ($E0-EF) are for user events. You might want - to synchronise your music to something, like setting off an explosion - on-stage, activating a screensaver etc. - - There may only be one "ETCO" frame in each tag. - - -4.6. MPEG location lookup table - - To increase performance and accuracy of jumps within a MPEG [MPEG] - audio file, frames with time codes in different locations in the file - might be useful. This ID3v2 frame includes references that the - software can use to calculate positions in the file. After the frame - header follows a descriptor of how much the 'frame counter' should be - increased for every reference. If this value is two then the first - reference points out the second frame, the 2nd reference the 4th - frame, the 3rd reference the 6th frame etc. In a similar way the - 'bytes between reference' and 'milliseconds between reference' points - out bytes and milliseconds respectively. - - Each reference consists of two parts; a certain number of bits, as - defined in 'bits for bytes deviation', that describes the difference - between what is said in 'bytes between reference' and the reality and - a certain number of bits, as defined in 'bits for milliseconds - deviation', that describes the difference between what is said in - 'milliseconds between reference' and the reality. The number of bits - in every reference, i.e. 'bits for bytes deviation'+'bits for - milliseconds deviation', must be a multiple of four. There may only - be one "MLLT" frame in each tag. - - <Header for 'Location lookup table', ID: "MLLT"> - MPEG frames between reference $xx xx - Bytes between reference $xx xx xx - Milliseconds between reference $xx xx xx - Bits for bytes deviation $xx - Bits for milliseconds dev. $xx - - Then for every reference the following data is included; - - Deviation in bytes %xxx.... - Deviation in milliseconds %xxx.... - - -4.7. Synchronised tempo codes - - For a more accurate description of the tempo of a musical piece, this - frame might be used. After the header follows one byte describing - which time stamp format should be used. Then follows one or more - tempo codes. Each tempo code consists of one tempo part and one time - part. The tempo is in BPM described with one or two bytes. If the - first byte has the value $FF, one more byte follows, which is added - to the first giving a range from 2 - 510 BPM, since $00 and $01 is - reserved. $00 is used to describe a beat-free time period, which is - not the same as a music-free time period. $01 is used to indicate one - single beat-stroke followed by a beat-free period. - - The tempo descriptor is followed by a time stamp. Every time the - tempo in the music changes, a tempo descriptor may indicate this for - the player. All tempo descriptors MUST be sorted in chronological - order. The first beat-stroke in a time-period is at the same time as - the beat description occurs. There may only be one "SYTC" frame in - each tag. - - <Header for 'Synchronised tempo codes', ID: "SYTC"> - Time stamp format $xx - Tempo data <binary data> - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Absolute time means that every stamp contains the time from the - beginning of the file. - - -4.8. Unsynchronised lyrics/text transcription - - This frame contains the lyrics of the song or a text transcription of - other vocal activities. The head includes an encoding descriptor and - a content descriptor. The body consists of the actual text. The - 'Content descriptor' is a terminated string. If no descriptor is - entered, 'Content descriptor' is $00 (00) only. Newline characters - are allowed in the text. There may be more than one 'Unsynchronised - lyrics/text transcription' frame in each tag, but only one with the - same language and content descriptor. - - <Header for 'Unsynchronised lyrics/text transcription', ID: "USLT"> - Text encoding $xx - Language $xx xx xx - Content descriptor <text string according to encoding> $00 (00) - Lyrics/text <full text string according to encoding> - - -4.9. Synchronised lyrics/text - - This is another way of incorporating the words, said or sung lyrics, - in the audio file as text, this time, however, in sync with the - audio. It might also be used to describing events e.g. occurring on a - stage or on the screen in sync with the audio. The header includes a - content descriptor, represented with as terminated text string. If no - descriptor is entered, 'Content descriptor' is $00 (00) only. - - <Header for 'Synchronised lyrics/text', ID: "SYLT"> - Text encoding $xx - Language $xx xx xx - Time stamp format $xx - Content type $xx - Content descriptor <text string according to encoding> $00 (00) - - Content type: $00 is other - $01 is lyrics - $02 is text transcription - $03 is movement/part name (e.g. "Adagio") - $04 is events (e.g. "Don Quijote enters the stage") - $05 is chord (e.g. "Bb F Fsus") - $06 is trivia/'pop up' information - $07 is URLs to webpages - $08 is URLs to images - - Time stamp format: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Absolute time means that every stamp contains the time from the - beginning of the file. - - The text that follows the frame header differs from that of the - unsynchronised lyrics/text transcription in one major way. Each - syllable (or whatever size of text is considered to be convenient by - the encoder) is a null terminated string followed by a time stamp - denoting where in the sound file it belongs. Each sync thus has the - following structure: - - Terminated text to be synced (typically a syllable) - Sync identifier (terminator to above string) $00 (00) - Time stamp $xx (xx ...) - - The 'time stamp' is set to zero or the whole sync is omitted if - located directly at the beginning of the sound. All time stamps - should be sorted in chronological order. The sync can be considered - as a validator of the subsequent string. - - Newline characters are allowed in all "SYLT" frames and MUST be used - after every entry (name, event etc.) in a frame with the content type - $03 - $04. - - A few considerations regarding whitespace characters: Whitespace - separating words should mark the beginning of a new word, thus - occurring in front of the first syllable of a new word. This is also - valid for new line characters. A syllable followed by a comma should - not be broken apart with a sync (both the syllable and the comma - should be before the sync). - - An example: The "USLT" passage - - "Strangers in the night" $0A "Exchanging glances" - - would be "SYLT" encoded as: - - "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx - " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx - xx "glan" $00 xx xx "ces" $00 xx xx - - There may be more than one "SYLT" frame in each tag, but only one - with the same language and content descriptor. - - -4.10. Comments - - This frame is intended for any kind of full text information that - does not fit in any other frame. It consists of a frame header - followed by encoding, language and content descriptors and is ended - with the actual comment as a text string. Newline characters are - allowed in the comment text string. There may be more than one - comment frame in each tag, but only one with the same language and - content descriptor. - - <Header for 'Comment', ID: "COMM"> - Text encoding $xx - Language $xx xx xx - Short content descrip. <text string according to encoding> $00 (00) - The actual text <full text string according to encoding> - - -4.11. Relative volume adjustment (2) - - This is a more subjective frame than the previous ones. It allows the - user to say how much he wants to increase/decrease the volume on each - channel when the file is played. The purpose is to be able to align - all files to a reference volume, so that you don't have to change the - volume constantly. This frame may also be used to balance adjust the - audio. The volume adjustment is encoded as a fixed point decibel - value, 16 bit signed integer representing (adjustment*512), giving - +/- 64 dB with a precision of 0.001953125 dB. E.g. +2 dB is stored as - $04 00 and -2 dB is $FC 00. There may be more than one "RVA2" frame - in each tag, but only one with the same identification string. - - <Header for 'Relative volume adjustment (2)', ID: "RVA2"> - Identification <text string> $00 - - The 'identification' string is used to identify the situation and/or - device where this adjustment should apply. The following is then - repeated for every channel - - Type of channel $xx - Volume adjustment $xx xx - Bits representing peak $xx - Peak volume $xx (xx ...) - - - Type of channel: $00 Other - $01 Master volume - $02 Front right - $03 Front left - $04 Back right - $05 Back left - $06 Front centre - $07 Back centre - $08 Subwoofer - - Bits representing peak can be any number between 0 and 255. 0 means - that there is no peak volume field. The peak volume field is always - padded to whole bytes, setting the most significant bits to zero. - - -4.12. Equalisation (2) - - This is another subjective, alignment frame. It allows the user to - predefine an equalisation curve within the audio file. There may be - more than one "EQU2" frame in each tag, but only one with the same - identification string. - - <Header of 'Equalisation (2)', ID: "EQU2"> - Interpolation method $xx - Identification <text string> $00 - - The 'interpolation method' describes which method is preferred when - an interpolation between the adjustment point that follows. The - following methods are currently defined: - - $00 Band - No interpolation is made. A jump from one adjustment level to - another occurs in the middle between two adjustment points. - $01 Linear - Interpolation between adjustment points is linear. - - The 'identification' string is used to identify the situation and/or - device where this adjustment should apply. The following is then - repeated for every adjustment point - - Frequency $xx xx - Volume adjustment $xx xx - - The frequency is stored in units of 1/2 Hz, giving it a range from 0 - to 32767 Hz. - - The volume adjustment is encoded as a fixed point decibel value, 16 - bit signed integer representing (adjustment*512), giving +/- 64 dB - with a precision of 0.001953125 dB. E.g. +2 dB is stored as $04 00 - and -2 dB is $FC 00. - - Adjustment points should be ordered by frequency and one frequency - should only be described once in the frame. - - -4.13. Reverb - - Yet another subjective frame, with which you can adjust echoes of - different kinds. Reverb left/right is the delay between every bounce - in ms. Reverb bounces left/right is the number of bounces that should - be made. $FF equals an infinite number of bounces. Feedback is the - amount of volume that should be returned to the next echo bounce. $00 - is 0%, $FF is 100%. If this value were $7F, there would be 50% volume - reduction on the first bounce, 50% of that on the second and so on. - Left to left means the sound from the left bounce to be played in the - left speaker, while left to right means sound from the left bounce to - be played in the right speaker. - - 'Premix left to right' is the amount of left sound to be mixed in the - right before any reverb is applied, where $00 id 0% and $FF is 100%. - 'Premix right to left' does the same thing, but right to left. - Setting both premix to $FF would result in a mono output (if the - reverb is applied symmetric). There may only be one "RVRB" frame in - each tag. - - <Header for 'Reverb', ID: "RVRB"> - Reverb left (ms) $xx xx - Reverb right (ms) $xx xx - Reverb bounces, left $xx - Reverb bounces, right $xx - Reverb feedback, left to left $xx - Reverb feedback, left to right $xx - Reverb feedback, right to right $xx - Reverb feedback, right to left $xx - Premix left to right $xx - Premix right to left $xx - - -4.14. Attached picture - - This frame contains a picture directly related to the audio file. - Image format is the MIME type and subtype [MIME] for the image. In - the event that the MIME media type name is omitted, "image/" will be - implied. The "image/png" [PNG] or "image/jpeg" [JFIF] picture format - should be used when interoperability is wanted. Description is a - short description of the picture, represented as a terminated - text string. There may be several pictures attached to one file, each - in their individual "APIC" frame, but only one with the same content - descriptor. There may only be one picture with the picture type - declared as picture type $01 and $02 respectively. There is the - possibility to put only a link to the image file by using the 'MIME - type' "-->" and having a complete URL [URL] instead of picture data. - The use of linked files should however be used sparingly since there - is the risk of separation of files. - - <Header for 'Attached picture', ID: "APIC"> - Text encoding $xx - MIME type <text string> $00 - Picture type $xx - Description <text string according to encoding> $00 (00) - Picture data <binary data> - - - Picture type: $00 Other - $01 32x32 pixels 'file icon' (PNG only) - $02 Other file icon - $03 Cover (front) - $04 Cover (back) - $05 Leaflet page - $06 Media (e.g. label side of CD) - $07 Lead artist/lead performer/soloist - $08 Artist/performer - $09 Conductor - $0A Band/Orchestra - $0B Composer - $0C Lyricist/text writer - $0D Recording Location - $0E During recording - $0F During performance - $10 Movie/video screen capture - $11 A bright coloured fish - $12 Illustration - $13 Band/artist logotype - $14 Publisher/Studio logotype - - -4.15. General encapsulated object - - In this frame any type of file can be encapsulated. After the header, - 'Frame size' and 'Encoding' follows 'MIME type' [MIME] represented as - as a terminated string encoded with ISO 8859-1 [ISO-8859-1]. The - filename is case sensitive and is encoded as 'Encoding'. Then follows - a content description as terminated string, encoded as 'Encoding'. - The last thing in the frame is the actual object. The first two - strings may be omitted, leaving only their terminations. MIME type is - always an ISO-8859-1 text string. There may be more than one "GEOB" - frame in each tag, but only one with the same content descriptor. - - <Header for 'General encapsulated object', ID: "GEOB"> - Text encoding $xx - MIME type <text string> $00 - Filename <text string according to encoding> $00 (00) - Content description <text string according to encoding> $00 (00) - Encapsulated object <binary data> - - -4.16. Play counter - - This is simply a counter of the number of times a file has been - played. The value is increased by one every time the file begins to - play. There may only be one "PCNT" frame in each tag. When the - counter reaches all one's, one byte is inserted in front of the - counter thus making the counter eight bits bigger. The counter must - be at least 32-bits long to begin with. - - <Header for 'Play counter', ID: "PCNT"> - Counter $xx xx xx xx (xx ...) - - -4.17. Popularimeter - - The purpose of this frame is to specify how good an audio file is. - Many interesting applications could be found to this frame such as a - playlist that features better audio files more often than others or - it could be used to profile a person's taste and find other 'good' - files by comparing people's profiles. The frame contains the email - address to the user, one rating byte and a four byte play counter, - intended to be increased with one for every time the file is played. - The email is a terminated string. The rating is 1-255 where 1 is - worst and 255 is best. 0 is unknown. If no personal counter is wanted - it may be omitted. When the counter reaches all one's, one byte is - inserted in front of the counter thus making the counter eight bits - bigger in the same away as the play counter ("PCNT"). There may be - more than one "POPM" frame in each tag, but only one with the same - email address. - - <Header for 'Popularimeter', ID: "POPM"> - Email to user <text string> $00 - Rating $xx - Counter $xx xx xx xx (xx ...) - - -4.18. Recommended buffer size - - Sometimes the server from which an audio file is streamed is aware of - transmission or coding problems resulting in interruptions in the - audio stream. In these cases, the size of the buffer can be - recommended by the server using this frame. If the 'embedded info - flag' is true (1) then this indicates that an ID3 tag with the - maximum size described in 'Buffer size' may occur in the audio - stream. In such case the tag should reside between two MPEG [MPEG] - frames, if the audio is MPEG encoded. If the position of the next tag - is known, 'offset to next tag' may be used. The offset is calculated - from the end of tag in which this frame resides to the first byte of - the header in the next. This field may be omitted. Embedded tags are - generally not recommended since this could render unpredictable - behaviour from present software/hardware. - - For applications like streaming audio it might be an idea to embed - tags into the audio stream though. If the clients connects to - individual connections like HTTP and there is a possibility to begin - every transmission with a tag, then this tag should include a - 'recommended buffer size' frame. If the client is connected to a - arbitrary point in the stream, such as radio or multicast, then the - 'recommended buffer size' frame SHOULD be included in every tag. - - The 'Buffer size' should be kept to a minimum. There may only be one - "RBUF" frame in each tag. - - <Header for 'Recommended buffer size', ID: "RBUF"> - Buffer size $xx xx xx - Embedded info flag %0000000x - Offset to next tag $xx xx xx xx - - -4.19. Audio encryption - - This frame indicates if the actual audio stream is encrypted, and by - whom. Since standardisation of such encryption scheme is beyond this - document, all "AENC" frames begin with a terminated string with a - URL containing an email address, or a link to a location where an - email address can be found, that belongs to the organisation - responsible for this specific encrypted audio file. Questions - regarding the encrypted audio should be sent to the email address - specified. If a $00 is found directly after the 'Frame size' and the - audio file indeed is encrypted, the whole file may be considered - useless. - - After the 'Owner identifier', a pointer to an unencrypted part of the - audio can be specified. The 'Preview start' and 'Preview length' is - described in frames. If no part is unencrypted, these fields should - be left zeroed. After the 'preview length' field follows optionally a - data block required for decryption of the audio. There may be more - than one "AENC" frames in a tag, but only one with the same 'Owner - identifier'. - - <Header for 'Audio encryption', ID: "AENC"> - Owner identifier <text string> $00 - Preview start $xx xx - Preview length $xx xx - Encryption info <binary data> - - -4.20. Linked information - - To keep information duplication as low as possible this frame may be - used to link information from another ID3v2 tag that might reside in - another audio file or alone in a binary file. It is RECOMMENDED that - this method is only used when the files are stored on a CD-ROM or - other circumstances when the risk of file separation is low. The - frame contains a frame identifier, which is the frame that should be - linked into this tag, a URL [URL] field, where a reference to the - file where the frame is given, and additional ID data, if needed. - Data should be retrieved from the first tag found in the file to - which this link points. There may be more than one "LINK" frame in a - tag, but only one with the same contents. A linked frame is to be - considered as part of the tag and has the same restrictions as if it - was a physical part of the tag (i.e. only one "RVRB" frame allowed, - whether it's linked or not). - - <Header for 'Linked information', ID: "LINK"> - Frame identifier $xx xx xx xx - URL <text string> $00 - ID and additional data <text string(s)> - - Frames that may be linked and need no additional data are "ASPI", - "ETCO", "EQU2", "MCID", "MLLT", "OWNE", "RVA2", "RVRB", "SYTC", the - text information frames and the URL link frames. - - The "AENC", "APIC", "GEOB" and "TXXX" frames may be linked with - the content descriptor as additional ID data. - - The "USER" frame may be linked with the language field as additional - ID data. - - The "PRIV" frame may be linked with the owner identifier as - additional ID data. - - The "COMM", "SYLT" and "USLT" frames may be linked with three bytes - of language descriptor directly followed by a content descriptor as - additional ID data. - - -4.21. Position synchronisation frame - - This frame delivers information to the listener of how far into the - audio stream he picked up; in effect, it states the time offset from - the first frame in the stream. The frame layout is: - - <Head for 'Position synchronisation', ID: "POSS"> - Time stamp format $xx - Position $xx (xx ...) - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - and position is where in the audio the listener starts to receive, - i.e. the beginning of the next frame. If this frame is used in the - beginning of a file the value is always 0. There may only be one - "POSS" frame in each tag. - - -4.22. Terms of use frame - - This frame contains a brief description of the terms of use and - ownership of the file. More detailed information concerning the legal - terms might be available through the "WCOP" frame. Newlines are - allowed in the text. There may be more than one 'Terms of use' frame - in a tag, but only one with the same 'Language'. - - <Header for 'Terms of use frame', ID: "USER"> - Text encoding $xx - Language $xx xx xx - The actual text <text string according to encoding> - - -4.23. Ownership frame - - The ownership frame might be used as a reminder of a made transaction - or, if signed, as proof. Note that the "USER" and "TOWN" frames are - good to use in conjunction with this one. The frame begins, after the - frame ID, size and encoding fields, with a 'price paid' field. The - first three characters of this field contains the currency used for - the transaction, encoded according to ISO 4217 [ISO-4217] alphabetic - currency code. Concatenated to this is the actual price paid, as a - numerical string using "." as the decimal separator. Next is an 8 - character date string (YYYYMMDD) followed by a string with the name - of the seller as the last field in the frame. There may only be one - "OWNE" frame in a tag. - - <Header for 'Ownership frame', ID: "OWNE"> - Text encoding $xx - Price paid <text string> $00 - Date of purch. <text string> - Seller <text string according to encoding> - - -4.24. Commercial frame - - This frame enables several competing offers in the same tag by - bundling all needed information. That makes this frame rather complex - but it's an easier solution than if one tries to achieve the same - result with several frames. The frame begins, after the frame ID, - size and encoding fields, with a price string field. A price is - constructed by one three character currency code, encoded according - to ISO 4217 [ISO-4217] alphabetic currency code, followed by a - numerical value where "." is used as decimal separator. In the price - string several prices may be concatenated, separated by a "/" - character, but there may only be one currency of each type. - - The price string is followed by an 8 character date string in the - format YYYYMMDD, describing for how long the price is valid. After - that is a contact URL, with which the user can contact the seller, - followed by a one byte 'received as' field. It describes how the - audio is delivered when bought according to the following list: - - $00 Other - $01 Standard CD album with other songs - $02 Compressed audio on CD - $03 File over the Internet - $04 Stream over the Internet - $05 As note sheets - $06 As note sheets in a book with other sheets - $07 Music on other media - $08 Non-musical merchandise - - Next follows a terminated string with the name of the seller followed - by a terminated string with a short description of the product. The - last thing is the ability to include a company logotype. The first of - them is the 'Picture MIME type' field containing information about - which picture format is used. In the event that the MIME media type - name is omitted, "image/" will be implied. Currently only "image/png" - and "image/jpeg" are allowed. This format string is followed by the - binary picture data. This two last fields may be omitted if no - picture is attached. There may be more than one 'commercial frame' in - a tag, but no two may be identical. - - <Header for 'Commercial frame', ID: "COMR"> - Text encoding $xx - Price string <text string> $00 - Valid until <text string> - Contact URL <text string> $00 - Received as $xx - Name of seller <text string according to encoding> $00 (00) - Description <text string according to encoding> $00 (00) - Picture MIME type <string> $00 - Seller logo <binary data> - - -4.25. Encryption method registration - - To identify with which method a frame has been encrypted the - encryption method must be registered in the tag with this frame. The - 'Owner identifier' is a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for this specific encryption method. Questions regarding the - encryption method should be sent to the indicated email address. The - 'Method symbol' contains a value that is associated with this method - throughout the whole tag, in the range $80-F0. All other values are - reserved. The 'Method symbol' may optionally be followed by - encryption specific data. There may be several "ENCR" frames in a tag - but only one containing the same symbol and only one containing the - same owner identifier. The method must be used somewhere in the tag. - See the description of the frame encryption flag in the ID3v2 - structure document [ID3v2-strct] for more information. - - <Header for 'Encryption method registration', ID: "ENCR"> - Owner identifier <text string> $00 - Method symbol $xx - Encryption data <binary data> - - -4.26. Group identification registration - - This frame enables grouping of otherwise unrelated frames. This can - be used when some frames are to be signed. To identify which frames - belongs to a set of frames a group identifier must be registered in - the tag with this frame. The 'Owner identifier' is a null-terminated - string with a URL [URL] containing an email address, or a link to a - location where an email address can be found, that belongs to the - organisation responsible for this grouping. Questions regarding the - grouping should be sent to the indicated email address. The 'Group - symbol' contains a value that associates the frame with this group - throughout the whole tag, in the range $80-F0. All other values are - reserved. The 'Group symbol' may optionally be followed by some group - specific data, e.g. a digital signature. There may be several "GRID" - frames in a tag but only one containing the same symbol and only one - containing the same owner identifier. The group symbol must be used - somewhere in the tag. See the description of the frame grouping flag - in the ID3v2 structure document [ID3v2-strct] for more information. - - <Header for 'Group ID registration', ID: "GRID"> - Owner identifier <text string> $00 - Group symbol $xx - Group dependent data <binary data> - - -4.27. Private frame - - This frame is used to contain information from a software producer - that its program uses and does not fit into the other frames. The - frame consists of an 'Owner identifier' string and the binary data. - The 'Owner identifier' is a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for the frame. Questions regarding the frame should be sent to the - indicated email address. The tag may contain more than one "PRIV" - frame but only with different contents. - - <Header for 'Private frame', ID: "PRIV"> - Owner identifier <text string> $00 - The private data <binary data> - - -4.28. Signature frame - - This frame enables a group of frames, grouped with the 'Group - identification registration', to be signed. Although signatures can - reside inside the registration frame, it might be desired to store - the signature elsewhere, e.g. in watermarks. There may be more than - one 'signature frame' in a tag, but no two may be identical. - - <Header for 'Signature frame', ID: "SIGN"> - Group symbol $xx - Signature <binary data> - - -4.29. Seek frame - - This frame indicates where other tags in a file/stream can be found. - The 'minimum offset to next tag' is calculated from the end of this - tag to the beginning of the next. There may only be one 'seek frame' - in a tag. - - <Header for 'Seek frame', ID: "SEEK"> - Minimum offset to next tag $xx xx xx xx - - -4.30. Audio seek point index - - Audio files with variable bit rates are intrinsically difficult to - deal with in the case of seeking within the file. The ASPI frame - makes seeking easier by providing a list a seek points within the - audio file. The seek points are a fractional offset within the audio - data, providing a starting point from which to find an appropriate - point to start decoding. The presence of an ASPI frame requires the - existence of a TLEN frame, indicating the duration of the file in - milliseconds. There may only be one 'audio seek point index' frame in - a tag. - - <Header for 'Seek Point Index', ID: "ASPI"> - Indexed data start (S) $xx xx xx xx - Indexed data length (L) $xx xx xx xx - Number of index points (N) $xx xx - Bits per index point (b) $xx - - Then for every index point the following data is included; - - Fraction at index (Fi) $xx (xx) - - 'Indexed data start' is a byte offset from the beginning of the file. - 'Indexed data length' is the byte length of the audio data being - indexed. 'Number of index points' is the number of index points, as - the name implies. The recommended number is 100. 'Bits per index - point' is 8 or 16, depending on the chosen precision. 8 bits works - well for short files (less than 5 minutes of audio), while 16 bits is - advantageous for long files. 'Fraction at index' is the numerator of - the fraction representing a relative position in the data. The - denominator is 2 to the power of b. - - Here are the algorithms to be used in the calculation. The known data - must be the offset of the start of the indexed data (S), the offset - of the end of the indexed data (E), the number of index points (N), - the offset at index i (Oi). We calculate the fraction at index i - (Fi). - - Oi is the offset of the frame whose start is soonest after the point - for which the time offset is (i/N * duration). - - The frame data should be calculated as follows: - - Fi = Oi/L * 2^b (rounded down to the nearest integer) - - Offset calculation should be calculated as follows from data in the - frame: - - Oi = (Fi/2^b)*L (rounded up to the nearest integer) - - -5. Copyright - - Copyright (C) Martin Nilsson 2000. All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that a reference to this document is included on all - such copies and derivative works. However, this document itself may - not be modified in any way and reissued as the original document. - - The limited permissions granted above are perpetual and will not be - revoked. - - This document and the information contained herein is provided on an - "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF - THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED - WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - -6. References - - [CDDB] Compact Disc Data Base - - <url:http://www.cddb.com> - - [ID3v2.3.0] Martin Nilsson, "ID3v2 informal standard". - - <url:http://www.id3.org/id3v2.3.0.txt> - - [ID3v2-strct] Martin Nilsson, - "ID3 tag version 2.4.0 - Main Structure" - - <url:http//www.id3.org/id3v2.4.0-structure.txt> - - [ISO-639-2] ISO/FDIS 639-2. - Codes for the representation of names of languages, Part 2: Alpha-3 - code. Technical committee / subcommittee: TC 37 / SC 2 - - [ISO-4217] ISO 4217:1995. - Codes for the representation of currencies and funds. - Technical committee / subcommittee: TC 68 - - [ISO-8859-1] ISO/IEC DIS 8859-1. - 8-bit single-byte coded graphic character sets, Part 1: Latin - alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 - - [ISRC] ISO 3901:1986 - International Standard Recording Code (ISRC). - Technical committee / subcommittee: TC 46 / SC 9 - - [JFIF] JPEG File Interchange Format, version 1.02 - - <url:http://www.w3.org/Graphics/JPEG/jfif.txt> - - [KEYWORDS] S. Bradner, 'Key words for use in RFCs to Indicate - Requirement Levels', RFC 2119, March 1997. - - <url:ftp://ftp.isi.edu/in-notes/rfc2119.txt> - - [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail - Extensions (MIME) Part One: Format of Internet Message Bodies", - RFC 2045, November 1996. - - <url:ftp://ftp.isi.edu/in-notes/rfc2045.txt> - - [MPEG] ISO/IEC 11172-3:1993. - Coding of moving pictures and associated audio for digital storage - media at up to about 1,5 Mbit/s, Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC 13818-3:1995 - Generic coding of moving pictures and associated audio information, - Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC DIS 13818-3 - Generic coding of moving pictures and associated audio information, - Part 3: Audio (Revision of ISO/IEC 13818-3:1995) - - - [PNG] Portable Network Graphics, version 1.0 - - <url:http://www.w3.org/TR/REC-png-multi.html> - - [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource - Locators (URL).", RFC 1738, December 1994. - - <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> - - [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, "ZLIB - Compressed - Data Format Specification version 3.3", RFC 1950, May 1996. - - <url:ftp://ftp.isi.edu/in-notes/rfc1950.txt> - - -7. Appendix - - -A. Appendix A - Genre List from ID3v1 - - The following genres is defined in ID3v1 - - 0.Blues - 1.Classic Rock - 2.Country - 3.Dance - 4.Disco - 5.Funk - 6.Grunge - 7.Hip-Hop - 8.Jazz - 9.Metal - 10.New Age - 11.Oldies - 12.Other - 13.Pop - 14.R&B - 15.Rap - 16.Reggae - 17.Rock - 18.Techno - 19.Industrial - 20.Alternative - 21.Ska - 22.Death Metal - 23.Pranks - 24.Soundtrack - 25.Euro-Techno - 26.Ambient - 27.Trip-Hop - 28.Vocal - 29.Jazz+Funk - 30.Fusion - 31.Trance - 32.Classical - 33.Instrumental - 34.Acid - 35.House - 36.Game - 37.Sound Clip - 38.Gospel - 39.Noise - 40.AlternRock - 41.Bass - 42.Soul - 43.Punk - 44.Space - 45.Meditative - 46.Instrumental Pop - 47.Instrumental Rock - 48.Ethnic - 49.Gothic - 50.Darkwave - 51.Techno-Industrial - 52.Electronic - 53.Pop-Folk - 54.Eurodance - 55.Dream - 56.Southern Rock - 57.Comedy - 58.Cult - 59.Gangsta - 60.Top 40 - 61.Christian Rap - 62.Pop/Funk - 63.Jungle - 64.Native American - 65.Cabaret - 66.New Wave - 67.Psychadelic - 68.Rave - 69.Showtunes - 70.Trailer - 71.Lo-Fi - 72.Tribal - 73.Acid Punk - 74.Acid Jazz - 75.Polka - 76.Retro - 77.Musical - 78.Rock & Roll - 79.Hard Rock - - -8. Author's Address - - Written by - - Martin Nilsson - Rydsvägen 246 C. 30 - SE-584 34 Linköping - Sweden - - Email: nilsson@id3.org diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2.4.0-structure.txt b/src/taglib/taglib/mpeg/id3v2/id3v2.4.0-structure.txt deleted file mode 100644 index 5fa156a..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2.4.0-structure.txt +++ /dev/null @@ -1,733 +0,0 @@ - -Informal standard M. Nilsson -Document: id3v2.4.0-structure.txt 16 September 2001 - - - ID3 tag version 2.4.0 - Main Structure - -Status of this document - - This document is an informal standard and replaces the ID3v2.3.0 - standard [ID3v2]. A formal standard will use another revision number - even if the content is identical to document. The contents in this - document may change for clarifications but never for added or altered - functionallity. - - Distribution of this document is unlimited. - - -Abstract - - This document describes the main structure of ID3v2.4.0, which is a - revised version of the ID3v2 informal standard [ID3v2] version - 2.3.0. The ID3v2 offers a flexible way of storing audio meta - information within the audio file itself. The information may be - technical information, such as equalisation curves, as well as - title, performer, copyright etc. - - ID3v2.4.0 is meant to be as close as possible to ID3v2.3.0 in order - to allow for implementations to be revised as easily as possible. - - -1. Table of contents - - Status of this document - Abstract - 1. Table of contents - 2. Conventions in this document - 2. Standard overview - 3. ID3v2 overview - 3.1. ID3v2 header - 3.2. ID3v2 extended header - 3.3. Padding - 3.4. ID3v2 footer - 4. ID3v2 frames overview - 4.1. Frame header flags - 4.1.1. Frame status flags - 4.1.2. Frame format flags - 5. Tag location - 6. Unsynchronisation - 6.1. The unsynchronisation scheme - 6.2. Synchsafe integers - 7. Copyright - 8. References - 9. Author's Address - - -2. Conventions in this document - - Text within "" is a text string exactly as it appears in a tag. - Numbers preceded with $ are hexadecimal and numbers preceded with % - are binary. $xx is used to indicate a byte with unknown content. %x - is used to indicate a bit with unknown content. The most significant - bit (MSB) of a byte is called 'bit 7' and the least significant bit - (LSB) is called 'bit 0'. - - A tag is the whole tag described in this document. A frame is a block - of information in the tag. The tag consists of a header, frames and - optional padding. A field is a piece of information; one value, a - string etc. A numeric string is a string that consists of the - characters "0123456789" only. - - The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", - "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this - document are to be interpreted as described in RFC 2119 [KEYWORDS]. - - -3. ID3v2 overview - - ID3v2 is a general tagging format for audio, which makes it possible - to store meta data about the audio inside the audio file itself. The - ID3 tag described in this document is mainly targeted at files - encoded with MPEG-1/2 layer I, MPEG-1/2 layer II, MPEG-1/2 layer III - and MPEG-2.5, but may work with other types of encoded audio or as a - stand alone format for audio meta data. - - ID3v2 is designed to be as flexible and expandable as possible to - meet new meta information needs that might arise. To achieve that - ID3v2 is constructed as a container for several information blocks, - called frames, whose format need not be known to the software that - encounters them. At the start of every frame is an unique and - predefined identifier, a size descriptor that allows software to skip - unknown frames and a flags field. The flags describes encoding - details and if the frame should remain in the tag, should it be - unknown to the software, if the file is altered. - - The bitorder in ID3v2 is most significant bit first (MSB). The - byteorder in multibyte numbers is most significant byte first (e.g. - $12345678 would be encoded $12 34 56 78), also known as big endian - and network byte order. - - Overall tag structure: - - +-----------------------------+ - | Header (10 bytes) | - +-----------------------------+ - | Extended Header | - | (variable length, OPTIONAL) | - +-----------------------------+ - | Frames (variable length) | - +-----------------------------+ - | Padding | - | (variable length, OPTIONAL) | - +-----------------------------+ - | Footer (10 bytes, OPTIONAL) | - +-----------------------------+ - - In general, padding and footer are mutually exclusive. See details in - sections 3.3, 3.4 and 5. - - -3.1. ID3v2 header - - The first part of the ID3v2 tag is the 10 byte tag header, laid out - as follows: - - ID3v2/file identifier "ID3" - ID3v2 version $04 00 - ID3v2 flags %abcd0000 - ID3v2 size 4 * %0xxxxxxx - - The first three bytes of the tag are always "ID3", to indicate that - this is an ID3v2 tag, directly followed by the two version bytes. The - first byte of ID3v2 version is its major version, while the second - byte is its revision number. In this case this is ID3v2.4.0. All - revisions are backwards compatible while major versions are not. If - software with ID3v2.4.0 and below support should encounter version - five or higher it should simply ignore the whole tag. Version or - revision will never be $FF. - - The version is followed by the ID3v2 flags field, of which currently - four flags are used. - - - a - Unsynchronisation - - Bit 7 in the 'ID3v2 flags' indicates whether or not - unsynchronisation is applied on all frames (see section 6.1 for - details); a set bit indicates usage. - - - b - Extended header - - The second bit (bit 6) indicates whether or not the header is - followed by an extended header. The extended header is described in - section 3.2. A set bit indicates the presence of an extended - header. - - - c - Experimental indicator - - The third bit (bit 5) is used as an 'experimental indicator'. This - flag SHALL always be set when the tag is in an experimental stage. - - - d - Footer present - - Bit 4 indicates that a footer (section 3.4) is present at the very - end of the tag. A set bit indicates the presence of a footer. - - - All the other flags MUST be cleared. If one of these undefined flags - are set, the tag might not be readable for a parser that does not - know the flags function. - - The ID3v2 tag size is stored as a 32 bit synchsafe integer (section - 6.2), making a total of 28 effective bits (representing up to 256MB). - - The ID3v2 tag size is the sum of the byte length of the extended - header, the padding and the frames after unsynchronisation. If a - footer is present this equals to ('total size' - 20) bytes, otherwise - ('total size' - 10) bytes. - - An ID3v2 tag can be detected with the following pattern: - $49 44 33 yy yy xx zz zz zz zz - Where yy is less than $FF, xx is the 'flags' byte and zz is less than - $80. - - -3.2. Extended header - - The extended header contains information that can provide further - insight in the structure of the tag, but is not vital to the correct - parsing of the tag information; hence the extended header is - optional. - - Extended header size 4 * %0xxxxxxx - Number of flag bytes $01 - Extended Flags $xx - - Where the 'Extended header size' is the size of the whole extended - header, stored as a 32 bit synchsafe integer. An extended header can - thus never have a size of fewer than six bytes. - - The extended flags field, with its size described by 'number of flag - bytes', is defined as: - - %0bcd0000 - - Each flag that is set in the extended header has data attached, which - comes in the order in which the flags are encountered (i.e. the data - for flag 'b' comes before the data for flag 'c'). Unset flags cannot - have any attached data. All unknown flags MUST be unset and their - corresponding data removed when a tag is modified. - - Every set flag's data starts with a length byte, which contains a - value between 0 and 127 ($00 - $7f), followed by data that has the - field length indicated by the length byte. If a flag has no attached - data, the value $00 is used as length byte. - - - b - Tag is an update - - If this flag is set, the present tag is an update of a tag found - earlier in the present file or stream. If frames defined as unique - are found in the present tag, they are to override any - corresponding ones found in the earlier tag. This flag has no - corresponding data. - - Flag data length $00 - - c - CRC data present - - If this flag is set, a CRC-32 [ISO-3309] data is included in the - extended header. The CRC is calculated on all the data between the - header and footer as indicated by the header's tag length field, - minus the extended header. Note that this includes the padding (if - there is any), but excludes the footer. The CRC-32 is stored as an - 35 bit synchsafe integer, leaving the upper four bits always - zeroed. - - Flag data length $05 - Total frame CRC 5 * %0xxxxxxx - - d - Tag restrictions - - For some applications it might be desired to restrict a tag in more - ways than imposed by the ID3v2 specification. Note that the - presence of these restrictions does not affect how the tag is - decoded, merely how it was restricted before encoding. If this flag - is set the tag is restricted as follows: - - Flag data length $01 - Restrictions %ppqrrstt - - p - Tag size restrictions - - 00 No more than 128 frames and 1 MB total tag size. - 01 No more than 64 frames and 128 KB total tag size. - 10 No more than 32 frames and 40 KB total tag size. - 11 No more than 32 frames and 4 KB total tag size. - - q - Text encoding restrictions - - 0 No restrictions - 1 Strings are only encoded with ISO-8859-1 [ISO-8859-1] or - UTF-8 [UTF-8]. - - r - Text fields size restrictions - - 00 No restrictions - 01 No string is longer than 1024 characters. - 10 No string is longer than 128 characters. - 11 No string is longer than 30 characters. - - Note that nothing is said about how many bytes is used to - represent those characters, since it is encoding dependent. If a - text frame consists of more than one string, the sum of the - strungs is restricted as stated. - - s - Image encoding restrictions - - 0 No restrictions - 1 Images are encoded only with PNG [PNG] or JPEG [JFIF]. - - t - Image size restrictions - - 00 No restrictions - 01 All images are 256x256 pixels or smaller. - 10 All images are 64x64 pixels or smaller. - 11 All images are exactly 64x64 pixels, unless required - otherwise. - - -3.3. Padding - - It is OPTIONAL to include padding after the final frame (at the end - of the ID3 tag), making the size of all the frames together smaller - than the size given in the tag header. A possible purpose of this - padding is to allow for adding a few additional frames or enlarge - existing frames within the tag without having to rewrite the entire - file. The value of the padding bytes must be $00. A tag MUST NOT have - any padding between the frames or between the tag header and the - frames. Furthermore it MUST NOT have any padding when a tag footer is - added to the tag. - - -3.4. ID3v2 footer - - To speed up the process of locating an ID3v2 tag when searching from - the end of a file, a footer can be added to the tag. It is REQUIRED - to add a footer to an appended tag, i.e. a tag located after all - audio data. The footer is a copy of the header, but with a different - identifier. - - ID3v2 identifier "3DI" - ID3v2 version $04 00 - ID3v2 flags %abcd0000 - ID3v2 size 4 * %0xxxxxxx - - -4. ID3v2 frame overview - - All ID3v2 frames consists of one frame header followed by one or more - fields containing the actual information. The header is always 10 - bytes and laid out as follows: - - Frame ID $xx xx xx xx (four characters) - Size 4 * %0xxxxxxx - Flags $xx xx - - The frame ID is made out of the characters capital A-Z and 0-9. - Identifiers beginning with "X", "Y" and "Z" are for experimental - frames and free for everyone to use, without the need to set the - experimental bit in the tag header. Bear in mind that someone else - might have used the same identifier as you. All other identifiers are - either used or reserved for future use. - - The frame ID is followed by a size descriptor containing the size of - the data in the final frame, after encryption, compression and - unsynchronisation. The size is excluding the frame header ('total - frame size' - 10 bytes) and stored as a 32 bit synchsafe integer. - - In the frame header the size descriptor is followed by two flag - bytes. These flags are described in section 4.1. - - There is no fixed order of the frames' appearance in the tag, - although it is desired that the frames are arranged in order of - significance concerning the recognition of the file. An example of - such order: UFID, TIT2, MCDI, TRCK ... - - A tag MUST contain at least one frame. A frame must be at least 1 - byte big, excluding the header. - - If nothing else is said, strings, including numeric strings and URLs - [URL], are represented as ISO-8859-1 [ISO-8859-1] characters in the - range $20 - $FF. Such strings are represented in frame descriptions - as <text string>, or <full text string> if newlines are allowed. If - nothing else is said newline character is forbidden. In ISO-8859-1 a - newline is represented, when allowed, with $0A only. - - Frames that allow different types of text encoding contains a text - encoding description byte. Possible encodings: - - $00 ISO-8859-1 [ISO-8859-1]. Terminated with $00. - $01 UTF-16 [UTF-16] encoded Unicode [UNICODE] with BOM. All - strings in the same frame SHALL have the same byteorder. - Terminated with $00 00. - $02 UTF-16BE [UTF-16] encoded Unicode [UNICODE] without BOM. - Terminated with $00 00. - $03 UTF-8 [UTF-8] encoded Unicode [UNICODE]. Terminated with $00. - - Strings dependent on encoding are represented in frame descriptions - as <text string according to encoding>, or <full text string - according to encoding> if newlines are allowed. Any empty strings of - type $01 which are NULL-terminated may have the Unicode BOM followed - by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00). - - The timestamp fields are based on a subset of ISO 8601. When being as - precise as possible the format of a time string is - yyyy-MM-ddTHH:mm:ss (year, "-", month, "-", day, "T", hour (out of - 24), ":", minutes, ":", seconds), but the precision may be reduced by - removing as many time indicators as wanted. Hence valid timestamps - are - yyyy, yyyy-MM, yyyy-MM-dd, yyyy-MM-ddTHH, yyyy-MM-ddTHH:mm and - yyyy-MM-ddTHH:mm:ss. All time stamps are UTC. For durations, use - the slash character as described in 8601, and for multiple non- - contiguous dates, use multiple strings, if allowed by the frame - definition. - - The three byte language field, present in several frames, is used to - describe the language of the frame's content, according to ISO-639-2 - [ISO-639-2]. The language should be represented in lower case. If the - language is not known the string "XXX" should be used. - - All URLs [URL] MAY be relative, e.g. "picture.png", "../doc.txt". - - If a frame is longer than it should be, e.g. having more fields than - specified in this document, that indicates that additions to the - frame have been made in a later version of the ID3v2 standard. This - is reflected by the revision number in the header of the tag. - - -4.1. Frame header flags - - In the frame header the size descriptor is followed by two flag - bytes. All unused flags MUST be cleared. The first byte is for - 'status messages' and the second byte is a format description. If an - unknown flag is set in the first byte the frame MUST NOT be changed - without that bit cleared. If an unknown flag is set in the second - byte the frame is likely to not be readable. Some flags in the second - byte indicates that extra information is added to the header. These - fields of extra information is ordered as the flags that indicates - them. The flags field is defined as follows (l and o left out because - ther resemblence to one and zero): - - %0abc0000 %0h00kmnp - - Some frame format flags indicate that additional information fields - are added to the frame. This information is added after the frame - header and before the frame data in the same order as the flags that - indicates them. I.e. the four bytes of decompressed size will precede - the encryption method byte. These additions affects the 'frame size' - field, but are not subject to encryption or compression. - - The default status flags setting for a frame is, unless stated - otherwise, 'preserved if tag is altered' and 'preserved if file is - altered', i.e. %00000000. - - -4.1.1. Frame status flags - - a - Tag alter preservation - - This flag tells the tag parser what to do with this frame if it is - unknown and the tag is altered in any way. This applies to all - kinds of alterations, including adding more padding and reordering - the frames. - - 0 Frame should be preserved. - 1 Frame should be discarded. - - - b - File alter preservation - - This flag tells the tag parser what to do with this frame if it is - unknown and the file, excluding the tag, is altered. This does not - apply when the audio is completely replaced with other audio data. - - 0 Frame should be preserved. - 1 Frame should be discarded. - - - c - Read only - - This flag, if set, tells the software that the contents of this - frame are intended to be read only. Changing the contents might - break something, e.g. a signature. If the contents are changed, - without knowledge of why the frame was flagged read only and - without taking the proper means to compensate, e.g. recalculating - the signature, the bit MUST be cleared. - - -4.1.2. Frame format flags - - h - Grouping identity - - This flag indicates whether or not this frame belongs in a group - with other frames. If set, a group identifier byte is added to the - frame. Every frame with the same group identifier belongs to the - same group. - - 0 Frame does not contain group information - 1 Frame contains group information - - - k - Compression - - This flag indicates whether or not the frame is compressed. - A 'Data Length Indicator' byte MUST be included in the frame. - - 0 Frame is not compressed. - 1 Frame is compressed using zlib [zlib] deflate method. - If set, this requires the 'Data Length Indicator' bit - to be set as well. - - - m - Encryption - - This flag indicates whether or not the frame is encrypted. If set, - one byte indicating with which method it was encrypted will be - added to the frame. See description of the ENCR frame for more - information about encryption method registration. Encryption - should be done after compression. Whether or not setting this flag - requires the presence of a 'Data Length Indicator' depends on the - specific algorithm used. - - 0 Frame is not encrypted. - 1 Frame is encrypted. - - n - Unsynchronisation - - This flag indicates whether or not unsynchronisation was applied - to this frame. See section 6 for details on unsynchronisation. - If this flag is set all data from the end of this header to the - end of this frame has been unsynchronised. Although desirable, the - presence of a 'Data Length Indicator' is not made mandatory by - unsynchronisation. - - 0 Frame has not been unsynchronised. - 1 Frame has been unsyrchronised. - - p - Data length indicator - - This flag indicates that a data length indicator has been added to - the frame. The data length indicator is the value one would write - as the 'Frame length' if all of the frame format flags were - zeroed, represented as a 32 bit synchsafe integer. - - 0 There is no Data Length Indicator. - 1 A data length Indicator has been added to the frame. - - -5. Tag location - - The default location of an ID3v2 tag is prepended to the audio so - that players can benefit from the information when the data is - streamed. It is however possible to append the tag, or make a - prepend/append combination. When deciding upon where an unembedded - tag should be located, the following order of preference SHOULD be - considered. - - 1. Prepend the tag. - - 2. Prepend a tag with all vital information and add a second tag at - the end of the file, before tags from other tagging systems. The - first tag is required to have a SEEK frame. - - 3. Add a tag at the end of the file, before tags from other tagging - systems. - - In case 2 and 3 the tag can simply be appended if no other known tags - are present. The suggested method to find ID3v2 tags are: - - 1. Look for a prepended tag using the pattern found in section 3.1. - - 2. If a SEEK frame was found, use its values to guide further - searching. - - 3. Look for a tag footer, scanning from the back of the file. - - For every new tag that is found, the old tag should be discarded - unless the update flag in the extended header (section 3.2) is set. - - -6. Unsynchronisation - - The only purpose of unsynchronisation is to make the ID3v2 tag as - compatible as possible with existing software and hardware. There is - no use in 'unsynchronising' tags if the file is only to be processed - only by ID3v2 aware software and hardware. Unsynchronisation is only - useful with tags in MPEG 1/2 layer I, II and III, MPEG 2.5 and AAC - files. - - -6.1. The unsynchronisation scheme - - Whenever a false synchronisation is found within the tag, one zeroed - byte is inserted after the first false synchronisation byte. The - format of synchronisations that should be altered by ID3 encoders is - as follows: - - %11111111 111xxxxx - - and should be replaced with: - - %11111111 00000000 111xxxxx - - This has the side effect that all $FF 00 combinations have to be - altered, so they will not be affected by the decoding process. - Therefore all the $FF 00 combinations have to be replaced with the - $FF 00 00 combination during the unsynchronisation. - - To indicate usage of the unsynchronisation, the unsynchronisation - flag in the frame header should be set. This bit MUST be set if the - frame was altered by the unsynchronisation and SHOULD NOT be set if - unaltered. If all frames in the tag are unsynchronised the - unsynchronisation flag in the tag header SHOULD be set. It MUST NOT - be set if the tag has a frame which is not unsynchronised. - - Assume the first byte of the audio to be $FF. The special case when - the last byte of the last frame is $FF and no padding nor footer is - used will then introduce a false synchronisation. This can be solved - by adding a footer, adding padding or unsynchronising the frame and - add $00 to the end of the frame data, thus adding more byte to the - frame size than a normal unsynchronisation would. Although not - preferred, it is allowed to apply the last method on all frames - ending with $FF. - - It is preferred that the tag is either completely unsynchronised or - not unsynchronised at all. A completely unsynchronised tag has no - false synchonisations in it, as defined above, and does not end with - $FF. A completely non-unsynchronised tag contains no unsynchronised - frames, and thus the unsynchronisation flag in the header is cleared. - - Do bear in mind, that if compression or encryption is used, the - unsynchronisation scheme MUST be applied afterwards. When decoding an - unsynchronised frame, the unsynchronisation scheme MUST be reversed - first, encryption and decompression afterwards. - - -6.2. Synchsafe integers - - In some parts of the tag it is inconvenient to use the - unsychronisation scheme because the size of unsynchronised data is - not known in advance, which is particularly problematic with size - descriptors. The solution in ID3v2 is to use synchsafe integers, in - which there can never be any false synchs. Synchsafe integers are - integers that keep its highest bit (bit 7) zeroed, making seven bits - out of eight available. Thus a 32 bit synchsafe integer can store 28 - bits of information. - - Example: - - 255 (%11111111) encoded as a 16 bit synchsafe integer is 383 - (%00000001 01111111). - - -7. Copyright - - Copyright (C) Martin Nilsson 2000. All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that a reference to this document is included on all - such copies and derivative works. However, this document itself may - not be modified in any way and reissued as the original document. - - The limited permissions granted above are perpetual and will not be - revoked. - - This document and the information contained herein is provided on an - 'AS IS' basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF - THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED - WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - -8. References - - [ID3v2] Martin Nilsson, 'ID3v2 informal standard'. - - <url:http://www.id3.org/id3v2.3.0.txt> - - [ISO-639-2] ISO/FDIS 639-2. - 'Codes for the representation of names of languages, Part 2: Alpha-3 - code.' Technical committee / subcommittee: TC 37 / SC 2 - - [ISO-3309] ISO 3309 - 'Information Processing Systems--Data Communication High-Level Data - Link Control Procedure--Frame Structure', IS 3309, October 1984, 3rd - Edition. - - [ISO-8859-1] ISO/IEC DIS 8859-1. - '8-bit single-byte coded graphic character sets, Part 1: Latin - alphabet No. 1.' Technical committee / subcommittee: JTC 1 / SC 2 - - [JFIF] 'JPEG File Interchange Format, version 1.02' - - <url:http://www.w3.org/Graphics/JPEG/jfif.txt> - - [KEYWORDS] S. Bradner, 'Key words for use in RFCs to Indicate - Requirement Levels', RFC 2119, March 1997. - - <url:ftp://ftp.isi.edu/in-notes/rfc2119.txt> - - [MPEG] ISO/IEC 11172-3:1993. - 'Coding of moving pictures and associated audio for digital storage - media at up to about 1,5 Mbit/s, Part 3: Audio.' - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC 13818-3:1995 - 'Generic coding of moving pictures and associated audio information, - Part 3: Audio.' - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC DIS 13818-3 - 'Generic coding of moving pictures and associated audio information, - Part 3: Audio (Revision of ISO/IEC 13818-3:1995)' - - [PNG] 'Portable Network Graphics, version 1.0' - - <url:http://www.w3.org/TR/REC-png-multi.html> - - [UNICODE] The Unicode Consortium, - 'The Unicode Standard Version 3.0', ISBN 0-201-61633-5. - - <url:http://www.unicode.org/unicode/standard/versions/Unicode3.0.htm> - - [URL] T. Berners-Lee, L. Masinter & M. McCahill, 'Uniform Resource - Locators (URL)', RFC 1738, December 1994. - - <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> - - [UTF-8] F. Yergeau, 'UTF-8, a transformation format of ISO 10646', - RFC 2279, January 1998. - - <url:ftp://ftp.isi.edu/in-notes/rfc2279.txt> - - [UTF-16] F. Yergeau, 'UTF-16, an encoding of ISO 10646', RFC 2781, - February 2000. - - <url:ftp://ftp.isi.edu/in-notes/rfc2781.txt> - - [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, 'ZLIB - Compressed Data Format Specification version 3.3', RFC 1950, - May 1996. - - <url:ftp://ftp.isi.edu/in-notes/rfc1950.txt> - - -9. Author's Address - - Written by - - Martin Nilsson - Rydsvägen 246 C. 30 - SE-584 34 Linköping - Sweden - - Email: nilsson@id3.org - diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2extendedheader.cpp b/src/taglib/taglib/mpeg/id3v2/id3v2extendedheader.cpp deleted file mode 100644 index ddcfd45..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2extendedheader.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "id3v2extendedheader.h" -#include "id3v2synchdata.h" - -using namespace TagLib; -using namespace ID3v2; - -class ExtendedHeader::ExtendedHeaderPrivate -{ -public: - ExtendedHeaderPrivate() : size(0) {} - - uint size; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -ExtendedHeader::ExtendedHeader() -{ - d = new ExtendedHeaderPrivate(); -} - -ExtendedHeader::~ExtendedHeader() -{ - delete d; -} - -TagLib::uint ExtendedHeader::size() const -{ - return d->size; -} - -void ExtendedHeader::setData(const ByteVector &data) -{ - parse(data); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void ExtendedHeader::parse(const ByteVector &data) -{ - d->size = SynchData::toUInt(data.mid(0, 4)); // (structure 3.2 "Extended header size") -} diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2extendedheader.h b/src/taglib/taglib/mpeg/id3v2/id3v2extendedheader.h deleted file mode 100644 index d7227e9..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2extendedheader.h +++ /dev/null @@ -1,93 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2EXTENDEDHEADER_H -#define TAGLIB_ID3V2EXTENDEDHEADER_H - -#include "taglib_export.h" -#include "tbytevector.h" -#include "taglib.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 extended header implementation - - /*! - * This class implements ID3v2 extended headers. It attempts to follow, - * both semantically and programatically, the structure specified in - * the ID3v2 standard. The API is based on the properties of ID3v2 extended - * headers specified there. If any of the terms used in this documentation - * are unclear please check the specification in the linked section. - * (Structure, <a href="id3v2-structure.html#3.2">3.2</a>) - */ - - class TAGLIB_EXPORT ExtendedHeader - { - public: - /*! - * Constructs an empty ID3v2 extended header. - */ - ExtendedHeader(); - - /*! - * Destroys the extended header. - */ - virtual ~ExtendedHeader(); - - /*! - * Returns the size of the extended header. This is variable for the - * extended header. - */ - uint size() const; - - /*! - * Sets the data that will be used as the extended header. Since the - * length is not known before the extended header has been parsed, this - * should just be a pointer to the first byte of the extended header. It - * will determine the length internally and make that available through - * size(). - */ - void setData(const ByteVector &data); - - protected: - /*! - * Called by setData() to parse the extended header data. It makes this - * information available through the public API. - */ - void parse(const ByteVector &data); - - private: - ExtendedHeader(const ExtendedHeader &); - ExtendedHeader &operator=(const ExtendedHeader &); - - class ExtendedHeaderPrivate; - ExtendedHeaderPrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2footer.cpp b/src/taglib/taglib/mpeg/id3v2/id3v2footer.cpp deleted file mode 100644 index defbb17..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2footer.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "id3v2footer.h" -#include "id3v2header.h" - -using namespace TagLib; -using namespace ID3v2; - -class Footer::FooterPrivate -{ -public: - static const uint size = 10; -}; - -Footer::Footer() -{ - -} - -Footer::~Footer() -{ - -} - -TagLib::uint Footer::size() -{ - return FooterPrivate::size; -} - -ByteVector Footer::render(const Header *header) const -{ - ByteVector headerData = header->render(); - headerData[0] = '3'; - headerData[1] = 'D'; - headerData[2] = 'I'; - return headerData; -} diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2footer.h b/src/taglib/taglib/mpeg/id3v2/id3v2footer.h deleted file mode 100644 index 1374a14..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2footer.h +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FOOTER_H -#define TAGLIB_ID3V2FOOTER_H - -#include "taglib_export.h" -#include "tbytevector.h" - -namespace TagLib { - - namespace ID3v2 { - - class Header; - - //! ID3v2 footer implementation - - /*! - * Per the ID3v2 specification, the tag's footer is just a copy of the - * information in the header. As such there is no API for reading the - * data from the header, it can just as easily be done from the header. - * - * In fact, at this point, TagLib does not even parse the footer since - * it is not useful internally. However, if the flag to include a footer - * has been set in the ID3v2::Tag, TagLib will render a footer. - */ - - class TAGLIB_EXPORT Footer - { - public: - /*! - * Constructs an empty ID3v2 footer. - */ - Footer(); - /*! - * Destroys the footer. - */ - virtual ~Footer(); - - /*! - * Returns the size of the footer. Presently this is always 10 bytes. - */ - static uint size(); - - /*! - * Renders the footer based on the data in \a header. - */ - ByteVector render(const Header *header) const; - - private: - Footer(const Footer &); - Footer &operator=(const Footer &); - - class FooterPrivate; - FooterPrivate *d; - }; - - } -} -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2frame.cpp b/src/taglib/taglib/mpeg/id3v2/id3v2frame.cpp deleted file mode 100644 index 3cafcff..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2frame.cpp +++ /dev/null @@ -1,844 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#if HAVE_ZLIB -#include <zlib.h> -#endif - -#include <bitset> - -#include <tdebug.h> -#include <tstringlist.h> - -#include "id3v2tag.h" -#include "id3v2frame.h" -#include "id3v2synchdata.h" -#include "tpropertymap.h" -#include "frames/textidentificationframe.h" -#include "frames/urllinkframe.h" -#include "frames/unsynchronizedlyricsframe.h" -#include "frames/commentsframe.h" -#include "frames/uniquefileidentifierframe.h" -#include "frames/unknownframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class Frame::FramePrivate -{ -public: - FramePrivate() : - header(0) - {} - - ~FramePrivate() - { - delete header; - } - - Frame::Header *header; -}; - -namespace -{ - bool isValidFrameID(const ByteVector &frameID) - { - if(frameID.size() != 4) - return false; - - for(ByteVector::ConstIterator it = frameID.begin(); it != frameID.end(); it++) { - if( (*it < 'A' || *it > 'Z') && (*it < '0' || *it > '9') ) { - return false; - } - } - return true; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// static methods -//////////////////////////////////////////////////////////////////////////////// - -TagLib::uint Frame::headerSize() -{ - return Header::size(); -} - -TagLib::uint Frame::headerSize(uint version) -{ - return Header::size(version); -} - -ByteVector Frame::textDelimiter(String::Type t) -{ - ByteVector d = char(0); - if(t == String::UTF16 || t == String::UTF16BE || t == String::UTF16LE) - d.append(char(0)); - return d; -} - -const String Frame::instrumentPrefix("PERFORMER:"); -const String Frame::commentPrefix("COMMENT:"); -const String Frame::lyricsPrefix("LYRICS:"); -const String Frame::urlPrefix("URL:"); - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Frame *Frame::createTextualFrame(const String &key, const StringList &values) //static -{ - // check if the key is contained in the key<=>frameID mapping - ByteVector frameID = keyToFrameID(key); - if(!frameID.isNull()) { - if(frameID[0] == 'T'){ // text frame - TextIdentificationFrame *frame = new TextIdentificationFrame(frameID, String::UTF8); - frame->setText(values); - return frame; - } else if((frameID[0] == 'W') && (values.size() == 1)){ // URL frame (not WXXX); support only one value - UrlLinkFrame* frame = new UrlLinkFrame(frameID); - frame->setUrl(values.front()); - return frame; - } - } - if(key == "MUSICBRAINZ_TRACKID" && values.size() == 1) { - UniqueFileIdentifierFrame *frame = new UniqueFileIdentifierFrame("http://musicbrainz.org", values.front().data(String::UTF8)); - return frame; - } - // now we check if it's one of the "special" cases: - // -LYRICS: depending on the number of values, use USLT or TXXX (with description=LYRICS) - if((key == "LYRICS" || key.startsWith(lyricsPrefix)) && values.size() == 1){ - UnsynchronizedLyricsFrame *frame = new UnsynchronizedLyricsFrame(String::UTF8); - frame->setDescription(key == "LYRICS" ? key : key.substr(lyricsPrefix.size())); - frame->setText(values.front()); - return frame; - } - // -URL: depending on the number of values, use WXXX or TXXX (with description=URL) - if((key == "URL" || key.startsWith(urlPrefix)) && values.size() == 1){ - UserUrlLinkFrame *frame = new UserUrlLinkFrame(String::UTF8); - frame->setDescription(key == "URL" ? key : key.substr(urlPrefix.size())); - frame->setUrl(values.front()); - return frame; - } - // -COMMENT: depending on the number of values, use COMM or TXXX (with description=COMMENT) - if((key == "COMMENT" || key.startsWith(commentPrefix)) && values.size() == 1){ - CommentsFrame *frame = new CommentsFrame(String::UTF8); - if (key != "COMMENT"){ - frame->setDescription(key.substr(commentPrefix.size())); - } - frame->setText(values.front()); - return frame; - } - // if non of the above cases apply, we use a TXXX frame with the key as description - return new UserTextIdentificationFrame(keyToTXXX(key), values, String::UTF8); -} - -Frame::~Frame() -{ - delete d; -} - -ByteVector Frame::frameID() const -{ - if(d->header) - return d->header->frameID(); - else - return ByteVector::null; -} - -TagLib::uint Frame::size() const -{ - if(d->header) - return d->header->frameSize(); - else - return 0; -} - -void Frame::setData(const ByteVector &data) -{ - parse(data); -} - -void Frame::setText(const String &) -{ - -} - -ByteVector Frame::render() const -{ - ByteVector fieldData = renderFields(); - d->header->setFrameSize(fieldData.size()); - ByteVector headerData = d->header->render(); - - return headerData + fieldData; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -Frame::Frame(const ByteVector &data) -{ - d = new FramePrivate; - d->header = new Header(data); -} - -Frame::Frame(Header *h) -{ - d = new FramePrivate; - d->header = h; -} - -Frame::Header *Frame::header() const -{ - return d->header; -} - -void Frame::setHeader(Header *h, bool deleteCurrent) -{ - if(deleteCurrent) - delete d->header; - - d->header = h; -} - -void Frame::parse(const ByteVector &data) -{ - if(d->header) - d->header->setData(data); - else - d->header = new Header(data); - - parseFields(fieldData(data)); -} - -ByteVector Frame::fieldData(const ByteVector &frameData) const -{ - uint headerSize = Header::size(d->header->version()); - - uint frameDataOffset = headerSize; - uint frameDataLength = size(); - - if(d->header->compression() || d->header->dataLengthIndicator()) { - frameDataLength = SynchData::toUInt(frameData.mid(headerSize, 4)); - frameDataOffset += 4; - } - -#if HAVE_ZLIB - if(d->header->compression() && - !d->header->encryption()) - { - ByteVector data(frameDataLength); - uLongf uLongTmp = frameDataLength; - ::uncompress((Bytef *) data.data(), - (uLongf *) &uLongTmp, - (Bytef *) frameData.data() + frameDataOffset, - size()); - return data; - } - else -#endif - return frameData.mid(frameDataOffset, frameDataLength); -} - -String Frame::readStringField(const ByteVector &data, String::Type encoding, int *position) -{ - int start = 0; - - if(!position) - position = &start; - - ByteVector delimiter = textDelimiter(encoding); - - int end = data.find(delimiter, *position, delimiter.size()); - - if(end < *position) - return String::null; - - String str; - if(encoding == String::Latin1) - str = Tag::latin1StringHandler()->parse(data.mid(*position, end - *position)); - else - str = String(data.mid(*position, end - *position), encoding); - - *position = end + delimiter.size(); - - return str; -} - -String::Type Frame::checkEncoding(const StringList &fields, String::Type encoding) // static -{ - return checkEncoding(fields, encoding, 4); -} - -String::Type Frame::checkEncoding(const StringList &fields, String::Type encoding, uint version) // static -{ - if((encoding == String::UTF8 || encoding == String::UTF16BE) && version != 4) - return String::UTF16; - - if(encoding != String::Latin1) - return encoding; - - for(StringList::ConstIterator it = fields.begin(); it != fields.end(); ++it) { - if(!(*it).isLatin1()) { - if(version == 4) { - debug("Frame::checkEncoding() -- Rendering using UTF8."); - return String::UTF8; - } - else { - debug("Frame::checkEncoding() -- Rendering using UTF16."); - return String::UTF16; - } - } - } - - return String::Latin1; -} - -String::Type Frame::checkTextEncoding(const StringList &fields, String::Type encoding) const -{ - return checkEncoding(fields, encoding, header()->version()); -} - -static const TagLib::uint frameTranslationSize = 51; -static const char *frameTranslation[][2] = { - // Text information frames - { "TALB", "ALBUM"}, - { "TBPM", "BPM" }, - { "TCOM", "COMPOSER" }, - { "TCON", "GENRE" }, - { "TCOP", "COPYRIGHT" }, - { "TDEN", "ENCODINGTIME" }, - { "TDLY", "PLAYLISTDELAY" }, - { "TDOR", "ORIGINALDATE" }, - { "TDRC", "DATE" }, - // { "TRDA", "DATE" }, // id3 v2.3, replaced by TDRC in v2.4 - // { "TDAT", "DATE" }, // id3 v2.3, replaced by TDRC in v2.4 - // { "TYER", "DATE" }, // id3 v2.3, replaced by TDRC in v2.4 - // { "TIME", "DATE" }, // id3 v2.3, replaced by TDRC in v2.4 - { "TDRL", "RELEASEDATE" }, - { "TDTG", "TAGGINGDATE" }, - { "TENC", "ENCODEDBY" }, - { "TEXT", "LYRICIST" }, - { "TFLT", "FILETYPE" }, - //{ "TIPL", "INVOLVEDPEOPLE" }, handled separately - { "TIT1", "CONTENTGROUP" }, - { "TIT2", "TITLE"}, - { "TIT3", "SUBTITLE" }, - { "TKEY", "INITIALKEY" }, - { "TLAN", "LANGUAGE" }, - { "TLEN", "LENGTH" }, - //{ "TMCL", "MUSICIANCREDITS" }, handled separately - { "TMED", "MEDIA" }, - { "TMOO", "MOOD" }, - { "TOAL", "ORIGINALALBUM" }, - { "TOFN", "ORIGINALFILENAME" }, - { "TOLY", "ORIGINALLYRICIST" }, - { "TOPE", "ORIGINALARTIST" }, - { "TOWN", "OWNER" }, - { "TPE1", "ARTIST"}, - { "TPE2", "ALBUMARTIST" }, // id3's spec says 'PERFORMER', but most programs use 'ALBUMARTIST' - { "TPE3", "CONDUCTOR" }, - { "TPE4", "REMIXER" }, // could also be ARRANGER - { "TPOS", "DISCNUMBER" }, - { "TPRO", "PRODUCEDNOTICE" }, - { "TPUB", "LABEL" }, - { "TRCK", "TRACKNUMBER" }, - { "TRSN", "RADIOSTATION" }, - { "TRSO", "RADIOSTATIONOWNER" }, - { "TSOA", "ALBUMSORT" }, - { "TSOP", "ARTISTSORT" }, - { "TSOT", "TITLESORT" }, - { "TSO2", "ALBUMARTISTSORT" }, // non-standard, used by iTunes - { "TSRC", "ISRC" }, - { "TSSE", "ENCODING" }, - // URL frames - { "WCOP", "COPYRIGHTURL" }, - { "WOAF", "FILEWEBPAGE" }, - { "WOAR", "ARTISTWEBPAGE" }, - { "WOAS", "AUDIOSOURCEWEBPAGE" }, - { "WORS", "RADIOSTATIONWEBPAGE" }, - { "WPAY", "PAYMENTWEBPAGE" }, - { "WPUB", "PUBLISHERWEBPAGE" }, - //{ "WXXX", "URL"}, handled specially - // Other frames - { "COMM", "COMMENT" }, - //{ "USLT", "LYRICS" }, handled specially -}; - -static const TagLib::uint txxxFrameTranslationSize = 8; -static const char *txxxFrameTranslation[][2] = { - { "MusicBrainz Album Id", "MUSICBRAINZ_ALBUMID" }, - { "MusicBrainz Artist Id", "MUSICBRAINZ_ARTISTID" }, - { "MusicBrainz Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID" }, - { "MusicBrainz Release Group Id", "MUSICBRAINZ_RELEASEGROUPID" }, - { "MusicBrainz Work Id", "MUSICBRAINZ_WORKID" }, - { "Acoustid Id", "ACOUSTID_ID" }, - { "Acoustid Fingerprint", "ACOUSTID_FINGERPRINT" }, - { "MusicIP PUID", "MUSICIP_PUID" }, -}; - -Map<ByteVector, String> &idMap() -{ - static Map<ByteVector, String> m; - if(m.isEmpty()) - for(size_t i = 0; i < frameTranslationSize; ++i) - m[frameTranslation[i][0]] = frameTranslation[i][1]; - return m; -} - -Map<String, String> &txxxMap() -{ - static Map<String, String> m; - if(m.isEmpty()) { - for(size_t i = 0; i < txxxFrameTranslationSize; ++i) { - String key = String(txxxFrameTranslation[i][0]).upper(); - m[key] = txxxFrameTranslation[i][1]; - } - } - return m; -} - -// list of deprecated frames and their successors -static const TagLib::uint deprecatedFramesSize = 4; -static const char *deprecatedFrames[][2] = { - {"TRDA", "TDRC"}, // 2.3 -> 2.4 (http://en.wikipedia.org/wiki/ID3) - {"TDAT", "TDRC"}, // 2.3 -> 2.4 - {"TYER", "TDRC"}, // 2.3 -> 2.4 - {"TIME", "TDRC"}, // 2.3 -> 2.4 -}; - -Map<ByteVector,ByteVector> &deprecationMap() -{ - static Map<ByteVector,ByteVector> depMap; - if(depMap.isEmpty()) - for(TagLib::uint i = 0; i < deprecatedFramesSize; ++i) - depMap[deprecatedFrames[i][0]] = deprecatedFrames[i][1]; - return depMap; -} - -String Frame::frameIDToKey(const ByteVector &id) -{ - Map<ByteVector, String> &m = idMap(); - if(m.contains(id)) - return m[id]; - if(deprecationMap().contains(id)) - return m[deprecationMap()[id]]; - return String::null; -} - -ByteVector Frame::keyToFrameID(const String &s) -{ - static Map<String, ByteVector> m; - if(m.isEmpty()) - for(size_t i = 0; i < frameTranslationSize; ++i) - m[frameTranslation[i][1]] = frameTranslation[i][0]; - if(m.contains(s.upper())) - return m[s]; - return ByteVector::null; -} - -String Frame::txxxToKey(const String &description) -{ - Map<String, String> &m = txxxMap(); - String d = description.upper(); - if(m.contains(d)) - return m[d]; - return d; -} - -String Frame::keyToTXXX(const String &s) -{ - static Map<String, String> m; - if(m.isEmpty()) - for(size_t i = 0; i < txxxFrameTranslationSize; ++i) - m[txxxFrameTranslation[i][1]] = txxxFrameTranslation[i][0]; - if(m.contains(s.upper())) - return m[s]; - return s; -} - -PropertyMap Frame::asProperties() const -{ - if(dynamic_cast< const UnknownFrame *>(this)) { - PropertyMap m; - m.unsupportedData().append("UNKNOWN/" + frameID()); - return m; - } - const ByteVector &id = frameID(); - // workaround until this function is virtual - if(id == "TXXX") - return dynamic_cast< const UserTextIdentificationFrame* >(this)->asProperties(); - else if(id[0] == 'T') - return dynamic_cast< const TextIdentificationFrame* >(this)->asProperties(); - else if(id == "WXXX") - return dynamic_cast< const UserUrlLinkFrame* >(this)->asProperties(); - else if(id[0] == 'W') - return dynamic_cast< const UrlLinkFrame* >(this)->asProperties(); - else if(id == "COMM") - return dynamic_cast< const CommentsFrame* >(this)->asProperties(); - else if(id == "USLT") - return dynamic_cast< const UnsynchronizedLyricsFrame* >(this)->asProperties(); - else if(id == "UFID") - return dynamic_cast< const UniqueFileIdentifierFrame* >(this)->asProperties(); - PropertyMap m; - m.unsupportedData().append(id); - return m; -} - -void Frame::splitProperties(const PropertyMap &original, PropertyMap &singleFrameProperties, - PropertyMap &tiplProperties, PropertyMap &tmclProperties) -{ - - singleFrameProperties.clear(); - tiplProperties.clear(); - tmclProperties.clear(); - for(PropertyMap::ConstIterator it = original.begin(); it != original.end(); ++it) { - if(TextIdentificationFrame::involvedPeopleMap().contains(it->first)) - tiplProperties.insert(it->first, it->second); - else if(it->first.startsWith(TextIdentificationFrame::instrumentPrefix)) - tmclProperties.insert(it->first, it->second); - else - singleFrameProperties.insert(it->first, it->second); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// Frame::Header class -//////////////////////////////////////////////////////////////////////////////// - -class Frame::Header::HeaderPrivate -{ -public: - HeaderPrivate() : - frameSize(0), - version(4), - tagAlterPreservation(false), - fileAlterPreservation(false), - readOnly(false), - groupingIdentity(false), - compression(false), - encryption(false), - unsynchronisation(false), - dataLengthIndicator(false) - {} - - ByteVector frameID; - uint frameSize; - uint version; - - // flags - - bool tagAlterPreservation; - bool fileAlterPreservation; - bool readOnly; - bool groupingIdentity; - bool compression; - bool encryption; - bool unsynchronisation; - bool dataLengthIndicator; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members (Frame::Header) -//////////////////////////////////////////////////////////////////////////////// - -TagLib::uint Frame::Header::size() -{ - return size(4); -} - -TagLib::uint Frame::Header::size(uint version) -{ - switch(version) { - case 0: - case 1: - case 2: - return 6; - case 3: - case 4: - default: - return 10; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// public members (Frame::Header) -//////////////////////////////////////////////////////////////////////////////// - -Frame::Header::Header(const ByteVector &data, bool synchSafeInts) -{ - d = new HeaderPrivate; - setData(data, synchSafeInts); -} - -Frame::Header::Header(const ByteVector &data, uint version) -{ - d = new HeaderPrivate; - setData(data, version); -} - -Frame::Header::~Header() -{ - delete d; -} - -void Frame::Header::setData(const ByteVector &data, bool synchSafeInts) -{ - setData(data, uint(synchSafeInts ? 4 : 3)); -} - -void Frame::Header::setData(const ByteVector &data, uint version) -{ - d->version = version; - - switch(version) { - case 0: - case 1: - case 2: - { - // ID3v2.2 - - if(data.size() < 3) { - debug("You must at least specify a frame ID."); - return; - } - - // Set the frame ID -- the first three bytes - - d->frameID = data.mid(0, 3); - - // If the full header information was not passed in, do not continue to the - // steps to parse the frame size and flags. - - if(data.size() < 6) { - d->frameSize = 0; - return; - } - - d->frameSize = data.toUInt(3, 3, true); - - break; - } - case 3: - { - // ID3v2.3 - - if(data.size() < 4) { - debug("You must at least specify a frame ID."); - return; - } - - // Set the frame ID -- the first four bytes - - d->frameID = data.mid(0, 4); - - // If the full header information was not passed in, do not continue to the - // steps to parse the frame size and flags. - - if(data.size() < 10) { - d->frameSize = 0; - return; - } - - // Set the size -- the frame size is the four bytes starting at byte four in - // the frame header (structure 4) - - d->frameSize = data.toUInt(4U); - - { // read the first byte of flags - std::bitset<8> flags(data[8]); - d->tagAlterPreservation = flags[7]; // (structure 3.3.1.a) - d->fileAlterPreservation = flags[6]; // (structure 3.3.1.b) - d->readOnly = flags[5]; // (structure 3.3.1.c) - } - - { // read the second byte of flags - std::bitset<8> flags(data[9]); - d->compression = flags[7]; // (structure 3.3.1.i) - d->encryption = flags[6]; // (structure 3.3.1.j) - d->groupingIdentity = flags[5]; // (structure 3.3.1.k) - } - break; - } - case 4: - default: - { - // ID3v2.4 - - if(data.size() < 4) { - debug("You must at least specify a frame ID."); - return; - } - - // Set the frame ID -- the first four bytes - - d->frameID = data.mid(0, 4); - - // If the full header information was not passed in, do not continue to the - // steps to parse the frame size and flags. - - if(data.size() < 10) { - d->frameSize = 0; - return; - } - - // Set the size -- the frame size is the four bytes starting at byte four in - // the frame header (structure 4) - - d->frameSize = SynchData::toUInt(data.mid(4, 4)); -#ifndef NO_ITUNES_HACKS - // iTunes writes v2.4 tags with v2.3-like frame sizes - if(d->frameSize > 127) { - if(!isValidFrameID(data.mid(d->frameSize + 10, 4))) { - unsigned int uintSize = data.toUInt(4U); - if(isValidFrameID(data.mid(uintSize + 10, 4))) { - d->frameSize = uintSize; - } - } - } -#endif - - { // read the first byte of flags - std::bitset<8> flags(data[8]); - d->tagAlterPreservation = flags[6]; // (structure 4.1.1.a) - d->fileAlterPreservation = flags[5]; // (structure 4.1.1.b) - d->readOnly = flags[4]; // (structure 4.1.1.c) - } - - { // read the second byte of flags - std::bitset<8> flags(data[9]); - d->groupingIdentity = flags[6]; // (structure 4.1.2.h) - d->compression = flags[3]; // (structure 4.1.2.k) - d->encryption = flags[2]; // (structure 4.1.2.m) - d->unsynchronisation = flags[1]; // (structure 4.1.2.n) - d->dataLengthIndicator = flags[0]; // (structure 4.1.2.p) - } - break; - } - } -} - -ByteVector Frame::Header::frameID() const -{ - return d->frameID; -} - -void Frame::Header::setFrameID(const ByteVector &id) -{ - d->frameID = id.mid(0, 4); -} - -TagLib::uint Frame::Header::frameSize() const -{ - return d->frameSize; -} - -void Frame::Header::setFrameSize(uint size) -{ - d->frameSize = size; -} - -TagLib::uint Frame::Header::version() const -{ - return d->version; -} - -void Frame::Header::setVersion(TagLib::uint version) -{ - d->version = version; -} - -bool Frame::Header::tagAlterPreservation() const -{ - return d->tagAlterPreservation; -} - -void Frame::Header::setTagAlterPreservation(bool preserve) -{ - d->tagAlterPreservation = preserve; -} - -bool Frame::Header::fileAlterPreservation() const -{ - return d->fileAlterPreservation; -} - -bool Frame::Header::readOnly() const -{ - return d->readOnly; -} - -bool Frame::Header::groupingIdentity() const -{ - return d->groupingIdentity; -} - -bool Frame::Header::compression() const -{ - return d->compression; -} - -bool Frame::Header::encryption() const -{ - return d->encryption; -} - -bool Frame::Header::unsycronisation() const -{ - return unsynchronisation(); -} - -bool Frame::Header::unsynchronisation() const -{ - return d->unsynchronisation; -} - -bool Frame::Header::dataLengthIndicator() const -{ - return d->dataLengthIndicator; -} - -ByteVector Frame::Header::render() const -{ - ByteVector flags(2, char(0)); // just blank for the moment - - ByteVector v = d->frameID + - (d->version == 3 - ? ByteVector::fromUInt(d->frameSize) - : SynchData::fromUInt(d->frameSize)) + - flags; - - return v; -} - -bool Frame::Header::frameAlterPreservation() const -{ - return fileAlterPreservation(); -} diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2frame.h b/src/taglib/taglib/mpeg/id3v2/id3v2frame.h deleted file mode 100644 index 3e257d4..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2frame.h +++ /dev/null @@ -1,518 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FRAME_H -#define TAGLIB_ID3V2FRAME_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - class StringList; - class PropertyMap; - - namespace ID3v2 { - - class Tag; - class FrameFactory; - - //! ID3v2 frame implementation - - /*! - * This class is the main ID3v2 frame implementation. In ID3v2, a tag is - * split between a collection of frames (which are in turn split into fields - * (Structure, <a href="id3v2-structure.html#4">4</a>) - * (<a href="id3v2-frames.html">Frames</a>). This class provides an API for - * gathering information about and modifying ID3v2 frames. Funtionallity - * specific to a given frame type is handed in one of the many subclasses. - */ - - class TAGLIB_EXPORT Frame - { - friend class Tag; - friend class FrameFactory; - - public: - - /*! - * Creates a textual frame which corresponds to a single key in the PropertyMap - * interface. These are all (User)TextIdentificationFrames except TIPL and TMCL, - * all (User)URLLinkFrames, CommentsFrames, and UnsynchronizedLyricsFrame. - */ - static Frame *createTextualFrame(const String &key, const StringList &values); - - /*! - * Destroys this Frame instance. - */ - virtual ~Frame(); - - /*! - * Returns the Frame ID (Structure, <a href="id3v2-structure.html#4">4</a>) - * (Frames, <a href="id3v2-frames.html#4">4</a>) - */ - ByteVector frameID() const; - - /*! - * Returns the size of the frame. - */ - uint size() const; - - /*! - * Returns the size of the frame header - * - * \deprecated This is only accurate for ID3v2.3 or ID3v2.4. Please use - * the call below which accepts an ID3v2 version number. In the next - * non-binary compatible release this will be made into a non-static - * member that checks the internal ID3v2 version. - */ - static uint headerSize(); // BIC: remove and make non-static - - /*! - * Returns the size of the frame header for the given ID3v2 version. - * - * \deprecated Please see the explanation above. - */ - static uint headerSize(uint version); // BIC: remove and make non-static - - /*! - * Sets the data that will be used as the frame. Since the length is not - * known before the frame has been parsed, this should just be a pointer to - * the first byte of the frame. It will determine the length internally - * and make that available through size(). - */ - void setData(const ByteVector &data); - - /*! - * Set the text of frame in the sanest way possible. This should only be - * reimplemented in frames where there is some logical mapping to text. - * - * \note If the frame type supports multiple text encodings, this will not - * change the text encoding of the frame; the string will be converted to - * that frame's encoding. Please use the specific APIs of the frame types - * to set the encoding if that is desired. - */ - virtual void setText(const String &text); - - /*! - * This returns the textual representation of the data in the frame. - * Subclasses must reimplement this method to provide a string - * representation of the frame's data. - */ - virtual String toString() const = 0; - - /*! - * Render the frame back to its binary format in a ByteVector. - */ - ByteVector render() const; - - /*! - * Returns the text delimiter that is used between fields for the string - * type \a t. - */ - static ByteVector textDelimiter(String::Type t); - - /*! - * The string with which an instrument name is prefixed to build a key in a PropertyMap; - * used to translate PropertyMaps to TMCL frames. In the current implementation, this - * is "PERFORMER:". - */ - static const String instrumentPrefix; - /*! - * The PropertyMap key prefix which triggers the use of a COMM frame instead of a TXXX - * frame for a non-standard key. In the current implementation, this is "COMMENT:". - */ - static const String commentPrefix; - /*! - * The PropertyMap key prefix which triggers the use of a USLT frame instead of a TXXX - * frame for a non-standard key. In the current implementation, this is "LYRICS:". - */ - static const String lyricsPrefix; - /*! - * The PropertyMap key prefix which triggers the use of a WXXX frame instead of a TXX - * frame for a non-standard key. In the current implementation, this is "URL:". - */ - static const String urlPrefix; - - protected: - class Header; - - /*! - * Constructs an ID3v2 frame using \a data to read the header information. - * All other processing of \a data should be handled in a subclass. - * - * \note This need not contain anything more than a frame ID, but - * \e must constain at least that. - */ - explicit Frame(const ByteVector &data); - - /*! - * This creates an Frame using the header \a h. - * - * The ownership of this header will be assigned to the frame and the - * header will be deleted when the frame is destroyed. - */ - Frame(Header *h); - - /*! - * Returns a pointer to the frame header. - */ - Header *header() const; - - /*! - * Sets the header to \a h. If \a deleteCurrent is true, this will free - * the memory of the current header. - * - * The ownership of this header will be assigned to the frame and the - * header will be deleted when the frame is destroyed. - */ - void setHeader(Header *h, bool deleteCurrent = true); - - /*! - * Called by setData() to parse the frame data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - /*! - * Called by parse() to parse the field data. It makes this information - * available through the public API. This must be overridden by the - * subclasses. - */ - virtual void parseFields(const ByteVector &data) = 0; - - /*! - * Render the field data back to a binary format in a ByteVector. This - * must be overridden by subclasses. - */ - virtual ByteVector renderFields() const = 0; - - /*! - * Returns a ByteVector containing the field data given the frame data. - * This correctly adjusts for the header size plus any additional frame - * data that's specified in the frame header flags. - */ - ByteVector fieldData(const ByteVector &frameData) const; - - /*! - * Reads a String of type \a encodiong from the ByteVector \a data. If \a - * position is passed in it is used both as the starting point and is - * updated to replect the position just after the string that has been read. - * This is useful for reading strings sequentially. - */ - String readStringField(const ByteVector &data, String::Type encoding, - int *positon = 0); - - /*! - * Checks a the list of string values to see if they can be used with the - * specified encoding and returns the recommended encoding. - */ - // BIC: remove and make non-static - static String::Type checkEncoding(const StringList &fields, - String::Type encoding); - - /*! - * Checks a the list of string values to see if they can be used with the - * specified encoding and returns the recommended encoding. This method - * also checks the ID3v2 version and makes sure the encoding can be used - * in the specified version. - */ - // BIC: remove and make non-static - static String::Type checkEncoding(const StringList &fields, - String::Type encoding, uint version); - - /*! - * Checks a the list of string values to see if they can be used with the - * specified encoding and returns the recommended encoding. This method - * also checks the ID3v2 version and makes sure the encoding can be used - * in the version specified by the frame's header. - */ - String::Type checkTextEncoding(const StringList &fields, - String::Type encoding) const; - - - /*! - * Parses the contents of this frame as PropertyMap. If that fails, the returend - * PropertyMap will be empty, and its unsupportedData() will contain this frame's - * ID. - * BIC: Will be a virtual function in future releases. - */ - PropertyMap asProperties() const; - - /*! - * Returns an appropriate ID3 frame ID for the given free-form tag key. This method - * will return ByteVector::null if no specialized translation is found. - */ - static ByteVector keyToFrameID(const String &); - - /*! - * Returns a free-form tag name for the given ID3 frame ID. Note that this does not work - * for general frame IDs such as TXXX or WXXX; in such a case String::null is returned. - */ - static String frameIDToKey(const ByteVector &); - - /*! - * Returns an appropriate TXXX frame description for the given free-form tag key. - */ - static String keyToTXXX(const String &); - - /*! - * Returns a free-form tag name for the given ID3 frame description. - */ - static String txxxToKey(const String &); - - /*! - * This helper function splits the PropertyMap \a original into three ProperytMaps - * \a singleFrameProperties, \a tiplProperties, and \a tmclProperties, such that: - * - \a singleFrameProperties contains only of keys which can be represented with - * exactly one ID3 frame per key. In the current implementation - * this is everything except for the fixed "involved people" keys and keys of the - * form "TextIdentificationFrame::instrumentPrefix" + "instrument", which are - * mapped to a TMCL frame. - * - \a tiplProperties will consist of those keys that are present in - * TextIdentificationFrame::involvedPeopleMap() - * - \a tmclProperties contains the "musician credits" keys which should be mapped - * to a TMCL frame - */ - static void splitProperties(const PropertyMap &original, PropertyMap &singleFrameProperties, - PropertyMap &tiplProperties, PropertyMap &tmclProperties); - - private: - Frame(const Frame &); - Frame &operator=(const Frame &); - - class FramePrivate; - friend class FramePrivate; - FramePrivate *d; - }; - - //! ID3v2 frame header implementation - - /*! - * The ID3v2 Frame Header (Structure, <a href="id3v2-structure.html#4">4</a>) - * - * Every ID3v2::Frame has an associated header that gives some general - * properties of the frame and also makes it possible to identify the frame - * type. - * - * As such when reading an ID3v2 tag ID3v2::FrameFactory first creates the - * frame headers and then creates the appropriate Frame subclass based on - * the type and attaches the header. - */ - - class TAGLIB_EXPORT Frame::Header - { - public: - /*! - * Construct a Frame Header based on \a data. \a data must at least - * contain a 4 byte frame ID, and optionally can contain flag data and the - * frame size. i.e. Just the frame id -- "TALB" -- is a valid value. - * - * \deprecated Please use the constructor below that accepts a version - * number. - */ - Header(const ByteVector &data, bool synchSafeInts); - - /*! - * Construct a Frame Header based on \a data. \a data must at least - * contain a 4 byte frame ID, and optionally can contain flag data and the - * frame size. i.e. Just the frame id -- "TALB" -- is a valid value. - * - * \a version should be the ID3v2 version of the tag. - */ - explicit Header(const ByteVector &data, uint version = 4); - - /*! - * Destroys this Header instance. - */ - virtual ~Header(); - - /*! - * Sets the data for the Header. - * - * \deprecated Please use the version below that accepts an ID3v2 version - * number. - */ - void setData(const ByteVector &data, bool synchSafeInts); - - /*! - * Sets the data for the Header. \a version should indicate the ID3v2 - * version number of the tag that this frame is contained in. - */ - void setData(const ByteVector &data, uint version = 4); - - /*! - * Returns the Frame ID (Structure, <a href="id3v2-structure.html#4">4</a>) - * (Frames, <a href="id3v2-frames.html#4">4</a>) - */ - ByteVector frameID() const; - - /*! - * Sets the frame's ID to \a id. Only the first four bytes of \a id will - * be used. - * - * \warning This method should in general be avoided. It exists simply to - * provide a mechanism for transforming frames from a deprecated frame type - * to a newer one -- i.e. TYER to TDRC from ID3v2.3 to ID3v2.4. - */ - void setFrameID(const ByteVector &id); - - /*! - * Returns the size of the frame data portion, as set when setData() was - * called or set explicitly via setFrameSize(). - */ - uint frameSize() const; - - /*! - * Sets the size of the frame data portion. - */ - void setFrameSize(uint size); - - /*! - * Returns the ID3v2 version of the header, as passed in from the - * construction of the header or set via setVersion(). - */ - uint version() const; - - /*! - * Sets the ID3v2 version of the header, changing has impact on the - * correct parsing/rendering of frame data. - */ - void setVersion(uint version); - - /*! - * Returns the size of the frame header in bytes. - * - * \deprecated Please use the version of this method that accepts a - * version. This is only accurate for ID3v2.3 and ID3v2.4. This will be - * removed in the next binary incompatible release (2.0) and will be - * replaced with a non-static method that checks the frame version. - */ - static uint size(); - - /*! - * Returns the size of the frame header in bytes for the ID3v2 version - * that's given. - * - * \deprecated Please see the explanation in the version above. - */ - static uint size(uint version); - - /*! - * Returns true if the flag for tag alter preservation is set. - * - * The semantics are a little backwards from what would seem natural - * (setting the preservation flag to throw away the frame), but this - * follows the ID3v2 standard. - * - * \see setTagAlterPreservation() - */ - bool tagAlterPreservation() const; - - /*! - * Sets the flag for preservation of this frame if the tag is set. If - * this is set to true the frame will not be written when the tag is - * saved. - * - * The semantics are a little backwards from what would seem natural - * (setting the preservation flag to throw away the frame), but this - * follows the ID3v2 standard. - * - * \see tagAlterPreservation() - */ - void setTagAlterPreservation(bool discard); - - /*! - * Returns true if the flag for file alter preservation is set. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool fileAlterPreservation() const; - - /*! - * Returns true if the frame is meant to be read only. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool readOnly() const; - - /*! - * Returns true if the flag for the grouping identifity is set. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool groupingIdentity() const; - - /*! - * Returns true if compression is enabled for this frame. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool compression() const; - - /*! - * Returns true if encryption is enabled for this frame. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool encryption() const; - -#ifndef DO_NOT_DOCUMENT - bool unsycronisation() const; -#endif - - /*! - * Returns true if unsynchronisation is enabled for this frame. - */ - bool unsynchronisation() const; - - /*! - * Returns true if the flag for a data length indicator is set. - */ - bool dataLengthIndicator() const; - - /*! - * Render the Header back to binary format in a ByteVector. - */ - ByteVector render() const; - - /*! - * \deprecated - */ - bool frameAlterPreservation() const; - - private: - Header(const Header &); - Header &operator=(const Header &); - - class HeaderPrivate; - HeaderPrivate *d; - }; - - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2framefactory.cpp b/src/taglib/taglib/mpeg/id3v2/id3v2framefactory.cpp deleted file mode 100644 index 3371ca7..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2framefactory.cpp +++ /dev/null @@ -1,458 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <tdebug.h> - -#include "id3v2framefactory.h" -#include "id3v2synchdata.h" -#include "id3v1genres.h" - -#include "frames/attachedpictureframe.h" -#include "frames/commentsframe.h" -#include "frames/relativevolumeframe.h" -#include "frames/textidentificationframe.h" -#include "frames/uniquefileidentifierframe.h" -#include "frames/unknownframe.h" -#include "frames/generalencapsulatedobjectframe.h" -#include "frames/urllinkframe.h" -#include "frames/unsynchronizedlyricsframe.h" -#include "frames/popularimeterframe.h" -#include "frames/privateframe.h" -#include "frames/ownershipframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class FrameFactory::FrameFactoryPrivate -{ -public: - FrameFactoryPrivate() : - defaultEncoding(String::Latin1), - useDefaultEncoding(false) {} - - String::Type defaultEncoding; - bool useDefaultEncoding; - - template <class T> void setTextEncoding(T *frame) - { - if(useDefaultEncoding) - frame->setTextEncoding(defaultEncoding); - } -}; - -FrameFactory FrameFactory::factory; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FrameFactory *FrameFactory::instance() -{ - return &factory; -} - -Frame *FrameFactory::createFrame(const ByteVector &data, bool synchSafeInts) const -{ - return createFrame(data, uint(synchSafeInts ? 4 : 3)); -} - -Frame *FrameFactory::createFrame(const ByteVector &data, uint version) const -{ - Header tagHeader; - tagHeader.setMajorVersion(version); - return createFrame(data, &tagHeader); -} - -Frame *FrameFactory::createFrame(const ByteVector &origData, Header *tagHeader) const -{ - ByteVector data = origData; - uint version = tagHeader->majorVersion(); - Frame::Header *header = new Frame::Header(data, version); - ByteVector frameID = header->frameID(); - - // A quick sanity check -- make sure that the frameID is 4 uppercase Latin1 - // characters. Also make sure that there is data in the frame. - - if(frameID.size() != (version < 3 ? 3 : 4) || - header->frameSize() <= uint(header->dataLengthIndicator() ? 4 : 0) || - header->frameSize() > data.size()) - { - delete header; - return 0; - } - -#ifndef NO_ITUNES_HACKS - if(version == 3 && frameID.size() == 4 && frameID[3] == '\0') { - // iTunes v2.3 tags store v2.2 frames - convert now - frameID = frameID.mid(0, 3); - header->setFrameID(frameID); - header->setVersion(2); - updateFrame(header); - header->setVersion(3); - } -#endif - - for(ByteVector::ConstIterator it = frameID.begin(); it != frameID.end(); it++) { - if( (*it < 'A' || *it > 'Z') && (*it < '0' || *it > '9') ) { - delete header; - return 0; - } - } - - if(version > 3 && (tagHeader->unsynchronisation() || header->unsynchronisation())) { - // Data lengths are not part of the encoded data, but since they are synch-safe - // integers they will be never actually encoded. - ByteVector frameData = data.mid(Frame::Header::size(version), header->frameSize()); - frameData = SynchData::decode(frameData); - data = data.mid(0, Frame::Header::size(version)) + frameData; - } - - // TagLib doesn't mess with encrypted frames, so just treat them - // as unknown frames. - -#if !defined(HAVE_ZLIB) || HAVE_ZLIB == 0 - if(header->compression()) { - debug("Compressed frames are currently not supported."); - return new UnknownFrame(data, header); - } -#endif - if(header->encryption()) { - debug("Encrypted frames are currently not supported."); - return new UnknownFrame(data, header); - } - - if(!updateFrame(header)) { - header->setTagAlterPreservation(true); - return new UnknownFrame(data, header); - } - - // updateFrame() might have updated the frame ID. - - frameID = header->frameID(); - - // This is where things get necissarily nasty. Here we determine which - // Frame subclass (or if none is found simply an Frame) based - // on the frame ID. Since there are a lot of possibilities, that means - // a lot of if blocks. - - // Text Identification (frames 4.2) - - if(frameID.startsWith("T")) { - - TextIdentificationFrame *f = frameID != "TXXX" - ? new TextIdentificationFrame(data, header) - : new UserTextIdentificationFrame(data, header); - - d->setTextEncoding(f); - - if(frameID == "TCON") - updateGenre(f); - - return f; - } - - // Comments (frames 4.10) - - if(frameID == "COMM") { - CommentsFrame *f = new CommentsFrame(data, header); - d->setTextEncoding(f); - return f; - } - - // Attached Picture (frames 4.14) - - if(frameID == "APIC") { - AttachedPictureFrame *f = new AttachedPictureFrame(data, header); - d->setTextEncoding(f); - return f; - } - - // ID3v2.2 Attached Picture - - if(frameID == "PIC") { - AttachedPictureFrame *f = new AttachedPictureFrameV22(data, header); - d->setTextEncoding(f); - return f; - } - - // Relative Volume Adjustment (frames 4.11) - - if(frameID == "RVA2") - return new RelativeVolumeFrame(data, header); - - // Unique File Identifier (frames 4.1) - - if(frameID == "UFID") - return new UniqueFileIdentifierFrame(data, header); - - // General Encapsulated Object (frames 4.15) - - if(frameID == "GEOB") { - GeneralEncapsulatedObjectFrame *f = new GeneralEncapsulatedObjectFrame(data, header); - d->setTextEncoding(f); - return f; - } - - // URL link (frames 4.3) - - if(frameID.startsWith("W")) { - if(frameID != "WXXX") { - return new UrlLinkFrame(data, header); - } - else { - UserUrlLinkFrame *f = new UserUrlLinkFrame(data, header); - d->setTextEncoding(f); - return f; - } - } - - // Unsynchronized lyric/text transcription (frames 4.8) - - if(frameID == "USLT") { - UnsynchronizedLyricsFrame *f = new UnsynchronizedLyricsFrame(data, header); - if(d->useDefaultEncoding) - f->setTextEncoding(d->defaultEncoding); - return f; - } - - // Popularimeter (frames 4.17) - - if(frameID == "POPM") - return new PopularimeterFrame(data, header); - - // Private (frames 4.27) - - if(frameID == "PRIV") - return new PrivateFrame(data, header); - - // Ownership (frames 4.22) - - if(frameID == "OWNE") { - OwnershipFrame *f = new OwnershipFrame(data, header); - d->setTextEncoding(f); - return f; - } - - return new UnknownFrame(data, header); -} - -String::Type FrameFactory::defaultTextEncoding() const -{ - return d->defaultEncoding; -} - -void FrameFactory::setDefaultTextEncoding(String::Type encoding) -{ - d->useDefaultEncoding = true; - d->defaultEncoding = encoding; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -FrameFactory::FrameFactory() -{ - d = new FrameFactoryPrivate; -} - -FrameFactory::~FrameFactory() -{ - delete d; -} - -bool FrameFactory::updateFrame(Frame::Header *header) const -{ - TagLib::ByteVector frameID = header->frameID(); - - switch(header->version()) { - - case 2: // ID3v2.2 - { - if(frameID == "CRM" || - frameID == "EQU" || - frameID == "LNK" || - frameID == "RVA" || - frameID == "TIM" || - frameID == "TSI" || - frameID == "TDA") - { - debug("ID3v2.4 no longer supports the frame type " + String(frameID) + - ". It will be discarded from the tag."); - return false; - } - - // ID3v2.2 only used 3 bytes for the frame ID, so we need to convert all of - // the frames to their 4 byte ID3v2.4 equivalent. - - convertFrame("BUF", "RBUF", header); - convertFrame("CNT", "PCNT", header); - convertFrame("COM", "COMM", header); - convertFrame("CRA", "AENC", header); - convertFrame("ETC", "ETCO", header); - convertFrame("GEO", "GEOB", header); - convertFrame("IPL", "TIPL", header); - convertFrame("MCI", "MCDI", header); - convertFrame("MLL", "MLLT", header); - convertFrame("POP", "POPM", header); - convertFrame("REV", "RVRB", header); - convertFrame("SLT", "SYLT", header); - convertFrame("STC", "SYTC", header); - convertFrame("TAL", "TALB", header); - convertFrame("TBP", "TBPM", header); - convertFrame("TCM", "TCOM", header); - convertFrame("TCO", "TCON", header); - convertFrame("TCP", "TCMP", header); - convertFrame("TCR", "TCOP", header); - convertFrame("TDY", "TDLY", header); - convertFrame("TEN", "TENC", header); - convertFrame("TFT", "TFLT", header); - convertFrame("TKE", "TKEY", header); - convertFrame("TLA", "TLAN", header); - convertFrame("TLE", "TLEN", header); - convertFrame("TMT", "TMED", header); - convertFrame("TOA", "TOAL", header); - convertFrame("TOF", "TOFN", header); - convertFrame("TOL", "TOLY", header); - convertFrame("TOR", "TDOR", header); - convertFrame("TOT", "TOAL", header); - convertFrame("TP1", "TPE1", header); - convertFrame("TP2", "TPE2", header); - convertFrame("TP3", "TPE3", header); - convertFrame("TP4", "TPE4", header); - convertFrame("TPA", "TPOS", header); - convertFrame("TPB", "TPUB", header); - convertFrame("TRC", "TSRC", header); - convertFrame("TRD", "TDRC", header); - convertFrame("TRK", "TRCK", header); - convertFrame("TS2", "TSO2", header); - convertFrame("TSA", "TSOA", header); - convertFrame("TSC", "TSOC", header); - convertFrame("TSP", "TSOP", header); - convertFrame("TSS", "TSSE", header); - convertFrame("TST", "TSOT", header); - convertFrame("TT1", "TIT1", header); - convertFrame("TT2", "TIT2", header); - convertFrame("TT3", "TIT3", header); - convertFrame("TXT", "TOLY", header); - convertFrame("TXX", "TXXX", header); - convertFrame("TYE", "TDRC", header); - convertFrame("UFI", "UFID", header); - convertFrame("ULT", "USLT", header); - convertFrame("WAF", "WOAF", header); - convertFrame("WAR", "WOAR", header); - convertFrame("WAS", "WOAS", header); - convertFrame("WCM", "WCOM", header); - convertFrame("WCP", "WCOP", header); - convertFrame("WPB", "WPUB", header); - convertFrame("WXX", "WXXX", header); - - break; - } - - case 3: // ID3v2.3 - { - if(frameID == "EQUA" || - frameID == "RVAD" || - frameID == "TIME" || - frameID == "TRDA" || - frameID == "TSIZ" || - frameID == "TDAT") - { - debug("ID3v2.4 no longer supports the frame type " + String(frameID) + - ". It will be discarded from the tag."); - return false; - } - - convertFrame("TORY", "TDOR", header); - convertFrame("TYER", "TDRC", header); - convertFrame("IPLS", "TIPL", header); - - break; - } - - default: - - // This should catch a typo that existed in TagLib up to and including - // version 1.1 where TRDC was used for the year rather than TDRC. - - convertFrame("TRDC", "TDRC", header); - break; - } - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void FrameFactory::convertFrame(const char *from, const char *to, - Frame::Header *header) const -{ - if(header->frameID() != from) - return; - - // debug("ID3v2.4 no longer supports the frame type " + String(from) + " It has" + - // "been converted to the type " + String(to) + "."); - - header->setFrameID(to); -} - -void FrameFactory::updateGenre(TextIdentificationFrame *frame) const -{ - StringList fields = frame->fieldList(); - StringList newfields; - - for(StringList::Iterator it = fields.begin(); it != fields.end(); ++it) { - String s = *it; - int end = s.find(")"); - - if(s.startsWith("(") && end > 0) { - // "(12)Genre" - String text = s.substr(end + 1); - bool ok; - int number = s.substr(1, end - 1).toInt(&ok); - if(ok && number >= 0 && number <= 255 && !(ID3v1::genre(number) == text)) - newfields.append(s.substr(1, end - 1)); - if(!text.isEmpty()) - newfields.append(text); - } - else { - // "Genre" or "12" - newfields.append(s); - } - } - - if(newfields.isEmpty()) - fields.append(String::null); - - frame->setText(newfields); - -} diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2framefactory.h b/src/taglib/taglib/mpeg/id3v2/id3v2framefactory.h deleted file mode 100644 index 762d7eb..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2framefactory.h +++ /dev/null @@ -1,166 +0,0 @@ - /*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FRAMEFACTORY_H -#define TAGLIB_ID3V2FRAMEFACTORY_H - -#include "taglib_export.h" -#include "tbytevector.h" -#include "id3v2frame.h" -#include "id3v2header.h" - -namespace TagLib { - - namespace ID3v2 { - - class TextIdentificationFrame; - - //! A factory for creating ID3v2 frames during parsing - - /*! - * This factory abstracts away the frame creation process and instantiates - * the appropriate ID3v2::Frame subclasses based on the contents of the - * data. - * - * Reimplementing this factory is the key to adding support for frame types - * not directly supported by TagLib to your application. To do so you would - * subclass this factory reimplement createFrame(). Then by setting your - * factory to be the default factory in ID3v2::Tag constructor or with - * MPEG::File::setID3v2FrameFactory() you can implement behavior that will - * allow for new ID3v2::Frame subclasses (also provided by you) to be used. - * - * This implements both <i>abstract factory</i> and <i>singleton</i> patterns - * of which more information is available on the web and in software design - * textbooks (Notably <i>Design Patters</i>). - * - * \note You do not need to use this factory to create new frames to add to - * an ID3v2::Tag. You can instantiate frame subclasses directly (with new) - * and add them to a tag using ID3v2::Tag::addFrame() - * - * \see ID3v2::Tag::addFrame() - */ - - class TAGLIB_EXPORT FrameFactory - { - public: - static FrameFactory *instance(); - /*! - * Create a frame based on \a data. \a synchSafeInts should only be set - * false if we are parsing an old tag (v2.3 or older) that does not support - * synchsafe ints. - * - * \deprecated Please use the method below that accepts a ID3v2::Header - * instance in new code. - */ - Frame *createFrame(const ByteVector &data, bool synchSafeInts) const; - - /*! - * Create a frame based on \a data. \a version should indicate the ID3v2 - * version of the tag. As ID3v2.4 is the most current version of the - * standard 4 is the default. - * - * \deprecated Please use the method below that accepts a ID3v2::Header - * instance in new code. - */ - Frame *createFrame(const ByteVector &data, uint version = 4) const; - - /*! - * Create a frame based on \a data. \a tagHeader should be a valid - * ID3v2::Header instance. - */ - // BIC: make virtual - Frame *createFrame(const ByteVector &data, Header *tagHeader) const; - - /*! - * Returns the default text encoding for text frames. If setTextEncoding() - * has not been explicitly called this will only be used for new text - * frames. However, if this value has been set explicitly all frames will be - * converted to this type (unless it's explitly set differently for the - * individual frame) when being rendered. - * - * \see setDefaultTextEncoding() - */ - String::Type defaultTextEncoding() const; - - /*! - * Set the default text encoding for all text frames that are created to - * \a encoding. If no value is set the frames with either default to the - * encoding type that was parsed and new frames default to Latin1. - * - * Valid string types for ID3v2 tags are Latin1, UTF8, UTF16 and UTF16BE. - * - * \see defaultTextEncoding() - */ - void setDefaultTextEncoding(String::Type encoding); - - protected: - /*! - * Constructs a frame factory. Because this is a singleton this method is - * protected, but may be used for subclasses. - */ - FrameFactory(); - - /*! - * Destroys the frame factory. - */ - virtual ~FrameFactory(); - - /*! - * This method checks for compliance to the current ID3v2 standard (2.4) - * and does nothing in the common case. However if a frame is found that - * is not compatible with the current standard, this method either updates - * the frame or indicates that it should be discarded. - * - * This method with return true (with or without changes to the frame) if - * this frame should be kept or false if it should be discarded. - * - * See the id3v2.4.0-changes.txt document for further information. - */ - virtual bool updateFrame(Frame::Header *header) const; - - private: - FrameFactory(const FrameFactory &); - FrameFactory &operator=(const FrameFactory &); - - /*! - * This method is used internally to convert a frame from ID \a from to ID - * \a to. If the frame matches the \a from pattern and converts the frame - * ID in the \a header or simply does nothing if the frame ID does not match. - */ - void convertFrame(const char *from, const char *to, - Frame::Header *header) const; - - void updateGenre(TextIdentificationFrame *frame) const; - - static FrameFactory factory; - - class FrameFactoryPrivate; - FrameFactoryPrivate *d; - }; - - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2header.cpp b/src/taglib/taglib/mpeg/id3v2/id3v2header.cpp deleted file mode 100644 index ad6b3aa..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2header.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <iostream> -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> - -#include "id3v2header.h" -#include "id3v2footer.h" -#include "id3v2synchdata.h" - -using namespace TagLib; -using namespace ID3v2; - -class Header::HeaderPrivate -{ -public: - HeaderPrivate() : majorVersion(4), - revisionNumber(0), - unsynchronisation(false), - extendedHeader(false), - experimentalIndicator(false), - footerPresent(false), - tagSize(0) {} - - ~HeaderPrivate() {} - - uint majorVersion; - uint revisionNumber; - - bool unsynchronisation; - bool extendedHeader; - bool experimentalIndicator; - bool footerPresent; - - uint tagSize; - - static const uint size = 10; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -TagLib::uint Header::size() -{ - return HeaderPrivate::size; -} - -ByteVector Header::fileIdentifier() -{ - return ByteVector::fromCString("ID3"); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Header::Header() -{ - d = new HeaderPrivate; -} - -Header::Header(const ByteVector &data) -{ - d = new HeaderPrivate; - parse(data); -} - -Header::~Header() -{ - delete d; -} - -TagLib::uint Header::majorVersion() const -{ - return d->majorVersion; -} - -void Header::setMajorVersion(TagLib::uint version) -{ - d->majorVersion = version; -} - -TagLib::uint Header::revisionNumber() const -{ - return d->revisionNumber; -} - -bool Header::unsynchronisation() const -{ - return d->unsynchronisation; -} - -bool Header::extendedHeader() const -{ - return d->extendedHeader; -} - -bool Header::experimentalIndicator() const -{ - return d->experimentalIndicator; -} - -bool Header::footerPresent() const -{ - return d->footerPresent; -} - -TagLib::uint Header::tagSize() const -{ - return d->tagSize; -} - -TagLib::uint Header::completeTagSize() const -{ - if(d->footerPresent) - return d->tagSize + d->size + Footer::size(); - else - return d->tagSize + d->size; -} - -void Header::setTagSize(uint s) -{ - d->tagSize = s; -} - -void Header::setData(const ByteVector &data) -{ - parse(data); -} - -ByteVector Header::render() const -{ - ByteVector v; - - // add the file identifier -- "ID3" - v.append(fileIdentifier()); - - // add the version number -- we always render a 2.4.0 tag regardless of what - // the tag originally was. - - v.append(char(majorVersion())); - v.append(char(0)); - - // Currently we don't actually support writing extended headers, footers or - // unsynchronized tags, make sure that the flags are set accordingly. - - d->extendedHeader = false; - d->footerPresent = false; - d->unsynchronisation = false; - - // render and add the flags - std::bitset<8> flags; - - flags[7] = d->unsynchronisation; - flags[6] = d->extendedHeader; - flags[5] = d->experimentalIndicator; - flags[4] = d->footerPresent; - - v.append(char(flags.to_ulong())); - - // add the size - v.append(SynchData::fromUInt(d->tagSize)); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void Header::parse(const ByteVector &data) -{ - if(data.size() < size()) - return; - - - // do some sanity checking -- even in ID3v2.3.0 and less the tag size is a - // synch-safe integer, so all bytes must be less than 128. If this is not - // true then this is an invalid tag. - - // note that we're doing things a little out of order here -- the size is - // later in the bytestream than the version - - ByteVector sizeData = data.mid(6, 4); - - if(sizeData.size() != 4) { - d->tagSize = 0; - debug("TagLib::ID3v2::Header::parse() - The tag size as read was 0 bytes!"); - return; - } - - for(ByteVector::Iterator it = sizeData.begin(); it != sizeData.end(); it++) { - if(uchar(*it) >= 128) { - d->tagSize = 0; - debug("TagLib::ID3v2::Header::parse() - One of the size bytes in the id3v2 header was greater than the allowed 128."); - return; - } - } - - // The first three bytes, data[0..2], are the File Identifier, "ID3". (structure 3.1 "file identifier") - - // Read the version number from the fourth and fifth bytes. - d->majorVersion = data[3]; // (structure 3.1 "major version") - d->revisionNumber = data[4]; // (structure 3.1 "revision number") - - // Read the flags, the first four bits of the sixth byte. - std::bitset<8> flags(data[5]); - - d->unsynchronisation = flags[7]; // (structure 3.1.a) - d->extendedHeader = flags[6]; // (structure 3.1.b) - d->experimentalIndicator = flags[5]; // (structure 3.1.c) - d->footerPresent = flags[4]; // (structure 3.1.d) - - // Get the size from the remaining four bytes (read above) - - d->tagSize = SynchData::toUInt(sizeData); // (structure 3.1 "size") -} diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2header.h b/src/taglib/taglib/mpeg/id3v2/id3v2header.h deleted file mode 100644 index 307ba96..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2header.h +++ /dev/null @@ -1,175 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2HEADER_H -#define TAGLIB_ID3V2HEADER_H - -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 headers - - /*! - * This class implements ID3v2 headers. It attempts to follow, both - * semantically and programatically, the structure specified in - * the ID3v2 standard. The API is based on the properties of ID3v2 headers - * specified there. If any of the terms used in this documentation are - * unclear please check the specification in the linked section. - * (Structure, <a href="id3v2-structure.html#3.1">3.1</a>) - */ - - class TAGLIB_EXPORT Header - { - public: - /*! - * Constructs an empty ID3v2 header. - */ - Header(); - - /*! - * Constructs an ID3v2 header based on \a data. parse() is called - * immediately. - */ - Header(const ByteVector &data); - - /*! - * Destroys the header. - */ - virtual ~Header(); - - /*! - * Returns the major version number. (Note: This is the 4, not the 2 in - * ID3v2.4.0. The 2 is implied.) - */ - uint majorVersion() const; - - /*! - * Set the the major version number to \a version. (Note: This is - * the 4, not the 2 in ID3v2.4.0. The 2 is implied.) - * \see majorVersion() - * - * \note This is used by the internal parser; this will not change the - * version which is written and in general should not be called by API - * users. - */ - void setMajorVersion(uint version); - - /*! - * Returns the revision number. (Note: This is the 0, not the 4 in - * ID3v2.4.0. The 2 is implied.) - */ - uint revisionNumber() const; - - /*! - * Returns true if unsynchronisation has been applied to all frames. - */ - bool unsynchronisation() const; - - /*! - * Returns true if an extended header is present in the tag. - */ - bool extendedHeader() const; - - /*! - * Returns true if the experimental indicator flag is set. - */ - bool experimentalIndicator() const; - - /*! - * Returns true if a footer is present in the tag. - */ - bool footerPresent() const; - /*! - * Returns the tag size in bytes. This is the size of the frame content. - * The size of the \e entire tag will be this plus the header size (10 - * bytes) and, if present, the footer size (potentially another 10 bytes). - * - * \note This is the value as read from the header to which TagLib attempts - * to provide an API to; it was not a design decision on the part of TagLib - * to not include the mentioned portions of the tag in the \e size. - * - * \see completeTagSize() - */ - uint tagSize() const; - - /*! - * Returns the tag size, including the header and, if present, the footer - * size. - * - * \see tagSize() - */ - uint completeTagSize() const; - - /*! - * Set the tag size to \a s. - * \see tagSize() - */ - void setTagSize(uint s); - - /*! - * Returns the size of the header. Presently this is always 10 bytes. - */ - static uint size(); - - /*! - * Returns the string used to identify and ID3v2 tag inside of a file. - * Presently this is always "ID3". - */ - static ByteVector fileIdentifier(); - - /*! - * Sets the data that will be used as the header. 10 bytes, starting from - * the beginning of \a data are used. - */ - void setData(const ByteVector &data); - - /*! - * Renders the Header back to binary format. - */ - ByteVector render() const; - - protected: - /*! - * Called by setData() to parse the header data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - private: - Header(const Header &); - Header &operator=(const Header &); - - class HeaderPrivate; - HeaderPrivate *d; - }; - - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2synchdata.cpp b/src/taglib/taglib/mpeg/id3v2/id3v2synchdata.cpp deleted file mode 100644 index 4acfd91..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2synchdata.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <iostream> - -#include "id3v2synchdata.h" - -using namespace TagLib; -using namespace ID3v2; - -TagLib::uint SynchData::toUInt(const ByteVector &data) -{ - uint sum = 0; - bool notSynchSafe = false; - int last = data.size() > 4 ? 3 : data.size() - 1; - - for(int i = 0; i <= last; i++) { - if(data[i] & 0x80) { - notSynchSafe = true; - break; - } - - sum |= (data[i] & 0x7f) << ((last - i) * 7); - } - - if(notSynchSafe) { - // Invalid data; assume this was created by some buggy software that just - // put normal integers here rather than syncsafe ones, and try it that - // way. - if(data.size() >= 4) { - sum = data.toUInt(0, true); - } - else { - ByteVector tmp(data); - tmp.resize(4); - sum = tmp.toUInt(0, true); - } - } - - return sum; -} - -ByteVector SynchData::fromUInt(uint value) -{ - ByteVector v(4, 0); - - for(int i = 0; i < 4; i++) - v[i] = uchar(value >> ((3 - i) * 7) & 0x7f); - - return v; -} - -ByteVector SynchData::decode(const ByteVector &data) -{ - ByteVector result = data; - - ByteVector pattern(2, char(0)); - pattern[0] = '\xFF'; - pattern[1] = '\x00'; - - return result.replace(pattern, '\xFF'); -} diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2synchdata.h b/src/taglib/taglib/mpeg/id3v2/id3v2synchdata.h deleted file mode 100644 index 4a1f596..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2synchdata.h +++ /dev/null @@ -1,70 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2SYNCHDATA_H -#define TAGLIB_ID3V2SYNCHDATA_H - -#include "tbytevector.h" -#include "taglib.h" - -namespace TagLib { - - namespace ID3v2 { - - //! A few functions for ID3v2 synch safe integer conversion - - /*! - * In the ID3v2.4 standard most integer values are encoded as "synch safe" - * integers which are encoded in such a way that they will not give false - * MPEG syncs and confuse MPEG decoders. This namespace provides some - * methods for converting to and from these values to ByteVectors for - * things rendering and parsing ID3v2 data. - */ - - namespace SynchData - { - /*! - * This returns the unsigned integer value of \a data where \a data is a - * ByteVector that contains a \e synchsafe integer (Structure, - * <a href="id3v2-structure.html#6.2">6.2</a>). The default \a length of - * 4 is used if another value is not specified. - */ - TAGLIB_EXPORT uint toUInt(const ByteVector &data); - - /*! - * Returns a 4 byte (32 bit) synchsafe integer based on \a value. - */ - TAGLIB_EXPORT ByteVector fromUInt(uint value); - - /*! - * Convert the data from unsynchronized data to its original format. - */ - TAGLIB_EXPORT ByteVector decode(const ByteVector &input); - } - - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2tag.cpp b/src/taglib/taglib/mpeg/id3v2/id3v2tag.cpp deleted file mode 100644 index 57637a3..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2tag.cpp +++ /dev/null @@ -1,732 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <tfile.h> - -#include "id3v2tag.h" -#include "id3v2header.h" -#include "id3v2extendedheader.h" -#include "id3v2footer.h" -#include "id3v2synchdata.h" -#include "tbytevector.h" -#include "id3v1genres.h" -#include "tpropertymap.h" -#include <tdebug.h> - -#include "frames/textidentificationframe.h" -#include "frames/commentsframe.h" -#include "frames/urllinkframe.h" -#include "frames/uniquefileidentifierframe.h" -#include "frames/unsynchronizedlyricsframe.h" -#include "frames/unknownframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class ID3v2::Tag::TagPrivate -{ -public: - TagPrivate() : file(0), tagOffset(-1), extendedHeader(0), footer(0), paddingSize(0) - { - frameList.setAutoDelete(true); - } - ~TagPrivate() - { - delete extendedHeader; - delete footer; - } - - File *file; - long tagOffset; - const FrameFactory *factory; - - Header header; - ExtendedHeader *extendedHeader; - Footer *footer; - - int paddingSize; - - FrameListMap frameListMap; - FrameList frameList; - - static const Latin1StringHandler *stringHandler; -}; - -static const Latin1StringHandler defaultStringHandler; -const ID3v2::Latin1StringHandler *ID3v2::Tag::TagPrivate::stringHandler = &defaultStringHandler; - -//////////////////////////////////////////////////////////////////////////////// -// StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -Latin1StringHandler::Latin1StringHandler() -{ -} - -Latin1StringHandler::~Latin1StringHandler() -{ -} - -String Latin1StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::Latin1); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ID3v2::Tag::Tag() : TagLib::Tag() -{ - d = new TagPrivate; - d->factory = FrameFactory::instance(); -} - -ID3v2::Tag::Tag(File *file, long tagOffset, const FrameFactory *factory) : - TagLib::Tag() -{ - d = new TagPrivate; - - d->file = file; - d->tagOffset = tagOffset; - d->factory = factory; - - read(); -} - -ID3v2::Tag::~Tag() -{ - delete d; -} - - -String ID3v2::Tag::title() const -{ - if(!d->frameListMap["TIT2"].isEmpty()) - return d->frameListMap["TIT2"].front()->toString(); - return String::null; -} - -String ID3v2::Tag::artist() const -{ - if(!d->frameListMap["TPE1"].isEmpty()) - return d->frameListMap["TPE1"].front()->toString(); - return String::null; -} - -String ID3v2::Tag::album() const -{ - if(!d->frameListMap["TALB"].isEmpty()) - return d->frameListMap["TALB"].front()->toString(); - return String::null; -} - -String ID3v2::Tag::comment() const -{ - const FrameList &comments = d->frameListMap["COMM"]; - - if(comments.isEmpty()) - return String::null; - - for(FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) - { - CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it); - - if(frame && frame->description().isEmpty()) - return (*it)->toString(); - } - - return comments.front()->toString(); -} - -String ID3v2::Tag::genre() const -{ - // TODO: In the next major version (TagLib 2.0) a list of multiple genres - // should be separated by " / " instead of " ". For the moment to keep - // the behavior the same as released versions it is being left with " ". - - if(d->frameListMap["TCON"].isEmpty() || - !dynamic_cast<TextIdentificationFrame *>(d->frameListMap["TCON"].front())) - { - return String::null; - } - - // ID3v2.4 lists genres as the fields in its frames field list. If the field - // is simply a number it can be assumed that it is an ID3v1 genre number. - // Here was assume that if an ID3v1 string is present that it should be - // appended to the genre string. Multiple fields will be appended as the - // string is built. - - TextIdentificationFrame *f = static_cast<TextIdentificationFrame *>( - d->frameListMap["TCON"].front()); - - StringList fields = f->fieldList(); - - StringList genres; - - for(StringList::Iterator it = fields.begin(); it != fields.end(); ++it) { - - if((*it).isEmpty()) - continue; - - bool ok; - int number = (*it).toInt(&ok); - if(ok && number >= 0 && number <= 255) { - *it = ID3v1::genre(number); - } - - if(std::find(genres.begin(), genres.end(), *it) == genres.end()) - genres.append(*it); - } - - return genres.toString(); -} - -TagLib::uint ID3v2::Tag::year() const -{ - if(!d->frameListMap["TDRC"].isEmpty()) - return d->frameListMap["TDRC"].front()->toString().substr(0, 4).toInt(); - return 0; -} - -TagLib::uint ID3v2::Tag::track() const -{ - if(!d->frameListMap["TRCK"].isEmpty()) - return d->frameListMap["TRCK"].front()->toString().toInt(); - return 0; -} - -void ID3v2::Tag::setTitle(const String &s) -{ - setTextFrame("TIT2", s); -} - -void ID3v2::Tag::setArtist(const String &s) -{ - setTextFrame("TPE1", s); -} - -void ID3v2::Tag::setAlbum(const String &s) -{ - setTextFrame("TALB", s); -} - -void ID3v2::Tag::setComment(const String &s) -{ - if(s.isEmpty()) { - removeFrames("COMM"); - return; - } - - if(!d->frameListMap["COMM"].isEmpty()) - d->frameListMap["COMM"].front()->setText(s); - else { - CommentsFrame *f = new CommentsFrame(d->factory->defaultTextEncoding()); - addFrame(f); - f->setText(s); - } -} - -void ID3v2::Tag::setGenre(const String &s) -{ - if(s.isEmpty()) { - removeFrames("TCON"); - return; - } - - // iTunes can't handle correctly encoded ID3v2.4 numerical genres. Just use - // strings until iTunes sucks less. - -#ifdef NO_ITUNES_HACKS - - int index = ID3v1::genreIndex(s); - - if(index != 255) - setTextFrame("TCON", String::number(index)); - else - setTextFrame("TCON", s); - -#else - - setTextFrame("TCON", s); - -#endif -} - -void ID3v2::Tag::setYear(uint i) -{ - if(i <= 0) { - removeFrames("TDRC"); - return; - } - setTextFrame("TDRC", String::number(i)); -} - -void ID3v2::Tag::setTrack(uint i) -{ - if(i <= 0) { - removeFrames("TRCK"); - return; - } - setTextFrame("TRCK", String::number(i)); -} - -bool ID3v2::Tag::isEmpty() const -{ - return d->frameList.isEmpty(); -} - -Header *ID3v2::Tag::header() const -{ - return &(d->header); -} - -ExtendedHeader *ID3v2::Tag::extendedHeader() const -{ - return d->extendedHeader; -} - -Footer *ID3v2::Tag::footer() const -{ - return d->footer; -} - -const FrameListMap &ID3v2::Tag::frameListMap() const -{ - return d->frameListMap; -} - -const FrameList &ID3v2::Tag::frameList() const -{ - return d->frameList; -} - -const FrameList &ID3v2::Tag::frameList(const ByteVector &frameID) const -{ - return d->frameListMap[frameID]; -} - -void ID3v2::Tag::addFrame(Frame *frame) -{ - d->frameList.append(frame); - d->frameListMap[frame->frameID()].append(frame); -} - -void ID3v2::Tag::removeFrame(Frame *frame, bool del) -{ - // remove the frame from the frame list - FrameList::Iterator it = d->frameList.find(frame); - d->frameList.erase(it); - - // ...and from the frame list map - it = d->frameListMap[frame->frameID()].find(frame); - d->frameListMap[frame->frameID()].erase(it); - - // ...and delete as desired - if(del) - delete frame; -} - -void ID3v2::Tag::removeFrames(const ByteVector &id) -{ - FrameList l = d->frameListMap[id]; - for(FrameList::Iterator it = l.begin(); it != l.end(); ++it) - removeFrame(*it, true); -} - -PropertyMap ID3v2::Tag::properties() const -{ - PropertyMap properties; - for(FrameList::ConstIterator it = frameList().begin(); it != frameList().end(); ++it) { - PropertyMap props = (*it)->asProperties(); - properties.merge(props); - } - return properties; -} - -void ID3v2::Tag::removeUnsupportedProperties(const StringList &properties) -{ - for(StringList::ConstIterator it = properties.begin(); it != properties.end(); ++it){ - if(it->startsWith("UNKNOWN/")) { - String frameID = it->substr(String("UNKNOWN/").size()); - if(frameID.size() != 4) - continue; // invalid specification - ByteVector id = frameID.data(String::Latin1); - // delete all unknown frames of given type - FrameList l = frameList(id); - for(FrameList::ConstIterator fit = l.begin(); fit != l.end(); fit++) - if (dynamic_cast<const UnknownFrame *>(*fit) != 0) - removeFrame(*fit); - } - else if(it->size() == 4){ - ByteVector id = it->data(String::Latin1); - removeFrames(id); - } - else { - ByteVector id = it->substr(0,4).data(String::Latin1); - if(it->size() <= 5) - continue; // invalid specification - String description = it->substr(5); - Frame *frame = 0; - if(id == "TXXX") - frame = UserTextIdentificationFrame::find(this, description); - else if(id == "WXXX") - frame = UserUrlLinkFrame::find(this, description); - else if(id == "COMM") - frame = CommentsFrame::findByDescription(this, description); - else if(id == "USLT") - frame = UnsynchronizedLyricsFrame::findByDescription(this, description); - else if(id == "UFID") - frame = UniqueFileIdentifierFrame::findByOwner(this, description); - if(frame) - removeFrame(frame); - } - } -} - -PropertyMap ID3v2::Tag::setProperties(const PropertyMap &origProps) -{ - FrameList framesToDelete; - // we split up the PropertyMap into the "normal" keys and the "complicated" ones, - // which are those according to TIPL or TMCL frames. - PropertyMap properties; - PropertyMap tiplProperties; - PropertyMap tmclProperties; - Frame::splitProperties(origProps, properties, tiplProperties, tmclProperties); - for(FrameListMap::ConstIterator it = frameListMap().begin(); it != frameListMap().end(); ++it){ - for(FrameList::ConstIterator lit = it->second.begin(); lit != it->second.end(); ++lit){ - PropertyMap frameProperties = (*lit)->asProperties(); - if(it->first == "TIPL") { - if (tiplProperties != frameProperties) - framesToDelete.append(*lit); - else - tiplProperties.erase(frameProperties); - } else if(it->first == "TMCL") { - if (tmclProperties != frameProperties) - framesToDelete.append(*lit); - else - tmclProperties.erase(frameProperties); - } else if(!properties.contains(frameProperties)) - framesToDelete.append(*lit); - else - properties.erase(frameProperties); - } - } - for(FrameList::ConstIterator it = framesToDelete.begin(); it != framesToDelete.end(); ++it) - removeFrame(*it); - - // now create remaining frames: - // start with the involved people list (TIPL) - if(!tiplProperties.isEmpty()) - addFrame(TextIdentificationFrame::createTIPLFrame(tiplProperties)); - // proceed with the musician credit list (TMCL) - if(!tmclProperties.isEmpty()) - addFrame(TextIdentificationFrame::createTMCLFrame(tmclProperties)); - // now create the "one key per frame" frames - for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it) - addFrame(Frame::createTextualFrame(it->first, it->second)); - return PropertyMap(); // ID3 implements the complete PropertyMap interface, so an empty map is returned -} - -ByteVector ID3v2::Tag::render() const -{ - return render(4); -} - -void ID3v2::Tag::downgradeFrames(FrameList *frames, FrameList *newFrames) const -{ - const char *unsupportedFrames[] = { - "ASPI", "EQU2", "RVA2", "SEEK", "SIGN", "TDRL", "TDTG", - "TMOO", "TPRO", "TSOA", "TSOT", "TSST", "TSOP", 0 - }; - ID3v2::TextIdentificationFrame *frameTDOR = 0; - ID3v2::TextIdentificationFrame *frameTDRC = 0; - ID3v2::TextIdentificationFrame *frameTIPL = 0; - ID3v2::TextIdentificationFrame *frameTMCL = 0; - for(FrameList::Iterator it = d->frameList.begin(); it != d->frameList.end(); it++) { - ID3v2::Frame *frame = *it; - ByteVector frameID = frame->header()->frameID(); - for(int i = 0; unsupportedFrames[i]; i++) { - if(frameID == unsupportedFrames[i]) { - debug("A frame that is not supported in ID3v2.3 \'" - + String(frameID) + "\' has been discarded"); - frame = 0; - break; - } - } - if(frame && frameID == "TDOR") { - frameTDOR = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); - frame = 0; - } - if(frame && frameID == "TDRC") { - frameTDRC = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); - frame = 0; - } - if(frame && frameID == "TIPL") { - frameTIPL = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); - frame = 0; - } - if(frame && frameID == "TMCL") { - frameTMCL = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); - frame = 0; - } - if(frame) { - frames->append(frame); - } - } - if(frameTDOR) { - String content = frameTDOR->toString(); - if(content.size() >= 4) { - ID3v2::TextIdentificationFrame *frameTORY = new ID3v2::TextIdentificationFrame("TORY", String::Latin1); - frameTORY->setText(content.substr(0, 4)); - frames->append(frameTORY); - newFrames->append(frameTORY); - } - } - if(frameTDRC) { - String content = frameTDRC->toString(); - if(content.size() >= 4) { - ID3v2::TextIdentificationFrame *frameTYER = new ID3v2::TextIdentificationFrame("TYER", String::Latin1); - frameTYER->setText(content.substr(0, 4)); - frames->append(frameTYER); - newFrames->append(frameTYER); - if(content.size() >= 10 && content[4] == '-' && content[7] == '-') { - ID3v2::TextIdentificationFrame *frameTDAT = new ID3v2::TextIdentificationFrame("TDAT", String::Latin1); - frameTDAT->setText(content.substr(8, 2) + content.substr(5, 2)); - frames->append(frameTDAT); - newFrames->append(frameTDAT); - if(content.size() >= 16 && content[10] == 'T' && content[13] == ':') { - ID3v2::TextIdentificationFrame *frameTIME = new ID3v2::TextIdentificationFrame("TIME", String::Latin1); - frameTIME->setText(content.substr(11, 2) + content.substr(14, 2)); - frames->append(frameTIME); - newFrames->append(frameTIME); - } - } - } - } - if(frameTIPL || frameTMCL) { - ID3v2::TextIdentificationFrame *frameIPLS = new ID3v2::TextIdentificationFrame("IPLS", String::Latin1); - StringList people; - if(frameTMCL) { - StringList v24People = frameTMCL->fieldList(); - for(uint i = 0; i + 1 < v24People.size(); i += 2) { - people.append(v24People[i]); - people.append(v24People[i+1]); - } - } - if(frameTIPL) { - StringList v24People = frameTIPL->fieldList(); - for(uint i = 0; i + 1 < v24People.size(); i += 2) { - people.append(v24People[i]); - people.append(v24People[i+1]); - } - } - frameIPLS->setText(people); - frames->append(frameIPLS); - newFrames->append(frameIPLS); - } -} - - -ByteVector ID3v2::Tag::render(int version) const -{ - // We need to render the "tag data" first so that we have to correct size to - // render in the tag's header. The "tag data" -- everything that is included - // in ID3v2::Header::tagSize() -- includes the extended header, frames and - // padding, but does not include the tag's header or footer. - - ByteVector tagData; - - if(version != 3 && version != 4) { - debug("Unknown ID3v2 version, using ID3v2.4"); - version = 4; - } - - // TODO: Render the extended header. - - // Loop through the frames rendering them and adding them to the tagData. - - FrameList newFrames; - newFrames.setAutoDelete(true); - - FrameList frameList; - if(version == 4) { - frameList = d->frameList; - } - else { - downgradeFrames(&frameList, &newFrames); - } - - for(FrameList::Iterator it = frameList.begin(); it != frameList.end(); it++) { - (*it)->header()->setVersion(version); - if((*it)->header()->frameID().size() != 4) { - debug("A frame of unsupported or unknown type \'" - + String((*it)->header()->frameID()) + "\' has been discarded"); - continue; - } - if(!(*it)->header()->tagAlterPreservation()) - tagData.append((*it)->render()); - } - - // Compute the amount of padding, and append that to tagData. - - uint paddingSize = 0; - uint originalSize = d->header.tagSize(); - - if(tagData.size() < originalSize) - paddingSize = originalSize - tagData.size(); - else - paddingSize = 1024; - - tagData.append(ByteVector(paddingSize, char(0))); - - // Set the version and data size. - d->header.setMajorVersion(version); - d->header.setTagSize(tagData.size()); - - // TODO: This should eventually include d->footer->render(). - return d->header.render() + tagData; -} - -Latin1StringHandler const *ID3v2::Tag::latin1StringHandler() -{ - return TagPrivate::stringHandler; -} - -void ID3v2::Tag::setLatin1StringHandler(const Latin1StringHandler *handler) -{ - if(handler) - TagPrivate::stringHandler = handler; - else - TagPrivate::stringHandler = &defaultStringHandler; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void ID3v2::Tag::read() -{ - if(d->file && d->file->isOpen()) { - - d->file->seek(d->tagOffset); - d->header.setData(d->file->readBlock(Header::size())); - - // if the tag size is 0, then this is an invalid tag (tags must contain at - // least one frame) - - if(d->header.tagSize() == 0) - return; - - parse(d->file->readBlock(d->header.tagSize())); - } -} - -void ID3v2::Tag::parse(const ByteVector &origData) -{ - ByteVector data = origData; - - if(d->header.unsynchronisation() && d->header.majorVersion() <= 3) - data = SynchData::decode(data); - - uint frameDataPosition = 0; - uint frameDataLength = data.size(); - - // check for extended header - - if(d->header.extendedHeader()) { - if(!d->extendedHeader) - d->extendedHeader = new ExtendedHeader; - d->extendedHeader->setData(data); - if(d->extendedHeader->size() <= data.size()) { - frameDataPosition += d->extendedHeader->size(); - frameDataLength -= d->extendedHeader->size(); - } - } - - // check for footer -- we don't actually need to parse it, as it *must* - // contain the same data as the header, but we do need to account for its - // size. - - if(d->header.footerPresent() && Footer::size() <= frameDataLength) - frameDataLength -= Footer::size(); - - // parse frames - - // Make sure that there is at least enough room in the remaining frame data for - // a frame header. - - while(frameDataPosition < frameDataLength - Frame::headerSize(d->header.majorVersion())) { - - // If the next data is position is 0, assume that we've hit the padding - // portion of the frame data. - - if(data.at(frameDataPosition) == 0) { - if(d->header.footerPresent()) { - debug("Padding *and* a footer found. This is not allowed by the spec."); - } - - d->paddingSize = frameDataLength - frameDataPosition; - return; - } - - Frame *frame = d->factory->createFrame(data.mid(frameDataPosition), - &d->header); - - if(!frame) - return; - - // Checks to make sure that frame parsed correctly. - - if(frame->size() <= 0) { - delete frame; - return; - } - - frameDataPosition += frame->size() + Frame::headerSize(d->header.majorVersion()); - addFrame(frame); - } -} - -void ID3v2::Tag::setTextFrame(const ByteVector &id, const String &value) -{ - if(value.isEmpty()) { - removeFrames(id); - return; - } - - if(!d->frameListMap[id].isEmpty()) - d->frameListMap[id].front()->setText(value); - else { - const String::Type encoding = d->factory->defaultTextEncoding(); - TextIdentificationFrame *f = new TextIdentificationFrame(id, encoding); - addFrame(f); - f->setText(value); - } -} diff --git a/src/taglib/taglib/mpeg/id3v2/id3v2tag.h b/src/taglib/taglib/mpeg/id3v2/id3v2tag.h deleted file mode 100644 index 5fd5c1f..0000000 --- a/src/taglib/taglib/mpeg/id3v2/id3v2tag.h +++ /dev/null @@ -1,412 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2TAG_H -#define TAGLIB_ID3V2TAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "tstring.h" -#include "tlist.h" -#include "tmap.h" -#include "taglib_export.h" - -#include "id3v2framefactory.h" - -namespace TagLib { - - class File; - - //! An ID3v2 implementation - - /*! - * This is a relatively complete and flexible framework for working with ID3v2 - * tags. - * - * \see ID3v2::Tag - */ - - namespace ID3v2 { - - class Header; - class ExtendedHeader; - class Footer; - - typedef List<Frame *> FrameList; - typedef Map<ByteVector, FrameList> FrameListMap; - - //! An abstraction for the ISO-8859-1 string to data encoding in ID3v2 tags. - - /*! - * ID3v2 tag can store strings in ISO-8859-1 (Latin1), and TagLib only - * supports genuine ISO-8859-1 by default. However, in practice, non - * ISO-8859-1 encodings are often used instead of ISO-8859-1, such as - * Windows-1252 for western languages, Shift_JIS for Japanese and so on. - * - * Here is an option to read such tags by subclassing this class, - * reimplementing parse() and setting your reimplementation as the default - * with ID3v2::Tag::setStringHandler(). - * - * \note Writing non-ISO-8859-1 tags is not implemented intentionally. - * Use UTF-16 or UTF-8 instead. - * - * \see ID3v2::Tag::setStringHandler() - */ - class TAGLIB_EXPORT Latin1StringHandler - { - public: - Latin1StringHandler(); - virtual ~Latin1StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an ISO-8859-1 (Latin1) character array. - */ - virtual String parse(const ByteVector &data) const; - }; - - //! The main class in the ID3v2 implementation - - /*! - * This is the main class in the ID3v2 implementation. It serves two - * functions. This first, as is obvious from the public API, is to provide a - * container for the other ID3v2 related classes. In addition, through the - * read() and parse() protected methods, it provides the most basic level of - * parsing. In these methods the ID3v2 tag is extracted from the file and - * split into data components. - * - * ID3v2 tags have several parts, TagLib attempts to provide an interface - * for them all. header(), footer() and extendedHeader() corespond to those - * data structures in the ID3v2 standard and the APIs for the classes that - * they return attempt to reflect this. - * - * Also ID3v2 tags are built up from a list of frames, which are in turn - * have a header and a list of fields. TagLib provides two ways of accessing - * the list of frames that are in a given ID3v2 tag. The first is simply - * via the frameList() method. This is just a list of pointers to the frames. - * The second is a map from the frame type -- i.e. "COMM" for comments -- and - * a list of frames of that type. (In some cases ID3v2 allows for multiple - * frames of the same type, hence this being a map to a list rather than just - * a map to an individual frame.) - * - * More information on the structure of frames can be found in the ID3v2::Frame - * class. - * - * read() and parse() pass binary data to the other ID3v2 class structures, - * they do not handle parsing of flags or fields, for instace. Those are - * handled by similar functions within those classes. - * - * \note All pointers to data structures within the tag will become invalid - * when the tag is destroyed. - * - * \warning Dealing with the nasty details of ID3v2 is not for the faint of - * heart and should not be done without much meditation on the spec. It's - * rather long, but if you're planning on messing with this class and others - * that deal with the details of ID3v2 (rather than the nice, safe, abstract - * TagLib::Tag and friends), it's worth your time to familiarize yourself - * with said spec (which is distrubuted with the TagLib sources). TagLib - * tries to do most of the work, but with a little luck, you can still - * convince it to generate invalid ID3v2 tags. The APIs for ID3v2 assume a - * working knowledge of ID3v2 structure. You're been warned. - */ - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Constructs an empty ID3v2 tag. - * - * \note You must create at least one frame for this tag to be valid. - */ - Tag(); - - /*! - * Constructs an ID3v2 tag read from \a file starting at \a tagOffset. - * \a factory specifies which FrameFactory will be used for the - * construction of new frames. - * - * \note You should be able to ignore the \a factory parameter in almost - * all situations. You would want to specify your own FrameFactory - * subclass in the case that you are extending TagLib to support additional - * frame types, which would be incorperated into your factory. - * - * \see FrameFactory - */ - Tag(File *file, long tagOffset, - const FrameFactory *factory = FrameFactory::instance()); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - - virtual bool isEmpty() const; - - /*! - * Returns a pointer to the tag's header. - */ - Header *header() const; - - /*! - * Returns a pointer to the tag's extended header or null if there is no - * extended header. - */ - ExtendedHeader *extendedHeader() const; - - /*! - * Returns a pointer to the tag's footer or null if there is no footer. - * - * \deprecated I don't see any reason to keep this around since there's - * nothing useful to be retrieved from the footer, but well, again, I'm - * prone to change my mind, so this gets to stay around until near a - * release. - */ - Footer *footer() const; - - /*! - * Returns a reference to the frame list map. This is an FrameListMap of - * all of the frames in the tag. - * - * This is the most convenient structure for accessing the tag's frames. - * Many frame types allow multiple instances of the same frame type so this - * is a map of lists. In most cases however there will only be a single - * frame of a certain type. - * - * Let's say for instance that you wanted to access the frame for total - * beats per minute -- the TBPM frame. - * - * \code - * TagLib::MPEG::File f("foo.mp3"); - * - * // Check to make sure that it has an ID3v2 tag - * - * if(f.ID3v2Tag()) { - * - * // Get the list of frames for a specific frame type - * - * TagLib::ID3v2::FrameList l = f.ID3v2Tag()->frameListMap()["TBPM"]; - * - * if(!l.isEmpty()) - * std::cout << l.front()->toString() << std::endl; - * } - * - * \endcode - * - * \warning You should not modify this data structure directly, instead - * use addFrame() and removeFrame(). - * - * \see frameList() - */ - const FrameListMap &frameListMap() const; - - /*! - * Returns a reference to the frame list. This is an FrameList of all of - * the frames in the tag in the order that they were parsed. - * - * This can be useful if for example you want iterate over the tag's frames - * in the order that they occur in the tag. - * - * \warning You should not modify this data structure directly, instead - * use addFrame() and removeFrame(). - */ - const FrameList &frameList() const; - - /*! - * Returns the frame list for frames with the id \a frameID or an empty - * list if there are no frames of that type. This is just a convenience - * and is equivalent to: - * - * \code - * frameListMap()[frameID]; - * \endcode - * - * \see frameListMap() - */ - const FrameList &frameList(const ByteVector &frameID) const; - - /*! - * Add a frame to the tag. At this point the tag takes ownership of - * the frame and will handle freeing its memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void addFrame(Frame *frame); - - /*! - * Remove a frame from the tag. If \a del is true the frame's memory - * will be freed; if it is false, it must be deleted by the user. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void removeFrame(Frame *frame, bool del = true); - - /*! - * Remove all frames of type \a id from the tag and free their memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void removeFrames(const ByteVector &id); - - /*! - * Implements the unified property interface -- export function. - * This function does some work to translate the hard-specified ID3v2 - * frame types into a free-form string-to-stringlist PropertyMap: - * - if ID3v2 frame ID is known by Frame::frameIDToKey(), the returned - * key is used - * - if the frame ID is "TXXX" (user text frame), the description() is - * used as key - * - if the frame ID is "WXXX" (user url frame), - * - if the description is empty or "URL", the key "URL" is used - * - otherwise, the key "URL:<description>" is used; - * - if the frame ID is "COMM" (comments frame), - * - if the description is empty or "COMMENT", the key "COMMENT" - * is used - * - otherwise, the key "COMMENT:<description>" is used; - * - if the frame ID is "USLT" (unsynchronized lyrics), - * - if the description is empty or "LYRICS", the key "LYRICS" is used - * - otherwise, the key "LYRICS:<description>" is used; - * - if the frame ID is "TIPL" (involved peoples list), and if all the - * roles defined in the frame are known in TextIdentificationFrame::involvedPeopleMap(), - * then "<role>=<name>" will be contained in the returned obejct for each - * - if the frame ID is "TMCL" (musician credit list), then - * "PERFORMER:<instrument>=<name>" will be contained in the returned - * PropertyMap for each defined musician - * In any other case, the unsupportedData() of the returned object will contain - * the frame's ID and, in case of a frame ID which is allowed to appear more than - * once, the description, separated by a "/". - * - */ - PropertyMap properties() const; - - /*! - * Removes unsupported frames given by \a properties. The elements of - * \a properties must be taken from properties().unsupportedData(); they - * are of one of the following forms: - * - a four-character frame ID, if the ID3 specification allows only one - * frame with that ID (thus, the frame is uniquely determined) - * - frameID + "/" + description(), when the ID is one of "TXXX", "WXXX", - * "COMM", or "USLT", - * - "UNKNOWN/" + frameID, for frames that could not be parsed by TagLib. - * In that case, *all* unknown frames with the given ID will be removed. - */ - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * See the comments in properties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Render the tag back to binary data, suitable to be written to disk. - */ - ByteVector render() const; - - /*! - * Render the tag back to binary data, suitable to be written to disk. - * - * The \a version parameter specifies the version of the rendered - * ID3v2 tag. It can be either 4 or 3. - */ - // BIC: combine with the above method - ByteVector render(int version) const; - - /*! - * Gets the current string handler that decides how the "Latin-1" data - * will be converted to and from binary data. - * - * \see Latin1StringHandler - */ - static Latin1StringHandler const *latin1StringHandler(); - - /*! - * Sets the string handler that decides how the "Latin-1" data will be - * converted to and from binary data. - * If the parameter \a handler is null, the previous handler is - * released and default ISO-8859-1 handler is restored. - * - * \note The caller is responsible for deleting the previous handler - * as needed after it is released. - * - * \see Latin1StringHandler - */ - static void setLatin1StringHandler(const Latin1StringHandler *handler); - - protected: - /*! - * Reads data from the file specified in the constructor. It does basic - * parsing of the data in the largest chunks. It partitions the tag into - * the Header, the body of the tag (which contains the ExtendedHeader and - * frames) and Footer. - */ - void read(); - - /*! - * This is called by read to parse the body of the tag. It determines if an - * extended header exists and adds frames to the FrameListMap. - */ - void parse(const ByteVector &data); - - /*! - * Sets the value of the text frame with the Frame ID \a id to \a value. - * If the frame does not exist, it is created. - */ - void setTextFrame(const ByteVector &id, const String &value); - - void downgradeFrames(FrameList *existingFrames, FrameList *newFrames) const; - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/mpegfile.cpp b/src/taglib/taglib/mpeg/mpegfile.cpp deleted file mode 100644 index f765bef..0000000 --- a/src/taglib/taglib/mpeg/mpegfile.cpp +++ /dev/null @@ -1,663 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tagunion.h> -#include <id3v2tag.h> -#include <id3v2header.h> -#include <id3v1tag.h> -#include <apefooter.h> -#include <apetag.h> -#include <tdebug.h> - -#include <bitset> - -#include "mpegfile.h" -#include "mpegheader.h" -#include "tpropertymap.h" - -using namespace TagLib; - -namespace -{ - enum { ID3v2Index = 0, APEIndex = 1, ID3v1Index = 2 }; -} - -class MPEG::File::FilePrivate -{ -public: - FilePrivate(ID3v2::FrameFactory *frameFactory = ID3v2::FrameFactory::instance()) : - ID3v2FrameFactory(frameFactory), - ID3v2Location(-1), - ID3v2OriginalSize(0), - APELocation(-1), - APEFooterLocation(-1), - APEOriginalSize(0), - ID3v1Location(-1), - hasID3v2(false), - hasID3v1(false), - hasAPE(false), - properties(0) - { - - } - - ~FilePrivate() - { - delete properties; - } - - const ID3v2::FrameFactory *ID3v2FrameFactory; - - long ID3v2Location; - uint ID3v2OriginalSize; - - long APELocation; - long APEFooterLocation; - uint APEOriginalSize; - - long ID3v1Location; - - TagUnion tag; - - // These indicate whether the file *on disk* has these tags, not if - // this data structure does. This is used in computing offsets. - - bool hasID3v2; - bool hasID3v1; - bool hasAPE; - - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPEG::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(file) -{ - d = new FilePrivate; - - if(isOpen()) - read(readProperties, propertiesStyle); -} - -MPEG::File::File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle propertiesStyle) : - TagLib::File(file) -{ - d = new FilePrivate(frameFactory); - - if(isOpen()) - read(readProperties, propertiesStyle); -} - -MPEG::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle propertiesStyle) : - TagLib::File(stream) -{ - d = new FilePrivate(frameFactory); - - if(isOpen()) - read(readProperties, propertiesStyle); -} - -MPEG::File::~File() -{ - delete d; -} - -TagLib::Tag *MPEG::File::tag() const -{ - return &d->tag; -} - -PropertyMap MPEG::File::properties() const -{ - // once Tag::properties() is virtual, this case distinction could actually be done - // within TagUnion. - if(d->hasID3v2) - return d->tag.access<ID3v2::Tag>(ID3v2Index, false)->properties(); - if(d->hasAPE) - return d->tag.access<APE::Tag>(APEIndex, false)->properties(); - if(d->hasID3v1) - return d->tag.access<ID3v1::Tag>(ID3v1Index, false)->properties(); - return PropertyMap(); -} - -void MPEG::File::removeUnsupportedProperties(const StringList &properties) -{ - if(d->hasID3v2) - d->tag.access<ID3v2::Tag>(ID3v2Index, false)->removeUnsupportedProperties(properties); - else if(d->hasAPE) - d->tag.access<APE::Tag>(APEIndex, false)->removeUnsupportedProperties(properties); - else if(d->hasID3v1) - d->tag.access<ID3v1::Tag>(ID3v1Index, false)->removeUnsupportedProperties(properties); -} - -PropertyMap MPEG::File::setProperties(const PropertyMap &properties) -{ - if(d->hasID3v1) - // update ID3v1 tag if it exists, but ignore the return value - d->tag.access<ID3v1::Tag>(ID3v1Index, false)->setProperties(properties); - return d->tag.access<ID3v2::Tag>(ID3v2Index, true)->setProperties(properties); -} - -MPEG::Properties *MPEG::File::audioProperties() const -{ - return d->properties; -} - -bool MPEG::File::save() -{ - return save(AllTags); -} - -bool MPEG::File::save(int tags) -{ - return save(tags, true); -} - -bool MPEG::File::save(int tags, bool stripOthers) -{ - return save(tags, stripOthers, 4); -} - -bool MPEG::File::save(int tags, bool stripOthers, int id3v2Version) -{ - return save(tags, stripOthers, id3v2Version, true); -} - -bool MPEG::File::save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags) -{ - if(tags == NoTags && stripOthers) - return strip(AllTags); - - if(!ID3v2Tag() && !ID3v1Tag() && !APETag()) { - - if((d->hasID3v1 || d->hasID3v2 || d->hasAPE) && stripOthers) - return strip(AllTags); - - return true; - } - - if(readOnly()) { - debug("MPEG::File::save() -- File is read only."); - return false; - } - - // Create the tags if we've been asked to. - - if (duplicateTags) { - - // Copy the values from the tag that does exist into the new tag, - // except if the existing tag is to be stripped. - - if((tags & ID3v2) && ID3v1Tag() && !(stripOthers && !(tags & ID3v1))) - Tag::duplicate(ID3v1Tag(), ID3v2Tag(true), false); - - if((tags & ID3v1) && d->tag[ID3v2Index] && !(stripOthers && !(tags & ID3v2))) - Tag::duplicate(ID3v2Tag(), ID3v1Tag(true), false); - } - - bool success = true; - - if(ID3v2 & tags) { - - if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { - - if(!d->hasID3v2) - d->ID3v2Location = 0; - - insert(ID3v2Tag()->render(id3v2Version), d->ID3v2Location, d->ID3v2OriginalSize); - - d->hasID3v2 = true; - - // v1 tag location has changed, update if it exists - - if(ID3v1Tag()) - d->ID3v1Location = findID3v1(); - - // APE tag location has changed, update if it exists - - if(APETag()) - findAPE(); - } - else if(stripOthers) - success = strip(ID3v2, false) && success; - } - else if(d->hasID3v2 && stripOthers) - success = strip(ID3v2) && success; - - if(ID3v1 & tags) { - if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { - int offset = d->hasID3v1 ? -128 : 0; - seek(offset, End); - writeBlock(ID3v1Tag()->render()); - d->hasID3v1 = true; - d->ID3v1Location = findID3v1(); - } - else if(stripOthers) - success = strip(ID3v1) && success; - } - else if(d->hasID3v1 && stripOthers) - success = strip(ID3v1, false) && success; - - // Dont save an APE-tag unless one has been created - - if((APE & tags) && APETag()) { - if(d->hasAPE) - insert(APETag()->render(), d->APELocation, d->APEOriginalSize); - else { - if(d->hasID3v1) { - insert(APETag()->render(), d->ID3v1Location, 0); - d->APEOriginalSize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - d->APELocation = d->ID3v1Location; - d->ID3v1Location += d->APEOriginalSize; - } - else { - seek(0, End); - d->APELocation = tell(); - APE::Tag *apeTag = d->tag.access<APE::Tag>(APEIndex, false); - d->APEFooterLocation = d->APELocation - + apeTag->footer()->completeTagSize() - - APE::Footer::size(); - writeBlock(APETag()->render()); - d->APEOriginalSize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - } - } - } - else if(d->hasAPE && stripOthers) - success = strip(APE, false) && success; - - return success; -} - -ID3v2::Tag *MPEG::File::ID3v2Tag(bool create) -{ - return d->tag.access<ID3v2::Tag>(ID3v2Index, create); -} - -ID3v1::Tag *MPEG::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(ID3v1Index, create); -} - -APE::Tag *MPEG::File::APETag(bool create) -{ - return d->tag.access<APE::Tag>(APEIndex, create); -} - -bool MPEG::File::strip(int tags) -{ - return strip(tags, true); -} - -bool MPEG::File::strip(int tags, bool freeMemory) -{ - if(readOnly()) { - debug("MPEG::File::strip() - Cannot strip tags from a read only file."); - return false; - } - - if((tags & ID3v2) && d->hasID3v2) { - removeBlock(d->ID3v2Location, d->ID3v2OriginalSize); - d->ID3v2Location = -1; - d->ID3v2OriginalSize = 0; - d->hasID3v2 = false; - - if(freeMemory) - d->tag.set(ID3v2Index, 0); - - // v1 tag location has changed, update if it exists - - if(ID3v1Tag()) - d->ID3v1Location = findID3v1(); - - // APE tag location has changed, update if it exists - - if(APETag()) - findAPE(); - } - - if((tags & ID3v1) && d->hasID3v1) { - truncate(d->ID3v1Location); - d->ID3v1Location = -1; - d->hasID3v1 = false; - - if(freeMemory) - d->tag.set(ID3v1Index, 0); - } - - if((tags & APE) && d->hasAPE) { - removeBlock(d->APELocation, d->APEOriginalSize); - d->APELocation = -1; - d->APEFooterLocation = -1; - d->hasAPE = false; - if(d->hasID3v1) { - if(d->ID3v1Location > d->APELocation) - d->ID3v1Location -= d->APEOriginalSize; - } - - if(freeMemory) - d->tag.set(APEIndex, 0); - } - - return true; -} - -void MPEG::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) -{ - d->ID3v2FrameFactory = factory; -} - -long MPEG::File::nextFrameOffset(long position) -{ - bool foundLastSyncPattern = false; - - ByteVector buffer; - - while(true) { - seek(position); - buffer = readBlock(bufferSize()); - - if(buffer.size() <= 0) - return -1; - - if(foundLastSyncPattern && secondSynchByte(buffer[0])) - return position - 1; - - for(uint i = 0; i < buffer.size() - 1; i++) { - if(uchar(buffer[i]) == 0xff && secondSynchByte(buffer[i + 1])) - return position + i; - } - - foundLastSyncPattern = uchar(buffer[buffer.size() - 1]) == 0xff; - position += buffer.size(); - } -} - -long MPEG::File::previousFrameOffset(long position) -{ - bool foundFirstSyncPattern = false; - ByteVector buffer; - - while (position > 0) { - long size = ulong(position) < bufferSize() ? position : bufferSize(); - position -= size; - - seek(position); - buffer = readBlock(size); - - if(buffer.size() <= 0) - break; - - if(foundFirstSyncPattern && uchar(buffer[buffer.size() - 1]) == 0xff) - return position + buffer.size() - 1; - - for(int i = buffer.size() - 2; i >= 0; i--) { - if(uchar(buffer[i]) == 0xff && secondSynchByte(buffer[i + 1])) - return position + i; - } - - foundFirstSyncPattern = secondSynchByte(buffer[0]); - } - return -1; -} - -long MPEG::File::firstFrameOffset() -{ - long position = 0; - - if(ID3v2Tag()) - position = d->ID3v2Location + ID3v2Tag()->header()->completeTagSize(); - - return nextFrameOffset(position); -} - -long MPEG::File::lastFrameOffset() -{ - return previousFrameOffset(ID3v1Tag() ? d->ID3v1Location - 1 : length()); -} - -bool MPEG::File::hasID3v1Tag() const -{ - return d->hasID3v1; -} - -bool MPEG::File::hasID3v2Tag() const -{ - return d->hasID3v2; -} - -bool MPEG::File::hasAPETag() const -{ - return d->hasAPE; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPEG::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - // Look for an ID3v2 tag - - d->ID3v2Location = findID3v2(); - - if(d->ID3v2Location >= 0) { - - d->tag.set(ID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); - - d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); - - if(ID3v2Tag()->header()->tagSize() <= 0) - d->tag.set(ID3v2Index, 0); - else - d->hasID3v2 = true; - } - - // Look for an ID3v1 tag - - d->ID3v1Location = findID3v1(); - - if(d->ID3v1Location >= 0) { - d->tag.set(ID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - d->hasID3v1 = true; - } - - // Look for an APE tag - - findAPE(); - - if(d->APELocation >= 0) { - - d->tag.set(APEIndex, new APE::Tag(this, d->APEFooterLocation)); - d->APEOriginalSize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - } - - if(readProperties) - d->properties = new Properties(this, propertiesStyle); - - // Make sure that we have our default tag types available. - - ID3v2Tag(true); - ID3v1Tag(true); -} - -long MPEG::File::findID3v2() -{ - // This method is based on the contents of TagLib::File::find(), but because - // of some subtlteies -- specifically the need to look for the bit pattern of - // an MPEG sync, it has been modified for use here. - - if(isValid() && ID3v2::Header::fileIdentifier().size() <= bufferSize()) { - - // The position in the file that the current buffer starts at. - - long bufferOffset = 0; - ByteVector buffer; - - // These variables are used to keep track of a partial match that happens at - // the end of a buffer. - - int previousPartialMatch = -1; - bool previousPartialSynchMatch = false; - - // Save the location of the current read pointer. We will restore the - // position using seek() before all returns. - - long originalPosition = tell(); - - // Start the search at the beginning of the file. - - seek(0); - - // This loop is the crux of the find method. There are three cases that we - // want to account for: - // (1) The previously searched buffer contained a partial match of the search - // pattern and we want to see if the next one starts with the remainder of - // that pattern. - // - // (2) The search pattern is wholly contained within the current buffer. - // - // (3) The current buffer ends with a partial match of the pattern. We will - // note this for use in the next itteration, where we will check for the rest - // of the pattern. - - for(buffer = readBlock(bufferSize()); buffer.size() > 0; buffer = readBlock(bufferSize())) { - - // (1) previous partial match - - if(previousPartialSynchMatch && secondSynchByte(buffer[0])) - return -1; - - if(previousPartialMatch >= 0 && int(bufferSize()) > previousPartialMatch) { - const int patternOffset = (bufferSize() - previousPartialMatch); - if(buffer.containsAt(ID3v2::Header::fileIdentifier(), 0, patternOffset)) { - seek(originalPosition); - return bufferOffset - bufferSize() + previousPartialMatch; - } - } - - // (2) pattern contained in current buffer - - long location = buffer.find(ID3v2::Header::fileIdentifier()); - if(location >= 0) { - seek(originalPosition); - return bufferOffset + location; - } - - int firstSynchByte = buffer.find(char(uchar(255))); - - // Here we have to loop because there could be several of the first - // (11111111) byte, and we want to check all such instances until we find - // a full match (11111111 111) or hit the end of the buffer. - - while(firstSynchByte >= 0) { - - // if this *is not* at the end of the buffer - - if(firstSynchByte < int(buffer.size()) - 1) { - if(secondSynchByte(buffer[firstSynchByte + 1])) { - // We've found the frame synch pattern. - seek(originalPosition); - return -1; - } - else { - - // We found 11111111 at the end of the current buffer indicating a - // partial match of the synch pattern. The find() below should - // return -1 and break out of the loop. - - previousPartialSynchMatch = true; - } - } - - // Check in the rest of the buffer. - - firstSynchByte = buffer.find(char(uchar(255)), firstSynchByte + 1); - } - - // (3) partial match - - previousPartialMatch = buffer.endsWithPartialMatch(ID3v2::Header::fileIdentifier()); - - bufferOffset += bufferSize(); - } - - // Since we hit the end of the file, reset the status before continuing. - - clear(); - - seek(originalPosition); - } - - return -1; -} - -long MPEG::File::findID3v1() -{ - if(isValid()) { - seek(-128, End); - long p = tell(); - - if(readBlock(3) == ID3v1::Tag::fileIdentifier()) - return p; - } - return -1; -} - -void MPEG::File::findAPE() -{ - if(isValid()) { - seek(d->hasID3v1 ? -160 : -32, End); - - long p = tell(); - - if(readBlock(8) == APE::Tag::fileIdentifier()) { - d->APEFooterLocation = p; - seek(d->APEFooterLocation); - APE::Footer footer(readBlock(APE::Footer::size())); - d->APELocation = d->APEFooterLocation - footer.completeTagSize() - + APE::Footer::size(); - return; - } - } - - d->APELocation = -1; - d->APEFooterLocation = -1; -} - -bool MPEG::File::secondSynchByte(char byte) -{ - std::bitset<8> b(byte); - - // check to see if the byte matches 111xxxxx - return b.test(7) && b.test(6) && b.test(5); -} diff --git a/src/taglib/taglib/mpeg/mpegfile.h b/src/taglib/taglib/mpeg/mpegfile.h deleted file mode 100644 index 3fc01e6..0000000 --- a/src/taglib/taglib/mpeg/mpegfile.h +++ /dev/null @@ -1,390 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGFILE_H -#define TAGLIB_MPEGFILE_H - -#include "taglib_export.h" -#include "tfile.h" -#include "tag.h" - -#include "mpegproperties.h" - -namespace TagLib { - - namespace ID3v2 { class Tag; class FrameFactory; } - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of TagLib::File with MPEG (MP3) specific methods - - namespace MPEG { - - //! An MPEG file class with some useful methods specific to MPEG - - /*! - * This implements the generic TagLib::File API and additionally provides - * access to properties that are distinct to MPEG files, notably access - * to the different ID3 tags. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches APE tags. - APE = 0x0004, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs an MPEG file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an MPEG file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - // BIC: merge with the above constructor - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an MPEG file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to a tag that is the union of the ID3v2 and ID3v1 - * tags. The ID3v2 tag is given priority in reading the information -- if - * requested information exists in both the ID3v2 tag and the ID3v1 tag, - * the information from the ID3v2 tag will be returned. - * - * If you would like more granular control over the content of the tags, - * with the concession of generality, use the tag-type specific calls. - * - * \note As this tag is not implemented as an ID3v2 tag or an ID3v1 tag, - * but a union of the two this pointer may not be cast to the specific - * tag types. - * - * \see ID3v1Tag() - * \see ID3v2Tag() - * \see APETag() - */ - virtual Tag *tag() const; - - /*! - * Implements the reading part of the unified property interface. - * If the file contains more than one tag, only the - * first one (in the order ID3v2, APE, ID3v1) will be converted to the - * PropertyMap. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the writing part of the unified tag dictionary interface. - * In order to avoid problems with deprecated tag formats, this method - * always creates an ID3v2 tag if necessary. - * If an ID3v1 tag exists, it will be updated as well, within the - * limitations of that format. - * The returned PropertyMap refers to the ID3v2 tag only. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the MPEG::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. If at least one tag -- ID3v1 or ID3v2 -- exists this - * will duplicate its content into the other tag. This returns true - * if saving was successful. - * - * If neither exists or if both tags are empty, this will strip the tags - * from the file. - * - * This is the same as calling save(AllTags); - * - * If you would like more granular control over the content of the tags, - * with the concession of generality, use paramaterized save call below. - * - * \see save(int tags) - */ - virtual bool save(); - - /*! - * Save the file. This will attempt to save all of the tag types that are - * specified by OR-ing together TagTypes values. The save() method above - * uses AllTags. This returns true if saving was successful. - * - * This strips all tags not included in the mask, but does not modify them - * in memory, so later calls to save() which make use of these tags will - * remain valid. This also strips empty tags. - */ - bool save(int tags); - - /*! - * Save the file. This will attempt to save all of the tag types that are - * specified by OR-ing together TagTypes values. The save() method above - * uses AllTags. This returns true if saving was successful. - * - * If \a stripOthers is true this strips all tags not included in the mask, - * but does not modify them in memory, so later calls to save() which make - * use of these tags will remain valid. This also strips empty tags. - */ - // BIC: combine with the above method - bool save(int tags, bool stripOthers); - - /*! - * Save the file. This will attempt to save all of the tag types that are - * specified by OR-ing together TagTypes values. The save() method above - * uses AllTags. This returns true if saving was successful. - * - * If \a stripOthers is true this strips all tags not included in the mask, - * but does not modify them in memory, so later calls to save() which make - * use of these tags will remain valid. This also strips empty tags. - * - * The \a id3v2Version parameter specifies the version of the saved - * ID3v2 tag. It can be either 4 or 3. - */ - // BIC: combine with the above method - bool save(int tags, bool stripOthers, int id3v2Version); - - /*! - * Save the file. This will attempt to save all of the tag types that are - * specified by OR-ing together TagTypes values. The save() method above - * uses AllTags. This returns true if saving was successful. - * - * If \a stripOthers is true this strips all tags not included in the mask, - * but does not modify them in memory, so later calls to save() which make - * use of these tags will remain valid. This also strips empty tags. - * - * The \a id3v2Version parameter specifies the version of the saved - * ID3v2 tag. It can be either 4 or 3. - * - * If \a duplicateTags is true and at least one tag -- ID3v1 or ID3v2 -- - * exists this will duplicate its content into the other tag. - */ - // BIC: combine with the above method - bool save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v2 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file - * on disk actually has an ID3v2 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v2Tag() - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an APE tag. Use hasAPETag() to check if the file - * on disk actually has an APE tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasAPETag() - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will strip the tags that match the OR-ed together TagTypes from the - * file. By default it strips all tags. It returns true if the tags are - * successfully stripped. - * - * This is equivalent to strip(tags, true) - * - * \note This will also invalidate pointers to the ID3 and APE tags - * as their memory will be freed. - */ - bool strip(int tags = AllTags); - - /*! - * This will strip the tags that match the OR-ed together TagTypes from the - * file. By default it strips all tags. It returns true if the tags are - * successfully stripped. - * - * If \a freeMemory is true the ID3 and APE tags will be deleted and - * pointers to them will be invalidated. - */ - // BIC: merge with the method above - bool strip(int tags, bool freeMemory); - - /*! - * Set the ID3v2::FrameFactory to something other than the default. - * - * \see ID3v2FrameFactory - */ - void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Returns the position in the file of the first MPEG frame. - */ - long firstFrameOffset(); - - /*! - * Returns the position in the file of the next MPEG frame, - * using the current position as start - */ - long nextFrameOffset(long position); - - /*! - * Returns the position in the file of the previous MPEG frame, - * using the current position as start - */ - long previousFrameOffset(long position); - - /*! - * Returns the position in the file of the last MPEG frame. - */ - long lastFrameOffset(); - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - /*! - * Returns whether or not the file on disk actually has an APE tag. - * - * \see APETag() - */ - bool hasAPETag() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - long findID3v2(); - long findID3v1(); - void findAPE(); - - /*! - * MPEG frames can be recognized by the bit pattern 11111111 111, so the - * first byte is easy to check for, however checking to see if the second byte - * starts with \e 111 is a bit more tricky, hence this member function. - */ - static bool secondSynchByte(char byte); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/mpegheader.cpp b/src/taglib/taglib/mpeg/mpegheader.cpp deleted file mode 100644 index a582f75..0000000 --- a/src/taglib/taglib/mpeg/mpegheader.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <bitset> - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include "trefcounter.h" - -#include "mpegheader.h" - -using namespace TagLib; - -class MPEG::Header::HeaderPrivate : public RefCounter -{ -public: - HeaderPrivate() : - isValid(false), - version(Version1), - layer(0), - protectionEnabled(false), - sampleRate(0), - isPadded(false), - channelMode(Stereo), - isCopyrighted(false), - isOriginal(false), - frameLength(0), - samplesPerFrame(0) {} - - bool isValid; - Version version; - int layer; - bool protectionEnabled; - int bitrate; - int sampleRate; - bool isPadded; - ChannelMode channelMode; - bool isCopyrighted; - bool isOriginal; - int frameLength; - int samplesPerFrame; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPEG::Header::Header(const ByteVector &data) -{ - d = new HeaderPrivate; - parse(data); -} - -MPEG::Header::Header(const Header &h) : d(h.d) -{ - d->ref(); -} - -MPEG::Header::~Header() -{ - if (d->deref()) - delete d; -} - -bool MPEG::Header::isValid() const -{ - return d->isValid; -} - -MPEG::Header::Version MPEG::Header::version() const -{ - return d->version; -} - -int MPEG::Header::layer() const -{ - return d->layer; -} - -bool MPEG::Header::protectionEnabled() const -{ - return d->protectionEnabled; -} - -int MPEG::Header::bitrate() const -{ - return d->bitrate; -} - -int MPEG::Header::sampleRate() const -{ - return d->sampleRate; -} - -bool MPEG::Header::isPadded() const -{ - return d->isPadded; -} - -MPEG::Header::ChannelMode MPEG::Header::channelMode() const -{ - return d->channelMode; -} - -bool MPEG::Header::isCopyrighted() const -{ - return d->isCopyrighted; -} - -bool MPEG::Header::isOriginal() const -{ - return d->isOriginal; -} - -int MPEG::Header::frameLength() const -{ - return d->frameLength; -} - -int MPEG::Header::samplesPerFrame() const -{ - return d->samplesPerFrame; -} - -MPEG::Header &MPEG::Header::operator=(const Header &h) -{ - if(&h == this) - return *this; - - if(d->deref()) - delete d; - - d = h.d; - d->ref(); - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPEG::Header::parse(const ByteVector &data) -{ - if(data.size() < 4 || uchar(data[0]) != 0xff) { - debug("MPEG::Header::parse() -- First byte did not match MPEG synch."); - return; - } - - std::bitset<32> flags(TAGLIB_CONSTRUCT_BITSET(data.toUInt())); - - // Check for the second byte's part of the MPEG synch - - if(!flags[23] || !flags[22] || !flags[21]) { - debug("MPEG::Header::parse() -- Second byte did not match MPEG synch."); - return; - } - - // Set the MPEG version - - if(!flags[20] && !flags[19]) - d->version = Version2_5; - else if(flags[20] && !flags[19]) - d->version = Version2; - else if(flags[20] && flags[19]) - d->version = Version1; - - // Set the MPEG layer - - if(!flags[18] && flags[17]) - d->layer = 3; - else if(flags[18] && !flags[17]) - d->layer = 2; - else if(flags[18] && flags[17]) - d->layer = 1; - - d->protectionEnabled = !flags[16]; - - // Set the bitrate - - static const int bitrates[2][3][16] = { - { // Version 1 - { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // layer 1 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // layer 2 - { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 } // layer 3 - }, - { // Version 2 or 2.5 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 }, // layer 1 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // layer 2 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 } // layer 3 - } - }; - - const int versionIndex = d->version == Version1 ? 0 : 1; - const int layerIndex = d->layer > 0 ? d->layer - 1 : 0; - - // The bitrate index is encoded as the first 4 bits of the 3rd byte, - // i.e. 1111xxxx - - int i = uchar(data[2]) >> 4; - - d->bitrate = bitrates[versionIndex][layerIndex][i]; - - // Set the sample rate - - static const int sampleRates[3][4] = { - { 44100, 48000, 32000, 0 }, // Version 1 - { 22050, 24000, 16000, 0 }, // Version 2 - { 11025, 12000, 8000, 0 } // Version 2.5 - }; - - // The sample rate index is encoded as two bits in the 3nd byte, i.e. xxxx11xx - - i = uchar(data[2]) >> 2 & 0x03; - - d->sampleRate = sampleRates[d->version][i]; - - if(d->sampleRate == 0) { - debug("MPEG::Header::parse() -- Invalid sample rate."); - return; - } - - // The channel mode is encoded as a 2 bit value at the end of the 3nd byte, - // i.e. xxxxxx11 - - d->channelMode = ChannelMode((uchar(data[3]) & 0xC0) >> 6); - - // TODO: Add mode extension for completeness - - d->isOriginal = flags[2]; - d->isCopyrighted = flags[3]; - d->isPadded = flags[9]; - - // Calculate the frame length - - if(d->layer == 1) - d->frameLength = 24000 * 2 * d->bitrate / d->sampleRate + int(d->isPadded); - else - d->frameLength = 72000 * d->bitrate / d->sampleRate + int(d->isPadded); - - // Samples per frame - - static const int samplesPerFrame[3][2] = { - // MPEG1, 2/2.5 - { 384, 384 }, // Layer I - { 1152, 1152 }, // Layer II - { 1152, 576 } // Layer III - }; - - d->samplesPerFrame = samplesPerFrame[layerIndex][versionIndex]; - - // Now that we're done parsing, set this to be a valid frame. - - d->isValid = true; -} diff --git a/src/taglib/taglib/mpeg/mpegheader.h b/src/taglib/taglib/mpeg/mpegheader.h deleted file mode 100644 index 020ebd0..0000000 --- a/src/taglib/taglib/mpeg/mpegheader.h +++ /dev/null @@ -1,166 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGHEADER_H -#define TAGLIB_MPEGHEADER_H - -#include "taglib_export.h" - -namespace TagLib { - - class ByteVector; - - namespace MPEG { - - //! An implementation of MP3 frame headers - - /*! - * This is an implementation of MPEG Layer III headers. The API follows more - * or less the binary format of these headers. I've used - * <a href="http://www.mp3-tech.org/programmer/frame_header.html">this</a> - * document as a reference. - */ - - class TAGLIB_EXPORT Header - { - public: - /*! - * Parses an MPEG header based on \a data. - */ - Header(const ByteVector &data); - - /*! - * Does a shallow copy of \a h. - */ - Header(const Header &h); - - /*! - * Destroys this Header instance. - */ - virtual ~Header(); - - /*! - * Returns true if the frame is at least an appropriate size and has - * legal values. - */ - bool isValid() const; - - /*! - * The MPEG Version. - */ - enum Version { - //! MPEG Version 1 - Version1 = 0, - //! MPEG Version 2 - Version2 = 1, - //! MPEG Version 2.5 - Version2_5 = 2 - }; - - /*! - * Returns the MPEG Version of the header. - */ - Version version() const; - - /*! - * Returns the layer version. This will be between the values 1-3. - */ - int layer() const; - - /*! - * Returns true if the MPEG protection bit is enabled. - */ - bool protectionEnabled() const; - - /*! - * Returns the bitrate encoded in the header. - */ - int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - int sampleRate() const; - - /*! - * Returns true if the frame is padded. - */ - bool isPadded() const; - - /*! - * There are a few combinations or one or two channel audio that are - * possible: - */ - enum ChannelMode { - //! Stereo - Stereo = 0, - //! Stereo - JointStereo = 1, - //! Dual Mono - DualChannel = 2, - //! Mono - SingleChannel = 3 - }; - - /*! - * Returns the channel mode for this frame. - */ - ChannelMode channelMode() const; - - /*! - * Returns true if the copyrighted bit is set. - */ - bool isCopyrighted() const; - - /*! - * Returns true if the "original" bit is set. - */ - bool isOriginal() const; - - /*! - * Returns the frame length. - */ - int frameLength() const; - - /*! - * Returns the number of frames per sample. - */ - int samplesPerFrame() const; - - /*! - * Makes a shallow copy of the header. - */ - Header &operator=(const Header &h); - - private: - void parse(const ByteVector &data); - - class HeaderPrivate; - HeaderPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/mpegproperties.cpp b/src/taglib/taglib/mpeg/mpegproperties.cpp deleted file mode 100644 index 3af9566..0000000 --- a/src/taglib/taglib/mpeg/mpegproperties.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> - -#include "mpegproperties.h" -#include "mpegfile.h" -#include "xingheader.h" - -using namespace TagLib; - -class MPEG::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(File *f, ReadStyle s) : - file(f), - xingHeader(0), - style(s), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - layer(0), - version(Header::Version1), - channelMode(Header::Stereo), - protectionEnabled(false), - isCopyrighted(false), - isOriginal(false) {} - - ~PropertiesPrivate() - { - delete xingHeader; - } - - File *file; - XingHeader *xingHeader; - ReadStyle style; - int length; - int bitrate; - int sampleRate; - int channels; - int layer; - Header::Version version; - Header::ChannelMode channelMode; - bool protectionEnabled; - bool isCopyrighted; - bool isOriginal; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPEG::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(file, style); - - if(file && file->isOpen()) - read(); -} - -MPEG::Properties::~Properties() -{ - delete d; -} - -int MPEG::Properties::length() const -{ - return d->length; -} - -int MPEG::Properties::bitrate() const -{ - return d->bitrate; -} - -int MPEG::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int MPEG::Properties::channels() const -{ - return d->channels; -} - -const MPEG::XingHeader *MPEG::Properties::xingHeader() const -{ - return d->xingHeader; -} - -MPEG::Header::Version MPEG::Properties::version() const -{ - return d->version; -} - -int MPEG::Properties::layer() const -{ - return d->layer; -} - -bool MPEG::Properties::protectionEnabled() const -{ - return d->protectionEnabled; -} - -MPEG::Header::ChannelMode MPEG::Properties::channelMode() const -{ - return d->channelMode; -} - -bool MPEG::Properties::isCopyrighted() const -{ - return d->isCopyrighted; -} - -bool MPEG::Properties::isOriginal() const -{ - return d->isOriginal; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPEG::Properties::read() -{ - // Since we've likely just looked for the ID3v1 tag, start at the end of the - // file where we're least likely to have to have to move the disk head. - - long last = d->file->lastFrameOffset(); - - if(last < 0) { - debug("MPEG::Properties::read() -- Could not find a valid last MPEG frame in the stream."); - return; - } - - d->file->seek(last); - Header lastHeader(d->file->readBlock(4)); - - long first = d->file->firstFrameOffset(); - - if(first < 0) { - debug("MPEG::Properties::read() -- Could not find a valid first MPEG frame in the stream."); - return; - } - - if(!lastHeader.isValid()) { - - long pos = last; - - while(pos > first) { - - pos = d->file->previousFrameOffset(pos); - - if(pos < 0) - break; - - d->file->seek(pos); - Header header(d->file->readBlock(4)); - - if(header.isValid()) { - lastHeader = header; - last = pos; - break; - } - } - } - - // Now jump back to the front of the file and read what we need from there. - - d->file->seek(first); - Header firstHeader(d->file->readBlock(4)); - - if(!firstHeader.isValid() || !lastHeader.isValid()) { - debug("MPEG::Properties::read() -- Page headers were invalid."); - return; - } - - // Check for a Xing header that will help us in gathering information about a - // VBR stream. - - int xingHeaderOffset = MPEG::XingHeader::xingHeaderOffset(firstHeader.version(), - firstHeader.channelMode()); - - d->file->seek(first + xingHeaderOffset); - d->xingHeader = new XingHeader(d->file->readBlock(16)); - - // Read the length and the bitrate from the Xing header. - - if(d->xingHeader->isValid() && - firstHeader.sampleRate() > 0 && - d->xingHeader->totalFrames() > 0) - { - double timePerFrame = - double(firstHeader.samplesPerFrame()) / firstHeader.sampleRate(); - - double length = timePerFrame * d->xingHeader->totalFrames(); - - d->length = int(length); - d->bitrate = d->length > 0 ? (int)(d->xingHeader->totalSize() * 8 / length / 1000) : 0; - } - else { - // Since there was no valid Xing header found, we hope that we're in a constant - // bitrate file. - - delete d->xingHeader; - d->xingHeader = 0; - - // TODO: Make this more robust with audio property detection for VBR without a - // Xing header. - - if(firstHeader.frameLength() > 0 && firstHeader.bitrate() > 0) { - int frames = (last - first) / firstHeader.frameLength() + 1; - - d->length = int(float(firstHeader.frameLength() * frames) / - float(firstHeader.bitrate() * 125) + 0.5); - d->bitrate = firstHeader.bitrate(); - } - } - - - d->sampleRate = firstHeader.sampleRate(); - d->channels = firstHeader.channelMode() == Header::SingleChannel ? 1 : 2; - d->version = firstHeader.version(); - d->layer = firstHeader.layer(); - d->protectionEnabled = firstHeader.protectionEnabled(); - d->channelMode = firstHeader.channelMode(); - d->isCopyrighted = firstHeader.isCopyrighted(); - d->isOriginal = firstHeader.isOriginal(); -} diff --git a/src/taglib/taglib/mpeg/mpegproperties.h b/src/taglib/taglib/mpeg/mpegproperties.h deleted file mode 100644 index 72e594f..0000000 --- a/src/taglib/taglib/mpeg/mpegproperties.h +++ /dev/null @@ -1,118 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGPROPERTIES_H -#define TAGLIB_MPEGPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -#include "mpegheader.h" - -namespace TagLib { - - namespace MPEG { - - class File; - class XingHeader; - - //! An implementation of audio property reading for MP3 - - /*! - * This reads the data from an MPEG Layer III stream found in the - * AudioProperties API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of MPEG::Properties with the data read from the - * MPEG::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this MPEG Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns a pointer to the XingHeader if one exists or null if no - * XingHeader was found. - */ - - const XingHeader *xingHeader() const; - - /*! - * Returns the MPEG Version of the file. - */ - Header::Version version() const; - - /*! - * Returns the layer version. This will be between the values 1-3. - */ - int layer() const; - - /*! - * Returns true if the MPEG protection bit is enabled. - */ - bool protectionEnabled() const; - - /*! - * Returns the channel mode for this frame. - */ - Header::ChannelMode channelMode() const; - - /*! - * Returns true if the copyrighted bit is set. - */ - bool isCopyrighted() const; - - /*! - * Returns true if the "original" bit is set. - */ - bool isOriginal() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/mpeg/xingheader.cpp b/src/taglib/taglib/mpeg/xingheader.cpp deleted file mode 100644 index 9e20127..0000000 --- a/src/taglib/taglib/mpeg/xingheader.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Ismael Orenstein - email : orenstein@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> - -#include "xingheader.h" - -using namespace TagLib; - -class MPEG::XingHeader::XingHeaderPrivate -{ -public: - XingHeaderPrivate() : - frames(0), - size(0), - valid(false) - {} - - uint frames; - uint size; - bool valid; -}; - -MPEG::XingHeader::XingHeader(const ByteVector &data) -{ - d = new XingHeaderPrivate; - parse(data); -} - -MPEG::XingHeader::~XingHeader() -{ - delete d; -} - -bool MPEG::XingHeader::isValid() const -{ - return d->valid; -} - -TagLib::uint MPEG::XingHeader::totalFrames() const -{ - return d->frames; -} - -TagLib::uint MPEG::XingHeader::totalSize() const -{ - return d->size; -} - -int MPEG::XingHeader::xingHeaderOffset(TagLib::MPEG::Header::Version v, - TagLib::MPEG::Header::ChannelMode c) -{ - if(v == MPEG::Header::Version1) { - if(c == MPEG::Header::SingleChannel) - return 0x15; - else - return 0x24; - } - else { - if(c == MPEG::Header::SingleChannel) - return 0x0D; - else - return 0x15; - } -} - -void MPEG::XingHeader::parse(const ByteVector &data) -{ - // Check to see if a valid Xing header is available. - - if(!data.startsWith("Xing") && !data.startsWith("Info")) - return; - - // If the XingHeader doesn't contain the number of frames and the total stream - // info it's invalid. - - if(!(data[7] & 0x01)) { - debug("MPEG::XingHeader::parse() -- Xing header doesn't contain the total number of frames."); - return; - } - - if(!(data[7] & 0x02)) { - debug("MPEG::XingHeader::parse() -- Xing header doesn't contain the total stream size."); - return; - } - - d->frames = data.toUInt(8U); - d->size = data.toUInt(12U); - - d->valid = true; -} diff --git a/src/taglib/taglib/mpeg/xingheader.h b/src/taglib/taglib/mpeg/xingheader.h deleted file mode 100644 index ffe7494..0000000 --- a/src/taglib/taglib/mpeg/xingheader.h +++ /dev/null @@ -1,100 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Ismael Orenstein - email : orenstein@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_XINGHEADER_H -#define TAGLIB_XINGHEADER_H - -#include "mpegheader.h" -#include "taglib_export.h" - -namespace TagLib { - - class ByteVector; - - namespace MPEG { - - //! An implementation of the Xing VBR headers - - /*! - * This is a minimalistic implementation of the Xing VBR headers. Xing - * headers are often added to VBR (variable bit rate) MP3 streams to make it - * easy to compute the length and quality of a VBR stream. Our implementation - * is only concerned with the total size of the stream (so that we can - * calculate the total playing time and the average bitrate). It uses - * <a href="http://home.pcisys.net/~melanson/codecs/mp3extensions.txt">this text</a> - * and the XMMS sources as references. - */ - - class TAGLIB_EXPORT XingHeader - { - public: - /*! - * Parses a Xing header based on \a data. The data must be at least 16 - * bytes long (anything longer than this is discarded). - */ - XingHeader(const ByteVector &data); - - /*! - * Destroy this XingHeader instance. - */ - virtual ~XingHeader(); - - /*! - * Returns true if the data was parsed properly and if there is a valid - * Xing header present. - */ - bool isValid() const; - - /*! - * Returns the total number of frames. - */ - uint totalFrames() const; - - /*! - * Returns the total size of stream in bytes. - */ - uint totalSize() const; - - /*! - * Returns the offset for the start of this Xing header, given the - * version and channels of the frame - */ - // BIC: rename to offset() - static int xingHeaderOffset(TagLib::MPEG::Header::Version v, - TagLib::MPEG::Header::ChannelMode c); - - private: - XingHeader(const XingHeader &); - XingHeader &operator=(const XingHeader &); - - void parse(const ByteVector &data); - - class XingHeaderPrivate; - XingHeaderPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/ogg/flac/oggflacfile.cpp b/src/taglib/taglib/ogg/flac/oggflacfile.cpp deleted file mode 100644 index bdf8245..0000000 --- a/src/taglib/taglib/ogg/flac/oggflacfile.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004-2005 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include <tpropertymap.h> - -#include <xiphcomment.h> -#include "oggflacfile.h" - -using namespace TagLib; -using TagLib::FLAC::Properties; - -class Ogg::FLAC::File::FilePrivate -{ -public: - FilePrivate() : - comment(0), - properties(0), - streamStart(0), - streamLength(0), - scanned(false), - hasXiphComment(false), - commentPacket(0) {} - - ~FilePrivate() - { - delete comment; - delete properties; - } - - Ogg::XiphComment *comment; - - Properties *properties; - ByteVector streamInfoData; - ByteVector xiphCommentData; - long streamStart; - long streamLength; - bool scanned; - - bool hasXiphComment; - int commentPacket; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::FLAC::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : Ogg::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Ogg::FLAC::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : Ogg::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Ogg::FLAC::File::~File() -{ - delete d; -} - -Ogg::XiphComment *Ogg::FLAC::File::tag() const -{ - return d->comment; -} - -PropertyMap Ogg::FLAC::File::properties() const -{ - return d->comment->properties(); -} - -PropertyMap Ogg::FLAC::File::setProperties(const PropertyMap &properties) -{ - return d->comment->setProperties(properties); -} - -Properties *Ogg::FLAC::File::audioProperties() const -{ - return d->properties; -} - - -bool Ogg::FLAC::File::save() -{ - d->xiphCommentData = d->comment->render(false); - - // Create FLAC metadata-block: - - // Put the size in the first 32 bit (I assume no more than 24 bit are used) - - ByteVector v = ByteVector::fromUInt(d->xiphCommentData.size()); - - // Set the type of the metadata-block to be a Xiph / Vorbis comment - - v[0] = 4; - - // Append the comment-data after the 32 bit header - - v.append(d->xiphCommentData); - - // Save the packet at the old spot - // FIXME: Use padding if size is increasing - - setPacket(d->commentPacket, v); - - return Ogg::File::save(); -} - -bool Ogg::FLAC::File::hasXiphComment() const -{ - return d->hasXiphComment; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Ogg::FLAC::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - // Sanity: Check if we really have an Ogg/FLAC file - -/* - ByteVector oggHeader = packet(0); - - if (oggHeader.mid(28,4) != "fLaC") { - debug("Ogg::FLAC::File::read() -- Not an Ogg/FLAC file"); - setValid(false); - return; - }*/ - - // Look for FLAC metadata, including vorbis comments - - scan(); - - if (!d->scanned) { - setValid(false); - return; - } - - - if(d->hasXiphComment) - d->comment = new Ogg::XiphComment(xiphCommentData()); - else - d->comment = new Ogg::XiphComment; - - - if(readProperties) - d->properties = new Properties(streamInfoData(), streamLength(), propertiesStyle); -} - -ByteVector Ogg::FLAC::File::streamInfoData() -{ - scan(); - return d->streamInfoData; -} - -ByteVector Ogg::FLAC::File::xiphCommentData() -{ - scan(); - return d->xiphCommentData; -} - -long Ogg::FLAC::File::streamLength() -{ - scan(); - return d->streamLength; -} - -void Ogg::FLAC::File::scan() -{ - // Scan the metadata pages - - if(d->scanned) - return; - - if(!isValid()) - return; - - int ipacket = 0; - long overhead = 0; - - ByteVector metadataHeader = packet(ipacket); - if(metadataHeader.isNull()) - return; - - ByteVector header; - - if (!metadataHeader.startsWith("fLaC")) { - // FLAC 1.1.2+ - if (metadataHeader.mid(1,4) != "FLAC") return; - - if (metadataHeader[5] != 1) return; // not version 1 - - metadataHeader = metadataHeader.mid(13); - } - else { - // FLAC 1.1.0 & 1.1.1 - metadataHeader = packet(++ipacket); - - if(metadataHeader.isNull()) - return; - - } - - header = metadataHeader.mid(0,4); - // Header format (from spec): - // <1> Last-metadata-block flag - // <7> BLOCK_TYPE - // 0 : STREAMINFO - // 1 : PADDING - // .. - // 4 : VORBIS_COMMENT - // .. - // <24> Length of metadata to follow - - char blockType = header[0] & 0x7f; - bool lastBlock = (header[0] & 0x80) != 0; - uint length = header.toUInt(1, 3, true); - overhead += length; - - // Sanity: First block should be the stream_info metadata - - if(blockType != 0) { - debug("Ogg::FLAC::File::scan() -- Invalid Ogg/FLAC stream"); - return; - } - - d->streamInfoData = metadataHeader.mid(4, length); - - // Search through the remaining metadata - - while(!lastBlock) { - metadataHeader = packet(++ipacket); - - if(metadataHeader.isNull()) - return; - - header = metadataHeader.mid(0, 4); - blockType = header[0] & 0x7f; - lastBlock = (header[0] & 0x80) != 0; - length = header.toUInt(1, 3, true); - overhead += length; - - if(blockType == 1) { - // debug("Ogg::FLAC::File::scan() -- Padding found"); - } - else if(blockType == 4) { - // debug("Ogg::FLAC::File::scan() -- Vorbis-comments found"); - d->xiphCommentData = metadataHeader.mid(4, length); - d->hasXiphComment = true; - d->commentPacket = ipacket; - } - else if(blockType > 5) { - debug("Ogg::FLAC::File::scan() -- Unknown metadata block"); - } - } - - // End of metadata, now comes the datastream - d->streamStart = overhead; - d->streamLength = File::length() - d->streamStart; - - d->scanned = true; -} diff --git a/src/taglib/taglib/ogg/flac/oggflacfile.h b/src/taglib/taglib/ogg/flac/oggflacfile.h deleted file mode 100644 index 8d87e48..0000000 --- a/src/taglib/taglib/ogg/flac/oggflacfile.h +++ /dev/null @@ -1,162 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGFLACFILE_H -#define TAGLIB_OGGFLACFILE_H - -#include "taglib_export.h" -#include "oggfile.h" -#include "xiphcomment.h" - -#include "flacproperties.h" - -namespace TagLib { - - class Tag; - - namespace Ogg { - - //! An implementation of Ogg FLAC metadata - - /*! - * This is implementation of FLAC metadata for Ogg FLAC files. For "pure" - * FLAC files look under the FLAC hiearchy. - * - * Unlike "pure" FLAC-files, Ogg FLAC only supports Xiph-comments, - * while the audio-properties are the same. - */ - namespace FLAC { - - using TagLib::FLAC::Properties; - - //! An implementation of TagLib::File with Ogg/FLAC specific methods - - /*! - * This implements and provides an interface for Ogg/FLAC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to Ogg FLAC files. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Constructs an Ogg/FLAC file from \a file. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an Ogg/FLAC file from \a stream. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will always be a XiphComment. - * - * \note This always returns a valid pointer regardless of whether or not - * the file on disk has a XiphComment. Use hasXiphComment() to check if - * the file on disk actually has a XiphComment. - * - * \note The Tag <b>is still</b> owned by the FLAC::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasXiphComment() - */ - virtual XiphComment *tag() const; - - /*! - * Returns the FLAC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - - /*! - * Implements the unified property interface -- export function. - * This forwards directly to XiphComment::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified tag dictionary interface -- import function. - * Like properties(), this is a forwarder to the file's XiphComment. - */ - PropertyMap setProperties(const PropertyMap &); - - - /*! - * Save the file. This will primarily save and update the XiphComment. - * Returns true if the save is successful. - */ - virtual bool save(); - - /*! - * Returns the length of the audio-stream, used by FLAC::Properties for - * calculating the bitrate. - */ - long streamLength(); - - /*! - * Returns whether or not the file on disk actually has a XiphComment. - * - * \see tag() - */ - bool hasXiphComment() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - ByteVector streamInfoData(); - ByteVector xiphCommentData(); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace FLAC - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/src/taglib/taglib/ogg/oggfile.cpp b/src/taglib/taglib/ogg/oggfile.cpp deleted file mode 100644 index cc30f9c..0000000 --- a/src/taglib/taglib/ogg/oggfile.cpp +++ /dev/null @@ -1,432 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <tmap.h> -#include <tstring.h> -#include <tdebug.h> - -#include "oggfile.h" -#include "oggpage.h" -#include "oggpageheader.h" - -using namespace TagLib; - -class Ogg::File::FilePrivate -{ -public: - FilePrivate() : - streamSerialNumber(0), - firstPageHeader(0), - lastPageHeader(0), - currentPage(0), - currentPacketPage(0) - { - pages.setAutoDelete(true); - } - - ~FilePrivate() - { - delete firstPageHeader; - delete lastPageHeader; - } - - uint streamSerialNumber; - List<Page *> pages; - PageHeader *firstPageHeader; - PageHeader *lastPageHeader; - std::vector< List<int> > packetToPageMap; - Map<int, ByteVector> dirtyPackets; - List<int> dirtyPages; - - //! The current page for the reader -- used by nextPage() - Page *currentPage; - //! The current page for the packet parser -- used by packet() - Page *currentPacketPage; - //! The packets for the currentPacketPage -- used by packet() - ByteVectorList currentPackets; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::File::~File() -{ - delete d; -} - -ByteVector Ogg::File::packet(uint i) -{ - // Check to see if we're called setPacket() for this packet since the last - // save: - - if(d->dirtyPackets.contains(i)) - return d->dirtyPackets[i]; - - // If we haven't indexed the page where the packet we're interested in starts, - // begin reading pages until we have. - - while(d->packetToPageMap.size() <= i) { - if(!nextPage()) { - debug("Ogg::File::packet() -- Could not find the requested packet."); - return ByteVector::null; - } - } - - // Start reading at the first page that contains part (or all) of this packet. - // If the last read stopped at the packet that we're interested in, don't - // reread its packet list. (This should make sequential packet reads fast.) - - uint pageIndex = d->packetToPageMap[i].front(); - if(d->currentPacketPage != d->pages[pageIndex]) { - d->currentPacketPage = d->pages[pageIndex]; - d->currentPackets = d->currentPacketPage->packets(); - } - - // If the packet is completely contained in the first page that it's in, then - // just return it now. - - if(d->currentPacketPage->containsPacket(i) & Page::CompletePacket) - return d->currentPackets[i - d->currentPacketPage->firstPacketIndex()]; - - // If the packet is *not* completely contained in the first page that it's a - // part of then that packet trails off the end of the page. Continue appending - // the pages' packet data until we hit a page that either does not end with the - // packet that we're fetching or where the last packet is complete. - - ByteVector packet = d->currentPackets.back(); - while(d->currentPacketPage->containsPacket(i) & Page::EndsWithPacket && - !d->currentPacketPage->header()->lastPacketCompleted()) - { - pageIndex++; - if(pageIndex == d->pages.size()) { - if(!nextPage()) { - debug("Ogg::File::packet() -- Could not find the requested packet."); - return ByteVector::null; - } - } - d->currentPacketPage = d->pages[pageIndex]; - d->currentPackets = d->currentPacketPage->packets(); - packet.append(d->currentPackets.front()); - } - - return packet; -} - -void Ogg::File::setPacket(uint i, const ByteVector &p) -{ - while(d->packetToPageMap.size() <= i) { - if(!nextPage()) { - debug("Ogg::File::setPacket() -- Could not set the requested packet."); - return; - } - } - - List<int>::ConstIterator it = d->packetToPageMap[i].begin(); - for(; it != d->packetToPageMap[i].end(); ++it) - d->dirtyPages.sortedInsert(*it, true); - - d->dirtyPackets.insert(i, p); -} - -const Ogg::PageHeader *Ogg::File::firstPageHeader() -{ - if(d->firstPageHeader) - return d->firstPageHeader->isValid() ? d->firstPageHeader : 0; - - long firstPageHeaderOffset = find("OggS"); - - if(firstPageHeaderOffset < 0) - return 0; - - d->firstPageHeader = new PageHeader(this, firstPageHeaderOffset); - return d->firstPageHeader->isValid() ? d->firstPageHeader : 0; -} - -const Ogg::PageHeader *Ogg::File::lastPageHeader() -{ - if(d->lastPageHeader) - return d->lastPageHeader->isValid() ? d->lastPageHeader : 0; - - long lastPageHeaderOffset = rfind("OggS"); - - if(lastPageHeaderOffset < 0) - return 0; - - d->lastPageHeader = new PageHeader(this, lastPageHeaderOffset); - return d->lastPageHeader->isValid() ? d->lastPageHeader : 0; -} - -bool Ogg::File::save() -{ - if(readOnly()) { - debug("Ogg::File::save() - Cannot save to a read only file."); - return false; - } - - List<int> pageGroup; - - for(List<int>::ConstIterator it = d->dirtyPages.begin(); it != d->dirtyPages.end(); ++it) { - if(!pageGroup.isEmpty() && pageGroup.back() + 1 != *it) { - writePageGroup(pageGroup); - pageGroup.clear(); - } - else - pageGroup.append(*it); - } - writePageGroup(pageGroup); - d->dirtyPages.clear(); - d->dirtyPackets.clear(); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::File::File(FileName file) : TagLib::File(file) -{ - d = new FilePrivate; -} - -Ogg::File::File(IOStream *stream) : TagLib::File(stream) -{ - d = new FilePrivate; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -bool Ogg::File::nextPage() -{ - long nextPageOffset; - int currentPacket; - - if(d->pages.isEmpty()) { - currentPacket = 0; - nextPageOffset = find("OggS"); - if(nextPageOffset < 0) - return false; - } - else { - if(d->currentPage->header()->lastPageOfStream()) - return false; - - if(d->currentPage->header()->lastPacketCompleted()) - currentPacket = d->currentPage->firstPacketIndex() + d->currentPage->packetCount(); - else - currentPacket = d->currentPage->firstPacketIndex() + d->currentPage->packetCount() - 1; - - nextPageOffset = d->currentPage->fileOffset() + d->currentPage->size(); - } - - // Read the next page and add it to the page list. - - d->currentPage = new Page(this, nextPageOffset); - - if(!d->currentPage->header()->isValid()) { - delete d->currentPage; - d->currentPage = 0; - return false; - } - - d->currentPage->setFirstPacketIndex(currentPacket); - - if(d->pages.isEmpty()) - d->streamSerialNumber = d->currentPage->header()->streamSerialNumber(); - - d->pages.append(d->currentPage); - - // Loop through the packets in the page that we just read appending the - // current page number to the packet to page map for each packet. - - for(uint i = 0; i < d->currentPage->packetCount(); i++) { - uint currentPacket = d->currentPage->firstPacketIndex() + i; - if(d->packetToPageMap.size() <= currentPacket) - d->packetToPageMap.push_back(List<int>()); - d->packetToPageMap[currentPacket].append(d->pages.size() - 1); - } - - return true; -} - -void Ogg::File::writePageGroup(const List<int> &thePageGroup) -{ - if(thePageGroup.isEmpty()) - return; - - - // pages in the pageGroup and packets must be equivalent - // (originalSize and size of packets would not work together), - // therefore we sometimes have to add pages to the group - List<int> pageGroup(thePageGroup); - while (!d->pages[pageGroup.back()]->header()->lastPacketCompleted()) { - if (d->currentPage->header()->pageSequenceNumber() == pageGroup.back()) { - if (nextPage() == false) { - debug("broken ogg file"); - return; - } - pageGroup.append(d->currentPage->header()->pageSequenceNumber()); - } else { - pageGroup.append(pageGroup.back() + 1); - } - } - - ByteVectorList packets; - - // If the first page of the group isn't dirty, append its partial content here. - - if(!d->dirtyPages.contains(d->pages[pageGroup.front()]->firstPacketIndex())) - packets.append(d->pages[pageGroup.front()]->packets().front()); - - int previousPacket = -1; - int originalSize = 0; - - for(List<int>::ConstIterator it = pageGroup.begin(); it != pageGroup.end(); ++it) { - uint firstPacket = d->pages[*it]->firstPacketIndex(); - uint lastPacket = firstPacket + d->pages[*it]->packetCount() - 1; - - List<int>::ConstIterator last = --pageGroup.end(); - - for(uint i = firstPacket; i <= lastPacket; i++) { - - if(it == last && i == lastPacket && !d->dirtyPages.contains(i)) - packets.append(d->pages[*it]->packets().back()); - else if(int(i) != previousPacket) { - previousPacket = i; - packets.append(packet(i)); - } - } - originalSize += d->pages[*it]->size(); - } - - const bool continued = d->pages[pageGroup.front()]->header()->firstPacketContinued(); - const bool completed = d->pages[pageGroup.back()]->header()->lastPacketCompleted(); - - // TODO: This pagination method isn't accurate for what's being done here. - // This should account for real possibilities like non-aligned packets and such. - - List<Page *> pages = Page::paginate(packets, Page::SinglePagePerGroup, - d->streamSerialNumber, pageGroup.front(), - continued, completed); - - List<Page *> renumberedPages; - - // Correct the page numbering of following pages - - if (pages.back()->header()->pageSequenceNumber() != pageGroup.back()) { - - // TODO: change the internal data structure so that we don't need to hold the - // complete file in memory (is unavoidable at the moment) - - // read the complete stream - while(!d->currentPage->header()->lastPageOfStream()) { - if(nextPage() == false) { - debug("broken ogg file"); - break; - } - } - - // create a gap for the new pages - int numberOfNewPages = pages.back()->header()->pageSequenceNumber() - pageGroup.back(); - List<Page *>::Iterator pageIter = d->pages.begin(); - for(int i = 0; i < pageGroup.back(); i++) { - if(pageIter != d->pages.end()) { - ++pageIter; - } - else { - debug("Ogg::File::writePageGroup() -- Page sequence is broken in original file."); - break; - } - } - - ++pageIter; - for(; pageIter != d->pages.end(); ++pageIter) { - Ogg::Page *newPage = - (*pageIter)->getCopyWithNewPageSequenceNumber( - (*pageIter)->header()->pageSequenceNumber() + numberOfNewPages); - - ByteVector data; - data.append(newPage->render()); - insert(data, newPage->fileOffset(), data.size()); - - renumberedPages.append(newPage); - } - } - - // insert the new data - - ByteVector data; - for(List<Page *>::ConstIterator it = pages.begin(); it != pages.end(); ++it) - data.append((*it)->render()); - - // The insertion algorithms could also be improve to queue and prioritize data - // on the way out. Currently it requires rewriting the file for every page - // group rather than just once; however, for tagging applications there will - // generally only be one page group, so it's not worth the time for the - // optimization at the moment. - - insert(data, d->pages[pageGroup.front()]->fileOffset(), originalSize); - - // Update the page index to include the pages we just created and to delete the - // old pages. - - // First step: Pages that contain the comment data - - for(List<Page *>::ConstIterator it = pages.begin(); it != pages.end(); ++it) { - const unsigned int index = (*it)->header()->pageSequenceNumber(); - if(index < d->pages.size()) { - delete d->pages[index]; - d->pages[index] = *it; - } - else if(index == d->pages.size()) { - d->pages.append(*it); - } - else { - // oops - there's a hole in the sequence - debug("Ogg::File::writePageGroup() -- Page sequence is broken."); - } - } - - // Second step: the renumbered pages - - for(List<Page *>::ConstIterator it = renumberedPages.begin(); it != renumberedPages.end(); ++it) { - const unsigned int index = (*it)->header()->pageSequenceNumber(); - if(index < d->pages.size()) { - delete d->pages[index]; - d->pages[index] = *it; - } - else if(index == d->pages.size()) { - d->pages.append(*it); - } - else { - // oops - there's a hole in the sequence - debug("Ogg::File::writePageGroup() -- Page sequence is broken."); - } - } -} diff --git a/src/taglib/taglib/ogg/oggfile.h b/src/taglib/taglib/ogg/oggfile.h deleted file mode 100644 index 8fed4ba..0000000 --- a/src/taglib/taglib/ogg/oggfile.h +++ /dev/null @@ -1,122 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "taglib_export.h" -#include "tfile.h" -#include "tbytevectorlist.h" - -#ifndef TAGLIB_OGGFILE_H -#define TAGLIB_OGGFILE_H - -namespace TagLib { - - //! A namespace for the classes used by Ogg-based metadata files - - namespace Ogg { - - class PageHeader; - - //! An implementation of TagLib::File with some helpers for Ogg based formats - - /*! - * This is an implementation of Ogg file page and packet rendering and is of - * use to Ogg based formats. While the API is small this handles the - * non-trivial details of breaking up an Ogg stream into packets and makes - * these available (via subclassing) to the codec meta data implementations. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - virtual ~File(); - - /*! - * Returns the packet contents for the i-th packet (starting from zero) - * in the Ogg bitstream. - * - * \warning The requires reading at least the packet header for every page - * up to the requested page. - */ - ByteVector packet(uint i); - - /*! - * Sets the packet with index \a i to the value \a p. - */ - void setPacket(uint i, const ByteVector &p); - - /*! - * Returns a pointer to the PageHeader for the first page in the stream or - * null if the page could not be found. - */ - const PageHeader *firstPageHeader(); - - /*! - * Returns a pointer to the PageHeader for the last page in the stream or - * null if the page could not be found. - */ - const PageHeader *lastPageHeader(); - - virtual bool save(); - - protected: - /*! - * Constructs an Ogg file from \a file. - * - * \note This constructor is protected since Ogg::File shouldn't be - * instantiated directly but rather should be used through the codec - * specific subclasses. - */ - File(FileName file); - - /*! - * Constructs an Ogg file from \a stream. - * - * \note This constructor is protected since Ogg::File shouldn't be - * instantiated directly but rather should be used through the codec - * specific subclasses. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream); - - private: - File(const File &); - File &operator=(const File &); - - /*! - * Reads the next page and updates the internal "current page" pointer. - */ - bool nextPage(); - void writePageGroup(const List<int> &group); - - class FilePrivate; - FilePrivate *d; - }; - - } -} - -#endif diff --git a/src/taglib/taglib/ogg/oggpage.cpp b/src/taglib/taglib/ogg/oggpage.cpp deleted file mode 100644 index e5f767e..0000000 --- a/src/taglib/taglib/ogg/oggpage.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include "oggpage.h" -#include "oggpageheader.h" -#include "oggfile.h" - -using namespace TagLib; - -class Ogg::Page::PagePrivate -{ -public: - PagePrivate(File *f = 0, long pageOffset = -1) : - file(f), - fileOffset(pageOffset), - packetOffset(0), - header(f, pageOffset), - firstPacketIndex(-1) - { - if(file) { - packetOffset = fileOffset + header.size(); - packetSizes = header.packetSizes(); - dataSize = header.dataSize(); - } - } - - File *file; - long fileOffset; - long packetOffset; - int dataSize; - List<int> packetSizes; - PageHeader header; - int firstPacketIndex; - ByteVectorList packets; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::Page::Page(Ogg::File *file, long pageOffset) -{ - d = new PagePrivate(file, pageOffset); -} - -Ogg::Page::~Page() -{ - delete d; -} - -long Ogg::Page::fileOffset() const -{ - return d->fileOffset; -} - -const Ogg::PageHeader *Ogg::Page::header() const -{ - return &d->header; -} - -int Ogg::Page::firstPacketIndex() const -{ - return d->firstPacketIndex; -} - -void Ogg::Page::setFirstPacketIndex(int index) -{ - d->firstPacketIndex = index; -} - -Ogg::Page::ContainsPacketFlags Ogg::Page::containsPacket(int index) const -{ - int lastPacketIndex = d->firstPacketIndex + packetCount() - 1; - if(index < d->firstPacketIndex || index > lastPacketIndex) - return DoesNotContainPacket; - - ContainsPacketFlags flags = DoesNotContainPacket; - - if(index == d->firstPacketIndex) - flags = ContainsPacketFlags(flags | BeginsWithPacket); - - if(index == lastPacketIndex) - flags = ContainsPacketFlags(flags | EndsWithPacket); - - // If there's only one page and it's complete: - - if(packetCount() == 1 && - !d->header.firstPacketContinued() && - d->header.lastPacketCompleted()) - { - flags = ContainsPacketFlags(flags | CompletePacket); - } - - // Or if there is more than one page and the page is - // (a) the first page and it's complete or - // (b) the last page and it's complete or - // (c) a page in the middle. - else if(packetCount() > 1 && - ((flags & BeginsWithPacket && !d->header.firstPacketContinued()) || - (flags & EndsWithPacket && d->header.lastPacketCompleted()) || - (!(flags & BeginsWithPacket) && !(flags & EndsWithPacket)))) - { - flags = ContainsPacketFlags(flags | CompletePacket); - } - - return flags; -} - -TagLib::uint Ogg::Page::packetCount() const -{ - return d->header.packetSizes().size(); -} - -ByteVectorList Ogg::Page::packets() const -{ - if(!d->packets.isEmpty()) - return d->packets; - - ByteVectorList l; - - if(d->file && d->header.isValid()) { - - d->file->seek(d->packetOffset); - - List<int> packetSizes = d->header.packetSizes(); - - List<int>::ConstIterator it = packetSizes.begin(); - for(; it != packetSizes.end(); ++it) - l.append(d->file->readBlock(*it)); - } - else - debug("Ogg::Page::packets() -- attempting to read packets from an invalid page."); - - return l; -} - -int Ogg::Page::size() const -{ - return d->header.size() + d->header.dataSize(); -} - -ByteVector Ogg::Page::render() const -{ - ByteVector data; - - data.append(d->header.render()); - - if(d->packets.isEmpty()) { - if(d->file) { - d->file->seek(d->packetOffset); - data.append(d->file->readBlock(d->dataSize)); - } - else - debug("Ogg::Page::render() -- this page is empty!"); - } - else { - ByteVectorList::ConstIterator it = d->packets.begin(); - for(; it != d->packets.end(); ++it) - data.append(*it); - } - - // Compute and set the checksum for the Ogg page. The checksum is taken over - // the entire page with the 4 bytes reserved for the checksum zeroed and then - // inserted in bytes 22-25 of the page header. - - ByteVector checksum = ByteVector::fromUInt(data.checksum(), false); - for(int i = 0; i < 4; i++) - data[i + 22] = checksum[i]; - - return data; -} - -List<Ogg::Page *> Ogg::Page::paginate(const ByteVectorList &packets, - PaginationStrategy strategy, - uint streamSerialNumber, - int firstPage, - bool firstPacketContinued, - bool lastPacketCompleted, - bool containsLastPacket) -{ - List<Page *> l; - - int totalSize = 0; - - for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) - totalSize += (*it).size(); - - // Handle creation of multiple pages with appropriate pagination. - if(strategy == Repaginate || totalSize + packets.size() > 255 * 255) { - - // SPLITSIZE must be a multiple of 255 in order to get the lacing values right - // create pages of about 8KB each -#define SPLITSIZE (32*255) - - int pageIndex = 0; - - for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) { - bool continued = false; - - // mark very first packet? - if(firstPacketContinued && it==packets.begin()) { - continued = true; - } - - // append to buf - ByteVector packetBuf; - packetBuf.append(*it); - - while(packetBuf.size() > SPLITSIZE) { - // output a Page - ByteVector packetForOnePage; - packetForOnePage.resize(SPLITSIZE); - std::copy(packetBuf.begin(), packetBuf.begin() + SPLITSIZE, packetForOnePage.begin()); - - ByteVectorList packetList; - packetList.append(packetForOnePage); - Page *p = new Page(packetList, streamSerialNumber, firstPage+pageIndex, continued, false, false); - l.append(p); - - pageIndex++; - continued = true; - packetBuf = packetBuf.mid(SPLITSIZE); - } - - ByteVectorList::ConstIterator jt = it; - ++jt; - bool lastPacketInList = (jt == packets.end()); - - // output a page for the rest (we output one packet per page, so this one should be completed) - ByteVectorList packetList; - packetList.append(packetBuf); - - bool isVeryLastPacket = false; - if(containsLastPacket) { - // mark the very last output page as last of stream - ByteVectorList::ConstIterator jt = it; - ++jt; - if(jt == packets.end()) { - isVeryLastPacket = true; - } - } - - Page *p = new Page(packetList, streamSerialNumber, firstPage+pageIndex, continued, - lastPacketInList ? lastPacketCompleted : true, - isVeryLastPacket); - pageIndex++; - - l.append(p); - } - } - else { - Page *p = new Page(packets, streamSerialNumber, firstPage, firstPacketContinued, - lastPacketCompleted, containsLastPacket); - l.append(p); - } - - return l; -} - -Ogg::Page* Ogg::Page::getCopyWithNewPageSequenceNumber(int sequenceNumber) -{ - Page *pResultPage = NULL; - - // TODO: a copy constructor would be helpful - - if(d->file == 0) { - pResultPage = new Page( - d->packets, - d->header.streamSerialNumber(), - sequenceNumber, - d->header.firstPacketContinued(), - d->header.lastPacketCompleted(), - d->header.lastPageOfStream()); - } - else - { - pResultPage = new Page(d->file, d->fileOffset); - pResultPage->d->header.setPageSequenceNumber(sequenceNumber); - } - return pResultPage; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::Page::Page(const ByteVectorList &packets, - uint streamSerialNumber, - int pageNumber, - bool firstPacketContinued, - bool lastPacketCompleted, - bool containsLastPacket) -{ - d = new PagePrivate; - - ByteVector data; - List<int> packetSizes; - - d->header.setFirstPageOfStream(pageNumber == 0 && !firstPacketContinued); - d->header.setLastPageOfStream(containsLastPacket); - d->header.setFirstPacketContinued(firstPacketContinued); - d->header.setLastPacketCompleted(lastPacketCompleted); - d->header.setStreamSerialNumber(streamSerialNumber); - d->header.setPageSequenceNumber(pageNumber); - - // Build a page from the list of packets. - - for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) { - packetSizes.append((*it).size()); - data.append(*it); - } - d->packets = packets; - d->header.setPacketSizes(packetSizes); -} - diff --git a/src/taglib/taglib/ogg/oggpage.h b/src/taglib/taglib/ogg/oggpage.h deleted file mode 100644 index e9f4840..0000000 --- a/src/taglib/taglib/ogg/oggpage.h +++ /dev/null @@ -1,211 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGPAGE_H -#define TAGLIB_OGGPAGE_H - -#include "taglib_export.h" -#include "tbytevectorlist.h" - -namespace TagLib { - - namespace Ogg { - - class File; - class PageHeader; - - //! An implementation of Ogg pages - - /*! - * This is an implementation of the pages that make up an Ogg stream. - * This handles parsing pages and breaking them down into packets and handles - * the details of packets spanning multiple pages and pages that contiain - * multiple packets. - * - * In most Xiph.org formats the comments are found in the first few packets, - * this however is a reasonably complete implementation of Ogg pages that - * could potentially be useful for non-meta data purposes. - */ - - class TAGLIB_EXPORT Page - { - public: - /*! - * Read an Ogg page from the \a file at the position \a pageOffset. - */ - Page(File *file, long pageOffset); - - virtual ~Page(); - - /*! - * Returns the page's position within the file (in bytes). - */ - long fileOffset() const; - - /*! - * Returns a pointer to the header for this page. This pointer will become - * invalid when the page is deleted. - */ - const PageHeader *header() const; - - /*! - * Returns a copy of the page with \a sequenceNumber set as sequence number. - * - * \see header() - * \see PageHeader::setPageSequenceNumber() - */ - Page* getCopyWithNewPageSequenceNumber(int sequenceNumber); - - /*! - * Returns the index of the first packet wholly or partially contained in - * this page. - * - * \see setFirstPacketIndex() - */ - int firstPacketIndex() const; - - /*! - * Sets the index of the first packet in the page. - * - * \see firstPacketIndex() - */ - void setFirstPacketIndex(int index); - - /*! - * When checking to see if a page contains a given packet this set of flags - * represents the possible values for that packets status in the page. - * - * \see containsPacket() - */ - enum ContainsPacketFlags { - //! No part of the packet is contained in the page - DoesNotContainPacket = 0x0000, - //! The packet is wholly contained in the page - CompletePacket = 0x0001, - //! The page starts with the given packet - BeginsWithPacket = 0x0002, - //! The page ends with the given packet - EndsWithPacket = 0x0004 - }; - - /*! - * Checks to see if the specified \a packet is contained in the current - * page. - * - * \see ContainsPacketFlags - */ - ContainsPacketFlags containsPacket(int index) const; - - /*! - * Returns the number of packets (whole or partial) in this page. - */ - uint packetCount() const; - - /*! - * Returns a list of the packets in this page. - * - * \note Either or both the first and last packets may be only partial. - * \see PageHeader::firstPacketContinued() - */ - ByteVectorList packets() const; - - /*! - * Returns the size of the page in bytes. - */ - int size() const; - - ByteVector render() const; - - /*! - * Defines a strategy for pagination, or grouping pages into Ogg packets, - * for use with pagination methods. - * - * \note Yes, I'm aware that this is not a canonical "Strategy Pattern", - * the term was simply convenient. - */ - enum PaginationStrategy { - /*! - * Attempt to put the specified set of packets into a single Ogg packet. - * If the sum of the packet data is greater than will fit into a single - * Ogg page -- 65280 bytes -- this will fall back to repagination using - * the recommended page sizes. - */ - SinglePagePerGroup, - /*! - * Split the packet or group of packets into pages that conform to the - * sizes recommended in the Ogg standard. - */ - Repaginate - }; - - /*! - * Pack \a packets into Ogg pages using the \a strategy for pagination. - * The page number indicater inside of the rendered packets will start - * with \a firstPage and be incremented for each page rendered. - * \a containsLastPacket should be set to true if \a packets contains the - * last page in the stream and will set the appropriate flag in the last - * rendered Ogg page's header. \a streamSerialNumber should be set to - * the serial number for this stream. - * - * \note The "absolute granule position" is currently always zeroed using - * this method as this suffices for the comment headers. - * - * \warning The pages returned by this method must be deleted by the user. - * You can use List<T>::setAutoDelete(true) to set these pages to be - * automatically deleted when this list passes out of scope. - * - * \see PaginationStrategy - * \see List::setAutoDelete() - */ - static List<Page *> paginate(const ByteVectorList &packets, - PaginationStrategy strategy, - uint streamSerialNumber, - int firstPage, - bool firstPacketContinued = false, - bool lastPacketCompleted = true, - bool containsLastPacket = false); - - protected: - /*! - * Creates an Ogg packet based on the data in \a packets. The page number - * for each page will be set to \a pageNumber. - */ - Page(const ByteVectorList &packets, - uint streamSerialNumber, - int pageNumber, - bool firstPacketContinued = false, - bool lastPacketCompleted = true, - bool containsLastPacket = false); - - private: - Page(const Page &); - Page &operator=(const Page &); - - class PagePrivate; - PagePrivate *d; - }; - } -} -#endif diff --git a/src/taglib/taglib/ogg/oggpageheader.cpp b/src/taglib/taglib/ogg/oggpageheader.cpp deleted file mode 100644 index b933313..0000000 --- a/src/taglib/taglib/ogg/oggpageheader.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <stdlib.h> - -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> -#include <taglib.h> - -#include "oggpageheader.h" -#include "oggfile.h" - -using namespace TagLib; - -class Ogg::PageHeader::PageHeaderPrivate -{ -public: - PageHeaderPrivate(File *f, long pageOffset) : - file(f), - fileOffset(pageOffset), - isValid(false), - firstPacketContinued(false), - lastPacketCompleted(false), - firstPageOfStream(false), - lastPageOfStream(false), - absoluteGranularPosition(0), - streamSerialNumber(0), - pageSequenceNumber(-1), - size(0), - dataSize(0) - {} - - File *file; - long fileOffset; - bool isValid; - List<int> packetSizes; - bool firstPacketContinued; - bool lastPacketCompleted; - bool firstPageOfStream; - bool lastPageOfStream; - long long absoluteGranularPosition; - uint streamSerialNumber; - int pageSequenceNumber; - int size; - int dataSize; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::PageHeader::PageHeader(Ogg::File *file, long pageOffset) -{ - d = new PageHeaderPrivate(file, pageOffset); - if(file && pageOffset >= 0) - read(); -} - -Ogg::PageHeader::~PageHeader() -{ - delete d; -} - -bool Ogg::PageHeader::isValid() const -{ - return d->isValid; -} - -List<int> Ogg::PageHeader::packetSizes() const -{ - return d->packetSizes; -} - -void Ogg::PageHeader::setPacketSizes(const List<int> &sizes) -{ - d->packetSizes = sizes; -} - -bool Ogg::PageHeader::firstPacketContinued() const -{ - return d->firstPacketContinued; -} - -void Ogg::PageHeader::setFirstPacketContinued(bool continued) -{ - d->firstPacketContinued = continued; -} - -bool Ogg::PageHeader::lastPacketCompleted() const -{ - return d->lastPacketCompleted; -} - -void Ogg::PageHeader::setLastPacketCompleted(bool completed) -{ - d->lastPacketCompleted = completed; -} - -bool Ogg::PageHeader::firstPageOfStream() const -{ - return d->firstPageOfStream; -} - -void Ogg::PageHeader::setFirstPageOfStream(bool first) -{ - d->firstPageOfStream = first; -} - -bool Ogg::PageHeader::lastPageOfStream() const -{ - return d->lastPageOfStream; -} - -void Ogg::PageHeader::setLastPageOfStream(bool last) -{ - d->lastPageOfStream = last; -} - -long long Ogg::PageHeader::absoluteGranularPosition() const -{ - return d->absoluteGranularPosition; -} - -void Ogg::PageHeader::setAbsoluteGranularPosition(long long agp) -{ - d->absoluteGranularPosition = agp; -} - -int Ogg::PageHeader::pageSequenceNumber() const -{ - return d->pageSequenceNumber; -} - -void Ogg::PageHeader::setPageSequenceNumber(int sequenceNumber) -{ - d->pageSequenceNumber = sequenceNumber; -} - -TagLib::uint Ogg::PageHeader::streamSerialNumber() const -{ - return d->streamSerialNumber; -} - -void Ogg::PageHeader::setStreamSerialNumber(uint n) -{ - d->streamSerialNumber = n; -} - -int Ogg::PageHeader::size() const -{ - return d->size; -} - -int Ogg::PageHeader::dataSize() const -{ - return d->dataSize; -} - -ByteVector Ogg::PageHeader::render() const -{ - ByteVector data; - - // capture patern - - data.append("OggS"); - - // stream structure version - - data.append(char(0)); - - // header type flag - - std::bitset<8> flags; - flags[0] = d->firstPacketContinued; - flags[1] = d->pageSequenceNumber == 0; - flags[2] = d->lastPageOfStream; - - data.append(char(flags.to_ulong())); - - // absolute granular position - - data.append(ByteVector::fromLongLong(d->absoluteGranularPosition, false)); - - // stream serial number - - data.append(ByteVector::fromUInt(d->streamSerialNumber, false)); - - // page sequence number - - data.append(ByteVector::fromUInt(d->pageSequenceNumber, false)); - - // checksum -- this is left empty and should be filled in by the Ogg::Page - // class - - data.append(ByteVector(4, 0)); - - // page segment count and page segment table - - ByteVector pageSegments = lacingValues(); - - data.append(char(uchar(pageSegments.size()))); - data.append(pageSegments); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Ogg::PageHeader::read() -{ - d->file->seek(d->fileOffset); - - // An Ogg page header is at least 27 bytes, so we'll go ahead and read that - // much and then get the rest when we're ready for it. - - ByteVector data = d->file->readBlock(27); - - // Sanity check -- make sure that we were in fact able to read as much data as - // we asked for and that the page begins with "OggS". - - if(data.size() != 27 || !data.startsWith("OggS")) { - debug("Ogg::PageHeader::read() -- error reading page header"); - return; - } - - std::bitset<8> flags(data[5]); - - d->firstPacketContinued = flags.test(0); - d->firstPageOfStream = flags.test(1); - d->lastPageOfStream = flags.test(2); - - d->absoluteGranularPosition = data.toLongLong(6, false); - d->streamSerialNumber = data.toUInt(14, false); - d->pageSequenceNumber = data.toUInt(18, false); - - // Byte number 27 is the number of page segments, which is the only variable - // length portion of the page header. After reading the number of page - // segments we'll then read in the corresponding data for this count. - - int pageSegmentCount = uchar(data[26]); - - ByteVector pageSegments = d->file->readBlock(pageSegmentCount); - - // Another sanity check. - - if(pageSegmentCount < 1 || int(pageSegments.size()) != pageSegmentCount) - return; - - // The base size of an Ogg page 27 bytes plus the number of lacing values. - - d->size = 27 + pageSegmentCount; - - int packetSize = 0; - - for(int i = 0; i < pageSegmentCount; i++) { - d->dataSize += uchar(pageSegments[i]); - packetSize += uchar(pageSegments[i]); - - if(uchar(pageSegments[i]) < 255) { - d->packetSizes.append(packetSize); - packetSize = 0; - } - } - - if(packetSize > 0) { - d->packetSizes.append(packetSize); - d->lastPacketCompleted = false; - } - else - d->lastPacketCompleted = true; - - d->isValid = true; -} - -ByteVector Ogg::PageHeader::lacingValues() const -{ - ByteVector data; - - List<int> sizes = d->packetSizes; - for(List<int>::ConstIterator it = sizes.begin(); it != sizes.end(); ++it) { - - // The size of a packet in an Ogg page is indicated by a series of "lacing - // values" where the sum of the values is the packet size in bytes. Each of - // these values is a byte. A value of less than 255 (0xff) indicates the end - // of the packet. - - div_t n = div(*it, 255); - - for(int i = 0; i < n.quot; i++) - data.append(char(uchar(255))); - - if(it != --sizes.end() || d->lastPacketCompleted) - data.append(char(uchar(n.rem))); - } - - return data; -} diff --git a/src/taglib/taglib/ogg/oggpageheader.h b/src/taglib/taglib/ogg/oggpageheader.h deleted file mode 100644 index 742710a..0000000 --- a/src/taglib/taglib/ogg/oggpageheader.h +++ /dev/null @@ -1,232 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGPAGEHEADER_H -#define TAGLIB_OGGPAGEHEADER_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace Ogg { - - class File; - - //! An implementation of the page headers associated with each Ogg::Page - - /*! - * This class implements Ogg page headers which contain the information - * about Ogg pages needed to break them into packets which can be passed on - * to the codecs. - */ - - class TAGLIB_EXPORT PageHeader - { - public: - /*! - * Reads a PageHeader from \a file starting at \a pageOffset. The defaults - * create a page with no (and as such, invalid) data that must be set - * later. - */ - PageHeader(File *file = 0, long pageOffset = -1); - - /*! - * Deletes this instance of the PageHeader. - */ - virtual ~PageHeader(); - - /*! - * Returns true if the header parsed properly and is valid. - */ - bool isValid() const; - - /*! - * Ogg pages contain a list of packets (which are used by the contained - * codecs). The sizes of these pages is encoded in the page header. This - * returns a list of the packet sizes in bytes. - * - * \see setPacketSizes() - */ - List<int> packetSizes() const; - - /*! - * Sets the sizes of the packets in this page to \a sizes. Internally this - * updates the lacing values in the header. - * - * \see packetSizes() - */ - void setPacketSizes(const List<int> &sizes); - - /*! - * Some packets can be <i>continued</i> across multiple pages. If the - * first packet in the current page is a continuation this will return - * true. If this is page starts with a new packet this will return false. - * - * \see lastPacketCompleted() - * \see setFirstPacketContinued() - */ - bool firstPacketContinued() const; - - /*! - * Sets the internal flag indicating if the first packet in this page is - * continued to \a continued. - * - * \see firstPacketContinued() - */ - void setFirstPacketContinued(bool continued); - - /*! - * Returns true if the last packet of this page is completely contained in - * this page. - * - * \see firstPacketContinued() - * \see setLastPacketCompleted() - */ - bool lastPacketCompleted() const; - - /*! - * Sets the internal flag indicating if the last packet in this page is - * complete to \a completed. - * - * \see lastPacketCompleted() - */ - void setLastPacketCompleted(bool completed); - - /*! - * This returns true if this is the first page of the Ogg (logical) stream. - * - * \see setFirstPageOfStream() - */ - bool firstPageOfStream() const; - - /*! - * Marks this page as the first page of the Ogg stream. - * - * \see firstPageOfStream() - */ - void setFirstPageOfStream(bool first); - - /*! - * This returns true if this is the last page of the Ogg (logical) stream. - * - * \see setLastPageOfStream() - */ - bool lastPageOfStream() const; - - /*! - * Marks this page as the last page of the Ogg stream. - * - * \see lastPageOfStream() - */ - void setLastPageOfStream(bool last); - - /*! - * A special value of containing the position of the packet to be - * interpreted by the codec. In the case of Vorbis this contains the PCM - * value and is used to calculate the length of the stream. - * - * \see setAbsoluteGranularPosition() - */ - long long absoluteGranularPosition() const; - - /*! - * A special value of containing the position of the packet to be - * interpreted by the codec. It is only supported here so that it may be - * coppied from one page to another. - * - * \see absoluteGranularPosition() - */ - void setAbsoluteGranularPosition(long long agp); - - /*! - * Every Ogg logical stream is given a random serial number which is common - * to every page in that logical stream. This returns the serial number of - * the stream associated with this packet. - * - * \see setStreamSerialNumber() - */ - uint streamSerialNumber() const; - - /*! - * Every Ogg logical stream is given a random serial number which is common - * to every page in that logical stream. This sets this pages serial - * number. This method should be used when adding new pages to a logical - * stream. - * - * \see streamSerialNumber() - */ - void setStreamSerialNumber(uint n); - - /*! - * Returns the index of the page within the Ogg stream. This helps make it - * possible to determine if pages have been lost. - * - * \see setPageSequenceNumber() - */ - int pageSequenceNumber() const; - - /*! - * Sets the page's position in the stream to \a sequenceNumber. - * - * \see pageSequenceNumber() - */ - void setPageSequenceNumber(int sequenceNumber); - - /*! - * Returns the complete header size. - */ - int size() const; - - /*! - * Returns the size of the data portion of the page -- i.e. the size of the - * page less the header size. - */ - int dataSize() const; - - /*! - * Render the page header to binary data. - * - * \note The checksum -- bytes 22 - 25 -- will be left empty and must be - * filled in when rendering the entire page. - */ - ByteVector render() const; - - private: - PageHeader(const PageHeader &); - PageHeader &operator=(const PageHeader &); - - void read(); - ByteVector lacingValues() const; - - class PageHeaderPrivate; - PageHeaderPrivate *d; - }; - - } -} - -#endif diff --git a/src/taglib/taglib/ogg/opus/opusfile.cpp b/src/taglib/taglib/ogg/opus/opusfile.cpp deleted file mode 100644 index cb81a32..0000000 --- a/src/taglib/taglib/ogg/opus/opusfile.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> -#include <tpropertymap.h> - -#include "opusfile.h" - -using namespace TagLib; -using namespace TagLib::Ogg; - -class Opus::File::FilePrivate -{ -public: - FilePrivate() : - comment(0), - properties(0) {} - - ~FilePrivate() - { - delete comment; - delete properties; - } - - Ogg::XiphComment *comment; - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Opus::File::File(FileName file, bool readProperties, Properties::ReadStyle propertiesStyle) : - Ogg::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Opus::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle propertiesStyle) : - Ogg::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Opus::File::~File() -{ - delete d; -} - -Ogg::XiphComment *Opus::File::tag() const -{ - return d->comment; -} - -PropertyMap Opus::File::properties() const -{ - return d->comment->properties(); -} - -PropertyMap Opus::File::setProperties(const PropertyMap &properties) -{ - return d->comment->setProperties(properties); -} - -Opus::Properties *Opus::File::audioProperties() const -{ - return d->properties; -} - -bool Opus::File::save() -{ - if(!d->comment) - d->comment = new Ogg::XiphComment; - - setPacket(1, ByteVector("OpusTags", 8) + d->comment->render(false)); - - return Ogg::File::save(); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Opus::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - ByteVector opusHeaderData = packet(0); - - if(!opusHeaderData.startsWith("OpusHead")) { - setValid(false); - debug("Opus::File::read() -- invalid Opus identification header"); - return; - } - - ByteVector commentHeaderData = packet(1); - - if(!commentHeaderData.startsWith("OpusTags")) { - setValid(false); - debug("Opus::File::read() -- invalid Opus tags header"); - return; - } - - d->comment = new Ogg::XiphComment(commentHeaderData.mid(8)); - - if(readProperties) - d->properties = new Properties(this, propertiesStyle); -} diff --git a/src/taglib/taglib/ogg/opus/opusfile.h b/src/taglib/taglib/ogg/opus/opusfile.h deleted file mode 100644 index 275167e..0000000 --- a/src/taglib/taglib/ogg/opus/opusfile.h +++ /dev/null @@ -1,124 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OPUSFILE_H -#define TAGLIB_OPUSFILE_H - -#include "oggfile.h" -#include "xiphcomment.h" - -#include "opusproperties.h" - -namespace TagLib { - - namespace Ogg { - - //! A namespace containing classes for Opus metadata - - namespace Opus { - - //! An implementation of Ogg::File with Opus specific methods - - /*! - * This is the central class in the Ogg Opus metadata processing collection - * of classes. It's built upon Ogg::File which handles processing of the Ogg - * logical bitstream and breaking it down into pages which are handled by - * the codec implementations, in this case Opus specifically. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Constructs an Opus file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an Opus file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the XiphComment for this file. XiphComment implements the tag - * interface, so this serves as the reimplementation of - * TagLib::File::tag(). - */ - virtual Ogg::XiphComment *tag() const; - - /*! - * Implements the unified property interface -- export function. - * This forwards directly to XiphComment::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified tag dictionary interface -- import function. - * Like properties(), this is a forwarder to the file's XiphComment. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the Opus::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - virtual bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - class FilePrivate; - FilePrivate *d; - }; - } - } -} - -#endif diff --git a/src/taglib/taglib/ogg/opus/opusproperties.cpp b/src/taglib/taglib/ogg/opus/opusproperties.cpp deleted file mode 100644 index 7bdcd39..0000000 --- a/src/taglib/taglib/ogg/opus/opusproperties.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include <oggpageheader.h> - -#include "opusproperties.h" -#include "opusfile.h" - -using namespace TagLib; -using namespace TagLib::Ogg; - -class Opus::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(File *f, ReadStyle s) : - file(f), - style(s), - length(0), - inputSampleRate(0), - channels(0), - opusVersion(0) {} - - File *file; - ReadStyle style; - int length; - int inputSampleRate; - int channels; - int opusVersion; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Opus::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(file, style); - read(); -} - -Opus::Properties::~Properties() -{ - delete d; -} - -int Opus::Properties::length() const -{ - return d->length; -} - -int Opus::Properties::bitrate() const -{ - return 0; -} - -int Opus::Properties::sampleRate() const -{ - // Opus can decode any stream at a sample rate of 8, 12, 16, 24, or 48 kHz, - // so there is no single sample rate. Let's assume it's the highest - // possible. - return 48000; -} - -int Opus::Properties::channels() const -{ - return d->channels; -} - -int Opus::Properties::inputSampleRate() const -{ - return d->inputSampleRate; -} - -int Opus::Properties::opusVersion() const -{ - return d->opusVersion; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Opus::Properties::read() -{ - // Get the identification header from the Ogg implementation. - - // http://tools.ietf.org/html/draft-terriberry-oggopus-01#section-5.1 - - ByteVector data = d->file->packet(0); - - // *Magic Signature* - uint pos = 8; - - // *Version* (8 bits, unsigned) - d->opusVersion = uchar(data.at(pos)); - pos += 1; - - // *Output Channel Count* 'C' (8 bits, unsigned) - d->channels = uchar(data.at(pos)); - pos += 1; - - // *Pre-skip* (16 bits, unsigned, little endian) - const ushort preSkip = data.toUShort(pos, false); - pos += 2; - - // *Input Sample Rate* (32 bits, unsigned, little endian) - d->inputSampleRate = data.toUInt(pos, false); - pos += 4; - - // *Output Gain* (16 bits, signed, little endian) - pos += 2; - - // *Channel Mapping Family* (8 bits, unsigned) - pos += 1; - - const Ogg::PageHeader *first = d->file->firstPageHeader(); - const Ogg::PageHeader *last = d->file->lastPageHeader(); - - if(first && last) { - long long start = first->absoluteGranularPosition(); - long long end = last->absoluteGranularPosition(); - - if(start >= 0 && end >= 0) - d->length = (int) ((end - start - preSkip) / 48000); - else { - debug("Opus::Properties::read() -- The PCM values for the start or " - "end of this file was incorrect."); - } - } - else - debug("Opus::Properties::read() -- Could not find valid first and last Ogg pages."); -} diff --git a/src/taglib/taglib/ogg/opus/opusproperties.h b/src/taglib/taglib/ogg/opus/opusproperties.h deleted file mode 100644 index 946f167..0000000 --- a/src/taglib/taglib/ogg/opus/opusproperties.h +++ /dev/null @@ -1,96 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OPUSPROPERTIES_H -#define TAGLIB_OPUSPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace Ogg { - - namespace Opus { - - class File; - - //! An implementation of audio property reading for Ogg Opus - - /*! - * This reads the data from an Ogg Opus stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of Opus::Properties with the data read from the - * Opus::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this Opus::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * The Opus codec supports decoding at multiple sample rates, there is no - * single sample rate of the encoded stream. This returns the sample rate - * of the original audio stream. - */ - int inputSampleRate() const; - - /*! - * Returns the Opus version, currently "0" (as specified by the spec). - */ - int opusVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - } -} - -#endif diff --git a/src/taglib/taglib/ogg/speex/speexfile.cpp b/src/taglib/taglib/ogg/speex/speexfile.cpp deleted file mode 100644 index e83f0ad..0000000 --- a/src/taglib/taglib/ogg/speex/speexfile.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> -#include <tpropertymap.h> - -#include "speexfile.h" - -using namespace TagLib; -using namespace TagLib::Ogg; - -class Speex::File::FilePrivate -{ -public: - FilePrivate() : - comment(0), - properties(0) {} - - ~FilePrivate() - { - delete comment; - delete properties; - } - - Ogg::XiphComment *comment; - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Speex::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : Ogg::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Speex::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : Ogg::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Speex::File::~File() -{ - delete d; -} - -Ogg::XiphComment *Speex::File::tag() const -{ - return d->comment; -} - -PropertyMap Speex::File::properties() const -{ - return d->comment->properties(); -} - -PropertyMap Speex::File::setProperties(const PropertyMap &properties) -{ - return d->comment->setProperties(properties); -} - -Speex::Properties *Speex::File::audioProperties() const -{ - return d->properties; -} - -bool Speex::File::save() -{ - if(!d->comment) - d->comment = new Ogg::XiphComment; - - setPacket(1, d->comment->render()); - - return Ogg::File::save(); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Speex::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - ByteVector speexHeaderData = packet(0); - - if(!speexHeaderData.startsWith("Speex ")) { - debug("Speex::File::read() -- invalid Speex identification header"); - return; - } - - ByteVector commentHeaderData = packet(1); - - d->comment = new Ogg::XiphComment(commentHeaderData); - - if(readProperties) - d->properties = new Properties(this, propertiesStyle); -} diff --git a/src/taglib/taglib/ogg/speex/speexfile.h b/src/taglib/taglib/ogg/speex/speexfile.h deleted file mode 100644 index 880e689..0000000 --- a/src/taglib/taglib/ogg/speex/speexfile.h +++ /dev/null @@ -1,126 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_SPEEXFILE_H -#define TAGLIB_SPEEXFILE_H - -#include "oggfile.h" -#include "xiphcomment.h" - -#include "speexproperties.h" - -namespace TagLib { - - namespace Ogg { - - //! A namespace containing classes for Speex metadata - - namespace Speex { - - //! An implementation of Ogg::File with Speex specific methods - - /*! - * This is the central class in the Ogg Speex metadata processing collection - * of classes. It's built upon Ogg::File which handles processing of the Ogg - * logical bitstream and breaking it down into pages which are handled by - * the codec implementations, in this case Speex specifically. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Constructs a Speex file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a Speex file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the XiphComment for this file. XiphComment implements the tag - * interface, so this serves as the reimplementation of - * TagLib::File::tag(). - */ - virtual Ogg::XiphComment *tag() const; - - /*! - * Implements the unified property interface -- export function. - * This forwards directly to XiphComment::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified tag dictionary interface -- import function. - * Like properties(), this is a forwarder to the file's XiphComment. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the Speex::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - - - virtual bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - class FilePrivate; - FilePrivate *d; - }; - } - } -} - -#endif diff --git a/src/taglib/taglib/ogg/speex/speexproperties.cpp b/src/taglib/taglib/ogg/speex/speexproperties.cpp deleted file mode 100644 index 5aaa915..0000000 --- a/src/taglib/taglib/ogg/speex/speexproperties.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include <oggpageheader.h> - -#include "speexproperties.h" -#include "speexfile.h" - -using namespace TagLib; -using namespace TagLib::Ogg; - -class Speex::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(File *f, ReadStyle s) : - file(f), - style(s), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - speexVersion(0), - vbr(false), - mode(0) {} - - File *file; - ReadStyle style; - int length; - int bitrate; - int sampleRate; - int channels; - int speexVersion; - bool vbr; - int mode; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Speex::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(file, style); - read(); -} - -Speex::Properties::~Properties() -{ - delete d; -} - -int Speex::Properties::length() const -{ - return d->length; -} - -int Speex::Properties::bitrate() const -{ - return int(float(d->bitrate) / float(1000) + 0.5); -} - -int Speex::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int Speex::Properties::channels() const -{ - return d->channels; -} - -int Speex::Properties::speexVersion() const -{ - return d->speexVersion; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Speex::Properties::read() -{ - // Get the identification header from the Ogg implementation. - - ByteVector data = d->file->packet(0); - - uint pos = 28; - - // speex_version_id; /**< Version for Speex (for checking compatibility) */ - d->speexVersion = data.toUInt(pos, false); - pos += 4; - - // header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */ - pos += 4; - - // rate; /**< Sampling rate used */ - d->sampleRate = data.toUInt(pos, false); - pos += 4; - - // mode; /**< Mode used (0 for narrowband, 1 for wideband) */ - d->mode = data.toUInt(pos, false); - pos += 4; - - // mode_bitstream_version; /**< Version ID of the bit-stream */ - pos += 4; - - // nb_channels; /**< Number of channels encoded */ - d->channels = data.toUInt(pos, false); - pos += 4; - - // bitrate; /**< Bit-rate used */ - d->bitrate = data.toUInt(pos, false); - pos += 4; - - // frame_size; /**< Size of frames */ - // unsigned int frameSize = data.mid(pos, 4).toUInt(false); - pos += 4; - - // vbr; /**< 1 for a VBR encoding, 0 otherwise */ - d->vbr = data.toUInt(pos, false) == 1; - pos += 4; - - // frames_per_packet; /**< Number of frames stored per Ogg packet */ - // unsigned int framesPerPacket = data.mid(pos, 4).toUInt(false); - - const Ogg::PageHeader *first = d->file->firstPageHeader(); - const Ogg::PageHeader *last = d->file->lastPageHeader(); - - if(first && last) { - long long start = first->absoluteGranularPosition(); - long long end = last->absoluteGranularPosition(); - - if(start >= 0 && end >= 0 && d->sampleRate > 0) - d->length = (int) ((end - start) / (long long) d->sampleRate); - else - debug("Speex::Properties::read() -- Either the PCM values for the start or " - "end of this file was incorrect or the sample rate is zero."); - } - else - debug("Speex::Properties::read() -- Could not find valid first and last Ogg pages."); -} diff --git a/src/taglib/taglib/ogg/speex/speexproperties.h b/src/taglib/taglib/ogg/speex/speexproperties.h deleted file mode 100644 index 4720bd8..0000000 --- a/src/taglib/taglib/ogg/speex/speexproperties.h +++ /dev/null @@ -1,89 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_SPEEXPROPERTIES_H -#define TAGLIB_SPEEXPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace Ogg { - - namespace Speex { - - class File; - - //! An implementation of audio property reading for Ogg Speex - - /*! - * This reads the data from an Ogg Speex stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of Speex::Properties with the data read from the - * Speex::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this Speex::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns the Speex version, currently "0" (as specified by the spec). - */ - int speexVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - } -} - -#endif diff --git a/src/taglib/taglib/ogg/vorbis/vorbisfile.cpp b/src/taglib/taglib/ogg/vorbis/vorbisfile.cpp deleted file mode 100644 index 8298453..0000000 --- a/src/taglib/taglib/ogg/vorbis/vorbisfile.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> -#include <tpropertymap.h> - -#include "vorbisfile.h" - - -using namespace TagLib; - -class Vorbis::File::FilePrivate -{ -public: - FilePrivate() : - comment(0), - properties(0) {} - - ~FilePrivate() - { - delete comment; - delete properties; - } - - Ogg::XiphComment *comment; - Properties *properties; -}; - -namespace TagLib { - /*! - * Vorbis headers can be found with one type ID byte and the string "vorbis" in - * an Ogg stream. 0x03 indicates the comment header. - */ - static const char vorbisCommentHeaderID[] = { 0x03, 'v', 'o', 'r', 'b', 'i', 's', 0 }; -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Vorbis::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : Ogg::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Vorbis::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : Ogg::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Vorbis::File::~File() -{ - delete d; -} - -Ogg::XiphComment *Vorbis::File::tag() const -{ - return d->comment; -} - -PropertyMap Vorbis::File::properties() const -{ - return d->comment->properties(); -} - -PropertyMap Vorbis::File::setProperties(const PropertyMap &properties) -{ - return d->comment->setProperties(properties); -} - -Vorbis::Properties *Vorbis::File::audioProperties() const -{ - return d->properties; -} - -bool Vorbis::File::save() -{ - ByteVector v(vorbisCommentHeaderID); - - if(!d->comment) - d->comment = new Ogg::XiphComment; - v.append(d->comment->render()); - - setPacket(1, v); - - return Ogg::File::save(); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Vorbis::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - ByteVector commentHeaderData = packet(1); - - if(commentHeaderData.mid(0, 7) != vorbisCommentHeaderID) { - debug("Vorbis::File::read() - Could not find the Vorbis comment header."); - setValid(false); - return; - } - - d->comment = new Ogg::XiphComment(commentHeaderData.mid(7)); - - if(readProperties) - d->properties = new Properties(this, propertiesStyle); -} diff --git a/src/taglib/taglib/ogg/vorbis/vorbisfile.h b/src/taglib/taglib/ogg/vorbis/vorbisfile.h deleted file mode 100644 index 7735a11..0000000 --- a/src/taglib/taglib/ogg/vorbis/vorbisfile.h +++ /dev/null @@ -1,144 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISFILE_H -#define TAGLIB_VORBISFILE_H - -#include "taglib_export.h" -#include "oggfile.h" -#include "xiphcomment.h" - -#include "vorbisproperties.h" - -namespace TagLib { - -/* - * This is just to make this appear to be in the Ogg namespace in the - * documentation. The typedef below will make this work with the current code. - * In the next BIC version of TagLib this will be really moved into the Ogg - * namespace. - */ - -#ifdef DOXYGEN - namespace Ogg { -#endif - - //! A namespace containing classes for Vorbis metadata - - namespace Vorbis { - - - //! An implementation of Ogg::File with Vorbis specific methods - - /*! - * This is the central class in the Ogg Vorbis metadata processing collection - * of classes. It's built upon Ogg::File which handles processing of the Ogg - * logical bitstream and breaking it down into pages which are handled by - * the codec implementations, in this case Vorbis specifically. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Constructs a Vorbis file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a Vorbis file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the XiphComment for this file. XiphComment implements the tag - * interface, so this serves as the reimplementation of - * TagLib::File::tag(). - */ - virtual Ogg::XiphComment *tag() const; - - - /*! - * Implements the unified property interface -- export function. - * This forwards directly to XiphComment::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified tag dictionary interface -- import function. - * Like properties(), this is a forwarder to the file's XiphComment. - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the Vorbis::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - virtual bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - class FilePrivate; - FilePrivate *d; - }; - } - -/* - * To keep compatibility with the current version put Vorbis in the Ogg namespace - * only in the docs and provide a typedef to make it work. In the next BIC - * version this will be removed and it will only exist in the Ogg namespace. - */ - -#ifdef DOXYGEN - } -#else - namespace Ogg { namespace Vorbis { typedef TagLib::Vorbis::File File; } } -#endif - -} - -#endif diff --git a/src/taglib/taglib/ogg/vorbis/vorbisproperties.cpp b/src/taglib/taglib/ogg/vorbis/vorbisproperties.cpp deleted file mode 100644 index b5e88bf..0000000 --- a/src/taglib/taglib/ogg/vorbis/vorbisproperties.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include <oggpageheader.h> - -#include "vorbisproperties.h" -#include "vorbisfile.h" - -using namespace TagLib; - -class Vorbis::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(File *f, ReadStyle s) : - file(f), - style(s), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - vorbisVersion(0), - bitrateMaximum(0), - bitrateNominal(0), - bitrateMinimum(0) {} - - File *file; - ReadStyle style; - int length; - int bitrate; - int sampleRate; - int channels; - int vorbisVersion; - int bitrateMaximum; - int bitrateNominal; - int bitrateMinimum; -}; - -namespace TagLib { - /*! - * Vorbis headers can be found with one type ID byte and the string "vorbis" in - * an Ogg stream. 0x01 indicates the setup header. - */ - static const char vorbisSetupHeaderID[] = { 0x01, 'v', 'o', 'r', 'b', 'i', 's', 0 }; -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Vorbis::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(file, style); - read(); -} - -Vorbis::Properties::~Properties() -{ - delete d; -} - -int Vorbis::Properties::length() const -{ - return d->length; -} - -int Vorbis::Properties::bitrate() const -{ - return int(float(d->bitrate) / float(1000) + 0.5); -} - -int Vorbis::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int Vorbis::Properties::channels() const -{ - return d->channels; -} - -int Vorbis::Properties::vorbisVersion() const -{ - return d->vorbisVersion; -} - -int Vorbis::Properties::bitrateMaximum() const -{ - return d->bitrateMaximum; -} - -int Vorbis::Properties::bitrateNominal() const -{ - return d->bitrateNominal; -} - -int Vorbis::Properties::bitrateMinimum() const -{ - return d->bitrateMinimum; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Vorbis::Properties::read() -{ - // Get the identification header from the Ogg implementation. - - ByteVector data = d->file->packet(0); - - uint pos = 0; - - if(data.mid(pos, 7) != vorbisSetupHeaderID) { - debug("Vorbis::Properties::read() -- invalid Vorbis identification header"); - return; - } - - pos += 7; - - d->vorbisVersion = data.toUInt(pos, false); - pos += 4; - - d->channels = uchar(data[pos]); - pos += 1; - - d->sampleRate = data.toUInt(pos, false); - pos += 4; - - d->bitrateMaximum = data.toUInt(pos, false); - pos += 4; - - d->bitrateNominal = data.toUInt(pos, false); - pos += 4; - - d->bitrateMinimum = data.toUInt(pos, false); - - // TODO: Later this should be only the "fast" mode. - d->bitrate = d->bitrateNominal; - - // Find the length of the file. See http://wiki.xiph.org/VorbisStreamLength/ - // for my notes on the topic. - - const Ogg::PageHeader *first = d->file->firstPageHeader(); - const Ogg::PageHeader *last = d->file->lastPageHeader(); - - if(first && last) { - long long start = first->absoluteGranularPosition(); - long long end = last->absoluteGranularPosition(); - - if(start >= 0 && end >= 0 && d->sampleRate > 0) - d->length = (int)((end - start) / (long long) d->sampleRate); - else - debug("Vorbis::Properties::read() -- Either the PCM values for the start or " - "end of this file was incorrect or the sample rate is zero."); - } - else - debug("Vorbis::Properties::read() -- Could not find valid first and last Ogg pages."); -} diff --git a/src/taglib/taglib/ogg/vorbis/vorbisproperties.h b/src/taglib/taglib/ogg/vorbis/vorbisproperties.h deleted file mode 100644 index de46985..0000000 --- a/src/taglib/taglib/ogg/vorbis/vorbisproperties.h +++ /dev/null @@ -1,125 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISPROPERTIES_H -#define TAGLIB_VORBISPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - -/* - * This is just to make this appear to be in the Ogg namespace in the - * documentation. The typedef below will make this work with the current code. - * In the next BIC version of TagLib this will be really moved into the Ogg - * namespace. - */ - -#ifdef DOXYGEN - namespace Ogg { -#endif - - namespace Vorbis { - - class File; - - //! An implementation of audio property reading for Ogg Vorbis - - /*! - * This reads the data from an Ogg Vorbis stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of Vorbis::Properties with the data read from the - * Vorbis::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this VorbisProperties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns the Vorbis version, currently "0" (as specified by the spec). - */ - int vorbisVersion() const; - - /*! - * Returns the maximum bitrate as read from the Vorbis identification - * header. - */ - int bitrateMaximum() const; - - /*! - * Returns the nominal bitrate as read from the Vorbis identification - * header. - */ - int bitrateNominal() const; - - /*! - * Returns the minimum bitrate as read from the Vorbis identification - * header. - */ - int bitrateMinimum() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - -/* - * To keep compatibility with the current version put Vorbis in the Ogg namespace - * only in the docs and provide a typedef to make it work. In the next BIC - * version this will be removed and it will only exist in the Ogg namespace. - */ - -#ifdef DOXYGEN - } -#else - namespace Ogg { namespace Vorbis { typedef TagLib::AudioProperties AudioProperties; } } -#endif - -} - -#endif diff --git a/src/taglib/taglib/ogg/xiphcomment.cpp b/src/taglib/taglib/ogg/xiphcomment.cpp deleted file mode 100644 index 51c2f9f..0000000 --- a/src/taglib/taglib/ogg/xiphcomment.cpp +++ /dev/null @@ -1,382 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tdebug.h> - -#include <xiphcomment.h> -#include <tpropertymap.h> - -using namespace TagLib; - -class Ogg::XiphComment::XiphCommentPrivate -{ -public: - FieldListMap fieldListMap; - String vendorID; - String commentField; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::XiphComment::XiphComment() : TagLib::Tag() -{ - d = new XiphCommentPrivate; -} - -Ogg::XiphComment::XiphComment(const ByteVector &data) : TagLib::Tag() -{ - d = new XiphCommentPrivate; - parse(data); -} - -Ogg::XiphComment::~XiphComment() -{ - delete d; -} - -String Ogg::XiphComment::title() const -{ - if(d->fieldListMap["TITLE"].isEmpty()) - return String::null; - return d->fieldListMap["TITLE"].front(); -} - -String Ogg::XiphComment::artist() const -{ - if(d->fieldListMap["ARTIST"].isEmpty()) - return String::null; - return d->fieldListMap["ARTIST"].front(); -} - -String Ogg::XiphComment::album() const -{ - if(d->fieldListMap["ALBUM"].isEmpty()) - return String::null; - return d->fieldListMap["ALBUM"].front(); -} - -String Ogg::XiphComment::comment() const -{ - if(!d->fieldListMap["DESCRIPTION"].isEmpty()) { - d->commentField = "DESCRIPTION"; - return d->fieldListMap["DESCRIPTION"].front(); - } - - if(!d->fieldListMap["COMMENT"].isEmpty()) { - d->commentField = "COMMENT"; - return d->fieldListMap["COMMENT"].front(); - } - - return String::null; -} - -String Ogg::XiphComment::genre() const -{ - if(d->fieldListMap["GENRE"].isEmpty()) - return String::null; - return d->fieldListMap["GENRE"].front(); -} - -TagLib::uint Ogg::XiphComment::year() const -{ - if(!d->fieldListMap["DATE"].isEmpty()) - return d->fieldListMap["DATE"].front().toInt(); - if(!d->fieldListMap["YEAR"].isEmpty()) - return d->fieldListMap["YEAR"].front().toInt(); - return 0; -} - -TagLib::uint Ogg::XiphComment::track() const -{ - if(!d->fieldListMap["TRACKNUMBER"].isEmpty()) - return d->fieldListMap["TRACKNUMBER"].front().toInt(); - if(!d->fieldListMap["TRACKNUM"].isEmpty()) - return d->fieldListMap["TRACKNUM"].front().toInt(); - return 0; -} - -void Ogg::XiphComment::setTitle(const String &s) -{ - addField("TITLE", s); -} - -void Ogg::XiphComment::setArtist(const String &s) -{ - addField("ARTIST", s); -} - -void Ogg::XiphComment::setAlbum(const String &s) -{ - addField("ALBUM", s); -} - -void Ogg::XiphComment::setComment(const String &s) -{ - addField(d->commentField.isEmpty() ? "DESCRIPTION" : d->commentField, s); -} - -void Ogg::XiphComment::setGenre(const String &s) -{ - addField("GENRE", s); -} - -void Ogg::XiphComment::setYear(uint i) -{ - removeField("YEAR"); - if(i == 0) - removeField("DATE"); - else - addField("DATE", String::number(i)); -} - -void Ogg::XiphComment::setTrack(uint i) -{ - removeField("TRACKNUM"); - if(i == 0) - removeField("TRACKNUMBER"); - else - addField("TRACKNUMBER", String::number(i)); -} - -bool Ogg::XiphComment::isEmpty() const -{ - FieldListMap::ConstIterator it = d->fieldListMap.begin(); - for(; it != d->fieldListMap.end(); ++it) - if(!(*it).second.isEmpty()) - return false; - - return true; -} - -TagLib::uint Ogg::XiphComment::fieldCount() const -{ - uint count = 0; - - FieldListMap::ConstIterator it = d->fieldListMap.begin(); - for(; it != d->fieldListMap.end(); ++it) - count += (*it).second.size(); - - return count; -} - -const Ogg::FieldListMap &Ogg::XiphComment::fieldListMap() const -{ - return d->fieldListMap; -} - -PropertyMap Ogg::XiphComment::properties() const -{ - return d->fieldListMap; -} - -PropertyMap Ogg::XiphComment::setProperties(const PropertyMap &properties) -{ - // check which keys are to be deleted - StringList toRemove; - for(FieldListMap::ConstIterator it = d->fieldListMap.begin(); it != d->fieldListMap.end(); ++it) - if (!properties.contains(it->first)) - toRemove.append(it->first); - - for(StringList::ConstIterator it = toRemove.begin(); it != toRemove.end(); ++it) - removeField(*it); - - // now go through keys in \a properties and check that the values match those in the xiph comment - PropertyMap invalid; - PropertyMap::ConstIterator it = properties.begin(); - for(; it != properties.end(); ++it) - { - if(!checkKey(it->first)) - invalid.insert(it->first, it->second); - else if(!d->fieldListMap.contains(it->first) || !(it->second == d->fieldListMap[it->first])) { - const StringList &sl = it->second; - if(sl.size() == 0) - // zero size string list -> remove the tag with all values - removeField(it->first); - else { - // replace all strings in the list for the tag - StringList::ConstIterator valueIterator = sl.begin(); - addField(it->first, *valueIterator, true); - ++valueIterator; - for(; valueIterator != sl.end(); ++valueIterator) - addField(it->first, *valueIterator, false); - } - } - } - return invalid; -} - -bool Ogg::XiphComment::checkKey(const String &key) -{ - if(key.size() < 1) - return false; - for(String::ConstIterator it = key.begin(); it != key.end(); it++) - // forbid non-printable, non-ascii, '=' (#61) and '~' (#126) - if (*it < 32 || *it >= 128 || *it == 61 || *it == 126) - return false; - return true; -} - -String Ogg::XiphComment::vendorID() const -{ - return d->vendorID; -} - -void Ogg::XiphComment::addField(const String &key, const String &value, bool replace) -{ - if(replace) - removeField(key.upper()); - - if(!key.isEmpty() && !value.isEmpty()) - d->fieldListMap[key.upper()].append(value); -} - -void Ogg::XiphComment::removeField(const String &key, const String &value) -{ - if(!value.isNull()) { - StringList::Iterator it = d->fieldListMap[key].begin(); - while(it != d->fieldListMap[key].end()) { - if(value == *it) - it = d->fieldListMap[key].erase(it); - else - it++; - } - } - else - d->fieldListMap.erase(key); -} - -bool Ogg::XiphComment::contains(const String &key) const -{ - return d->fieldListMap.contains(key) && !d->fieldListMap[key].isEmpty(); -} - -ByteVector Ogg::XiphComment::render() const -{ - return render(true); -} - -ByteVector Ogg::XiphComment::render(bool addFramingBit) const -{ - ByteVector data; - - // Add the vendor ID length and the vendor ID. It's important to use the - // length of the data(String::UTF8) rather than the length of the the string - // since this is UTF8 text and there may be more characters in the data than - // in the UTF16 string. - - ByteVector vendorData = d->vendorID.data(String::UTF8); - - data.append(ByteVector::fromUInt(vendorData.size(), false)); - data.append(vendorData); - - // Add the number of fields. - - data.append(ByteVector::fromUInt(fieldCount(), false)); - - // Iterate over the the field lists. Our iterator returns a - // std::pair<String, StringList> where the first String is the field name and - // the StringList is the values associated with that field. - - FieldListMap::ConstIterator it = d->fieldListMap.begin(); - for(; it != d->fieldListMap.end(); ++it) { - - // And now iterate over the values of the current list. - - String fieldName = (*it).first; - StringList values = (*it).second; - - StringList::ConstIterator valuesIt = values.begin(); - for(; valuesIt != values.end(); ++valuesIt) { - ByteVector fieldData = fieldName.data(String::UTF8); - fieldData.append('='); - fieldData.append((*valuesIt).data(String::UTF8)); - - data.append(ByteVector::fromUInt(fieldData.size(), false)); - data.append(fieldData); - } - } - - // Append the "framing bit". - - if(addFramingBit) - data.append(char(1)); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void Ogg::XiphComment::parse(const ByteVector &data) -{ - // The first thing in the comment data is the vendor ID length, followed by a - // UTF8 string with the vendor ID. - - uint pos = 0; - - const uint vendorLength = data.toUInt(0, false); - pos += 4; - - d->vendorID = String(data.mid(pos, vendorLength), String::UTF8); - pos += vendorLength; - - // Next the number of fields in the comment vector. - - const uint commentFields = data.toUInt(pos, false); - pos += 4; - - if(commentFields > (data.size() - 8) / 4) { - return; - } - - for(uint i = 0; i < commentFields; i++) { - - // Each comment field is in the format "KEY=value" in a UTF8 string and has - // 4 bytes before the text starts that gives the length. - - const uint commentLength = data.toUInt(pos, false); - pos += 4; - - String comment = String(data.mid(pos, commentLength), String::UTF8); - pos += commentLength; - if(pos > data.size()) { - break; - } - - int commentSeparatorPosition = comment.find("="); - if(commentSeparatorPosition == -1) { - break; - } - - String key = comment.substr(0, commentSeparatorPosition); - String value = comment.substr(commentSeparatorPosition + 1); - - addField(key, value, false); - } -} diff --git a/src/taglib/taglib/ogg/xiphcomment.h b/src/taglib/taglib/ogg/xiphcomment.h deleted file mode 100644 index 54f3070..0000000 --- a/src/taglib/taglib/ogg/xiphcomment.h +++ /dev/null @@ -1,225 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISCOMMENT_H -#define TAGLIB_VORBISCOMMENT_H - -#include "tag.h" -#include "tlist.h" -#include "tmap.h" -#include "tstring.h" -#include "tstringlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace Ogg { - - /*! - * A mapping between a list of field names, or keys, and a list of values - * associated with that field. - * - * \see XiphComment::fieldListMap() - */ - typedef Map<String, StringList> FieldListMap; - - //! Ogg Vorbis comment implementation - - /*! - * This class is an implementation of the Ogg Vorbis comment specification, - * to be found in section 5 of the Ogg Vorbis specification. Because this - * format is also used in other (currently unsupported) Xiph.org formats, it - * has been made part of a generic implementation rather than being limited - * to strictly Vorbis. - * - * Vorbis comments are a simple vector of keys and values, called fields. - * Multiple values for a given key are supported. - * - * \see fieldListMap() - */ - - class TAGLIB_EXPORT XiphComment : public TagLib::Tag - { - public: - /*! - * Constructs an empty Vorbis comment. - */ - XiphComment(); - - /*! - * Constructs a Vorbis comment from \a data. - */ - XiphComment(const ByteVector &data); - - /*! - * Destroys this instance of the XiphComment. - */ - virtual ~XiphComment(); - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - - virtual bool isEmpty() const; - - /*! - * Returns the number of fields present in the comment. - */ - uint fieldCount() const; - - /*! - * Returns a reference to the map of field lists. Because Xiph comments - * support multiple fields with the same key, a pure Map would not work. - * As such this is a Map of string lists, keyed on the comment field name. - * - * The standard set of Xiph/Vorbis fields (which may or may not be - * contained in any specific comment) is: - * - * <ul> - * <li>TITLE</li> - * <li>VERSION</li> - * <li>ALBUM</li> - * <li>ARTIST</li> - * <li>PERFORMER</li> - * <li>COPYRIGHT</li> - * <li>ORGANIZATION</li> - * <li>DESCRIPTION</li> - * <li>GENRE</li> - * <li>DATE</li> - * <li>LOCATION</li> - * <li>CONTACT</li> - * <li>ISRC</li> - * </ul> - * - * For a more detailed description of these fields, please see the Ogg - * Vorbis specification, section 5.2.2.1. - * - * \note The Ogg Vorbis comment specification does allow these key values - * to be either upper or lower case. However, it is conventional for them - * to be upper case. As such, TagLib, when parsing a Xiph/Vorbis comment, - * converts all fields to uppercase. When you are using this data - * structure, you will need to specify the field name in upper case. - * - * \warning You should not modify this data structure directly, instead - * use addField() and removeField(). - */ - const FieldListMap &fieldListMap() const; - - /*! - * Implements the unified property interface -- export function. - * The result is a one-to-one match of the Xiph comment, since it is - * completely compatible with the property interface (in fact, a Xiph - * comment is nothing more than a map from tag names to list of values, - * as is the dict interface). - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * The tags from the given map will be stored one-to-one in the file, - * except for invalid keys (less than one character, non-ASCII, or - * containing '=' or '~') in which case the according values will - * be contained in the returned PropertyMap. - */ - PropertyMap setProperties(const PropertyMap&); - - /*! - * Check if the given String is a valid Xiph comment key. - */ - static bool checkKey(const String&); - - /*! - * Returns the vendor ID of the Ogg Vorbis encoder. libvorbis 1.0 as the - * most common case always returns "Xiph.Org libVorbis I 20020717". - */ - String vendorID() const; - - /*! - * Add the field specified by \a key with the data \a value. If \a replace - * is true, then all of the other fields with the same key will be removed - * first. - * - * If the field value is empty, the field will be removed. - */ - void addField(const String &key, const String &value, bool replace = true); - - /*! - * Remove the field specified by \a key with the data \a value. If - * \a value is null, all of the fields with the given key will be removed. - */ - void removeField(const String &key, const String &value = String::null); - - /*! - * Returns true if the field is contained within the comment. - * - * \note This is safer than checking for membership in the FieldListMap. - */ - bool contains(const String &key) const; - - /*! - * Renders the comment to a ByteVector suitable for inserting into a file. - */ - ByteVector render() const; // BIC: remove and merge with below - - /*! - * Renders the comment to a ByteVector suitable for inserting into a file. - * - * If \a addFramingBit is true the standard Vorbis comment framing bit will - * be appended. However some formats (notably FLAC) do not work with this - * in place. - */ - ByteVector render(bool addFramingBit) const; - - protected: - /*! - * Reads the tag from the file specified in the constructor and fills the - * FieldListMap. - */ - void parse(const ByteVector &data); - - private: - XiphComment(const XiphComment &); - XiphComment &operator=(const XiphComment &); - - class XiphCommentPrivate; - XiphCommentPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/riff/aiff/aifffile.cpp b/src/taglib/taglib/riff/aiff/aifffile.cpp deleted file mode 100644 index d20c148..0000000 --- a/src/taglib/taglib/riff/aiff/aifffile.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tdebug.h> -#include <id3v2tag.h> -#include <tstringlist.h> -#include <tpropertymap.h> - -#include "aifffile.h" - -using namespace TagLib; - -class RIFF::AIFF::File::FilePrivate -{ -public: - FilePrivate() : - properties(0), - tag(0), - tagChunkID("ID3 ") - { - - } - - ~FilePrivate() - { - delete properties; - delete tag; - } - - Properties *properties; - ID3v2::Tag *tag; - ByteVector tagChunkID; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::AIFF::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : RIFF::File(file, BigEndian) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -RIFF::AIFF::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : RIFF::File(stream, BigEndian) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -RIFF::AIFF::File::~File() -{ - delete d; -} - -ID3v2::Tag *RIFF::AIFF::File::tag() const -{ - return d->tag; -} - -PropertyMap RIFF::AIFF::File::properties() const -{ - return d->tag->properties(); -} - -void RIFF::AIFF::File::removeUnsupportedProperties(const StringList &unsupported) -{ - d->tag->removeUnsupportedProperties(unsupported); -} - -PropertyMap RIFF::AIFF::File::setProperties(const PropertyMap &properties) -{ - return d->tag->setProperties(properties); -} - - -RIFF::AIFF::Properties *RIFF::AIFF::File::audioProperties() const -{ - return d->properties; -} - -bool RIFF::AIFF::File::save() -{ - if(readOnly()) { - debug("RIFF::AIFF::File::save() -- File is read only."); - return false; - } - - if(!isValid()) { - debug("RIFF::AIFF::File::save() -- Trying to save invalid file."); - return false; - } - - setChunkData(d->tagChunkID, d->tag->render()); - - return true; -} - - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::AIFF::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - for(uint i = 0; i < chunkCount(); i++) { - if(chunkName(i) == "ID3 " || chunkName(i) == "id3 ") { - d->tagChunkID = chunkName(i); - d->tag = new ID3v2::Tag(this, chunkOffset(i)); - } - else if(chunkName(i) == "COMM" && readProperties) - d->properties = new Properties(chunkData(i), propertiesStyle); - } - - if(!d->tag) - d->tag = new ID3v2::Tag; -} diff --git a/src/taglib/taglib/riff/aiff/aifffile.h b/src/taglib/taglib/riff/aiff/aifffile.h deleted file mode 100644 index c75b94b..0000000 --- a/src/taglib/taglib/riff/aiff/aifffile.h +++ /dev/null @@ -1,142 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_AIFFFILE_H -#define TAGLIB_AIFFFILE_H - -#include "rifffile.h" -#include "id3v2tag.h" -#include "aiffproperties.h" - -namespace TagLib { - - namespace RIFF { - - //! An implementation of AIFF metadata - - /*! - * This is implementation of AIFF metadata. - * - * This supports an ID3v2 tag as well as reading stream from the ID3 RIFF - * chunk as well as properties from the file. - */ - - namespace AIFF { - - //! An implementation of TagLib::File with AIFF specific methods - - /*! - * This implements and provides an interface for AIFF files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to AIFF files. - */ - - class TAGLIB_EXPORT File : public TagLib::RIFF::File - { - public: - /*! - * Constructs an AIFF file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an AIFF file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. - * - * \note This always returns a valid pointer regardless of whether or not - * the file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file - * on disk actually has an ID3v2 tag. - * - * \see hasID3v2Tag() - */ - virtual ID3v2::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * This method forwards to ID3v2::Tag::properties(). - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * This method forwards to ID3v2::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the AIFF::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - class FilePrivate; - FilePrivate *d; - }; - } - } -} - -#endif diff --git a/src/taglib/taglib/riff/aiff/aiffproperties.cpp b/src/taglib/taglib/riff/aiff/aiffproperties.cpp deleted file mode 100644 index 18b973e..0000000 --- a/src/taglib/taglib/riff/aiff/aiffproperties.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <cmath> -// ldexp is a c99 function, which might not be defined in <cmath> -// so we pull in math.h too and hope it does the right (wrong) thing -// wrt. c99 functions in C++ -#include <math.h> - -#include "aiffproperties.h" - -//////////////////////////////////////////////////////////////////////////////// -// nasty 80-bit float helpers -//////////////////////////////////////////////////////////////////////////////// - -#define UnsignedToFloat(u) (((double)((long)(u - 2147483647L - 1))) + 2147483648.0) - -static double ConvertFromIeeeExtended(const TagLib::uchar *bytes) -{ - double f; - int expon; - unsigned long hiMant, loMant; - - expon = ((bytes[0] & 0x7F) << 8) | (bytes[1] & 0xFF); - - hiMant = ((unsigned long)(bytes[2] & 0xFF) << 24) | - ((unsigned long)(bytes[3] & 0xFF) << 16) | - ((unsigned long)(bytes[4] & 0xFF) << 8) | - ((unsigned long)(bytes[5] & 0xFF)); - - loMant = ((unsigned long)(bytes[6] & 0xFF) << 24) | - ((unsigned long)(bytes[7] & 0xFF) << 16) | - ((unsigned long)(bytes[8] & 0xFF) << 8) | - ((unsigned long)(bytes[9] & 0xFF)); - - if (expon == 0 && hiMant == 0 && loMant == 0) - f = 0; - else { - if(expon == 0x7FFF) /* Infinity or NaN */ - f = HUGE_VAL; - else { - expon -= 16383; - f = ldexp(UnsignedToFloat(hiMant), expon -= 31); - f += ldexp(UnsignedToFloat(loMant), expon -= 32); - } - } - - if(bytes[0] & 0x80) - return -f; - else - return f; -} - -using namespace TagLib; - -class RIFF::AIFF::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - sampleRate(0), - channels(0), - sampleWidth(0), - sampleFrames(0) - { - - } - - int length; - int bitrate; - int sampleRate; - int channels; - int sampleWidth; - uint sampleFrames; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::AIFF::Properties::Properties(const ByteVector &data, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate; - read(data); -} - -RIFF::AIFF::Properties::~Properties() -{ - delete d; -} - -int RIFF::AIFF::Properties::length() const -{ - return d->length; -} - -int RIFF::AIFF::Properties::bitrate() const -{ - return d->bitrate; -} - -int RIFF::AIFF::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int RIFF::AIFF::Properties::channels() const -{ - return d->channels; -} - -int RIFF::AIFF::Properties::sampleWidth() const -{ - return d->sampleWidth; -} - -TagLib::uint RIFF::AIFF::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::AIFF::Properties::read(const ByteVector &data) -{ - d->channels = data.toShort(0U); - d->sampleFrames = data.toUInt(2U); - d->sampleWidth = data.toShort(6U); - double sampleRate = ConvertFromIeeeExtended(reinterpret_cast<const uchar *>(data.data() + 8)); - d->sampleRate = (int)sampleRate; - d->bitrate = (int)((sampleRate * d->sampleWidth * d->channels) / 1000.0); - d->length = d->sampleRate > 0 ? d->sampleFrames / d->sampleRate : 0; -} diff --git a/src/taglib/taglib/riff/aiff/aiffproperties.h b/src/taglib/taglib/riff/aiff/aiffproperties.h deleted file mode 100644 index 68e90b7..0000000 --- a/src/taglib/taglib/riff/aiff/aiffproperties.h +++ /dev/null @@ -1,83 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_AIFFPROPERTIES_H -#define TAGLIB_AIFFPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace RIFF { - - namespace AIFF { - - class File; - - //! An implementation of audio property reading for AIFF - - /*! - * This reads the data from an AIFF stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of AIFF::Properties with the data read from the - * ByteVector \a data. - */ - Properties(const ByteVector &data, ReadStyle style); - - /*! - * Destroys this AIFF::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - int sampleWidth() const; - uint sampleFrames() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(const ByteVector &data); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - } -} - -#endif diff --git a/src/taglib/taglib/riff/rifffile.cpp b/src/taglib/taglib/riff/rifffile.cpp deleted file mode 100644 index a39fce6..0000000 --- a/src/taglib/taglib/riff/rifffile.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tdebug.h> -#include <tstring.h> - -#include "rifffile.h" -#include <algorithm> -#include <vector> - -using namespace TagLib; - -struct Chunk -{ - ByteVector name; - TagLib::uint offset; - TagLib::uint size; - char padding; -}; - -class RIFF::File::FilePrivate -{ -public: - FilePrivate() : - endianness(BigEndian), - size(0) - { - - } - Endianness endianness; - ByteVector type; - TagLib::uint size; - ByteVector format; - - std::vector<Chunk> chunks; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::File::~File() -{ - delete d; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::File::File(FileName file, Endianness endianness) : TagLib::File(file) -{ - d = new FilePrivate; - d->endianness = endianness; - - if(isOpen()) - read(); -} - -RIFF::File::File(IOStream *stream, Endianness endianness) : TagLib::File(stream) -{ - d = new FilePrivate; - d->endianness = endianness; - - if(isOpen()) - read(); -} - -TagLib::uint RIFF::File::riffSize() const -{ - return d->size; -} - -TagLib::uint RIFF::File::chunkCount() const -{ - return d->chunks.size(); -} - -TagLib::uint RIFF::File::chunkDataSize(uint i) const -{ - return d->chunks[i].size; -} - -TagLib::uint RIFF::File::chunkOffset(uint i) const -{ - return d->chunks[i].offset; -} - -TagLib::uint RIFF::File::chunkPadding(uint i) const -{ - return d->chunks[i].padding; -} - -ByteVector RIFF::File::chunkName(uint i) const -{ - if(i >= chunkCount()) - return ByteVector::null; - - return d->chunks[i].name; -} - -ByteVector RIFF::File::chunkData(uint i) -{ - if(i >= chunkCount()) - return ByteVector::null; - - // Offset for the first subchunk's data - - long begin = 12 + 8; - - for(uint it = 0; it < i; it++) - begin += 8 + d->chunks[it].size + d->chunks[it].padding; - - seek(begin); - - return readBlock(d->chunks[i].size); -} - -void RIFF::File::setChunkData(uint i, const ByteVector &data) -{ - // First we update the global size - - d->size += ((data.size() + 1) & ~1) - (d->chunks[i].size + d->chunks[i].padding); - insert(ByteVector::fromUInt(d->size, d->endianness == BigEndian), 4, 4); - - // Now update the specific chunk - - writeChunk(chunkName(i), data, d->chunks[i].offset - 8, d->chunks[i].size + d->chunks[i].padding + 8); - - d->chunks[i].size = data.size(); - d->chunks[i].padding = (data.size() & 0x01) ? 1 : 0; - - // Now update the internal offsets - - for(i++; i < d->chunks.size(); i++) - d->chunks[i].offset = d->chunks[i-1].offset + 8 + d->chunks[i-1].size + d->chunks[i-1].padding; -} - -void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data) -{ - setChunkData(name, data, false); -} - -void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data, bool alwaysCreate) -{ - if(d->chunks.size() == 0) { - debug("RIFF::File::setChunkData - No valid chunks found."); - return; - } - - if(alwaysCreate && name != "LIST") { - debug("RIFF::File::setChunkData - alwaysCreate should be used for only \"LIST\" chunks."); - return; - } - - if(!alwaysCreate) { - for(uint i = 0; i < d->chunks.size(); i++) { - if(d->chunks[i].name == name) { - setChunkData(i, data); - return; - } - } - } - - // Couldn't find an existing chunk, so let's create a new one. - - uint i = d->chunks.size() - 1; - ulong offset = d->chunks[i].offset + d->chunks[i].size; - - // First we update the global size - - d->size += (offset & 1) + data.size() + 8; - insert(ByteVector::fromUInt(d->size, d->endianness == BigEndian), 4, 4); - - // Now add the chunk to the file - - writeChunk(name, data, offset, std::max<long>(0, length() - offset), (offset & 1) ? 1 : 0); - - // And update our internal structure - - if (offset & 1) { - d->chunks[i].padding = 1; - offset++; - } - - Chunk chunk; - chunk.name = name; - chunk.size = data.size(); - chunk.offset = offset + 8; - chunk.padding = (data.size() & 0x01) ? 1 : 0; - - d->chunks.push_back(chunk); -} - -void RIFF::File::removeChunk(uint i) -{ - if(i >= d->chunks.size()) - return; - - removeBlock(d->chunks[i].offset - 8, d->chunks[i].size + 8); - d->chunks.erase(d->chunks.begin() + i); -} - -void RIFF::File::removeChunk(const ByteVector &name) -{ - std::vector<Chunk> newChunks; - for(size_t i = 0; i < d->chunks.size(); ++i) { - if(d->chunks[i].name == name) - removeBlock(d->chunks[i].offset - 8, d->chunks[i].size + 8); - else - newChunks.push_back(d->chunks[i]); - } - - d->chunks.swap(newChunks); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -static bool isValidChunkID(const ByteVector &name) -{ - if(name.size() != 4) { - return false; - } - for(int i = 0; i < 4; i++) { - if(name[i] < 32 || name[i] > 127) { - return false; - } - } - return true; -} - -void RIFF::File::read() -{ - bool bigEndian = (d->endianness == BigEndian); - - d->type = readBlock(4); - d->size = readBlock(4).toUInt(bigEndian); - d->format = readBlock(4); - - // + 8: chunk header at least, fix for additional junk bytes - while(tell() + 8 <= length()) { - ByteVector chunkName = readBlock(4); - uint chunkSize = readBlock(4).toUInt(bigEndian); - - if(!isValidChunkID(chunkName)) { - debug("RIFF::File::read() -- Chunk '" + chunkName + "' has invalid ID"); - setValid(false); - break; - } - - if(static_cast<ulonglong>(tell()) + chunkSize > static_cast<ulonglong>(length())) { - debug("RIFF::File::read() -- Chunk '" + chunkName + "' has invalid size (larger than the file size)"); - setValid(false); - break; - } - - Chunk chunk; - chunk.name = chunkName; - chunk.size = chunkSize; - chunk.offset = tell(); - - seek(chunk.size, Current); - - // check padding - chunk.padding = 0; - long uPosNotPadded = tell(); - if((uPosNotPadded & 0x01) != 0) { - ByteVector iByte = readBlock(1); - if((iByte.size() != 1) || (iByte[0] != 0)) { - // not well formed, re-seek - seek(uPosNotPadded, Beginning); - } - else { - chunk.padding = 1; - } - } - d->chunks.push_back(chunk); - - } -} - -void RIFF::File::writeChunk(const ByteVector &name, const ByteVector &data, - ulong offset, ulong replace, uint leadingPadding) -{ - ByteVector combined; - if(leadingPadding) { - combined.append(ByteVector(leadingPadding, '\x00')); - } - combined.append(name); - combined.append(ByteVector::fromUInt(data.size(), d->endianness == BigEndian)); - combined.append(data); - if((data.size() & 0x01) != 0) { - combined.append('\x00'); - } - insert(combined, offset, replace); -} diff --git a/src/taglib/taglib/riff/rifffile.h b/src/taglib/taglib/riff/rifffile.h deleted file mode 100644 index 6b8fe19..0000000 --- a/src/taglib/taglib/riff/rifffile.h +++ /dev/null @@ -1,157 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_RIFFFILE_H -#define TAGLIB_RIFFFILE_H - -#include "taglib_export.h" -#include "tfile.h" - -namespace TagLib { - - //! An implementation of TagLib::File with RIFF specific methods - - namespace RIFF { - - //! An RIFF file class with some useful methods specific to RIFF - - /*! - * This implements the generic TagLib::File API and additionally provides - * access to properties that are distinct to RIFF files, notably access - * to the different ID3 tags. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - protected: - - enum Endianness { BigEndian, LittleEndian }; - - File(FileName file, Endianness endianness); - File(IOStream *stream, Endianness endianness); - - /*! - * \return The size of the main RIFF chunk. - */ - uint riffSize() const; - - /*! - * \return The number of chunks in the file. - */ - uint chunkCount() const; - - /*! - * \return The offset within the file for the selected chunk number. - */ - uint chunkOffset(uint i) const; - - /*! - * \return The size of the chunk data. - */ - uint chunkDataSize(uint i) const; - - /*! - * \return The size of the padding after the chunk (can be either 0 or 1). - */ - uint chunkPadding(uint i) const; - - /*! - * \return The name of the specified chunk, for instance, "COMM" or "ID3 " - */ - ByteVector chunkName(uint i) const; - - /*! - * Reads the chunk data from the file and returns it. - * - * \note This \e will move the read pointer for the file. - */ - ByteVector chunkData(uint i); - - /*! - * Sets the data for the the specified chunk to \a data. - * - * \warning This will update the file immediately. - */ - void setChunkData(uint i, const ByteVector &data); - - /*! - * Sets the data for the chunk \a name to \a data. If a chunk with the - * given name already exists it will be overwritten, otherwise it will be - * created after the existing chunks. - * - * \warning This will update the file immediately. - */ - void setChunkData(const ByteVector &name, const ByteVector &data); - - /*! - * Sets the data for the chunk \a name to \a data. If a chunk with the - * given name already exists it will be overwritten, otherwise it will be - * created after the existing chunks. - * - * \note If \a alwaysCreate is true, a new chunk is created regardless of - * whether or not the chunk \a name exists. It should only be used for - * "LIST" chunks. - * - * \warning This will update the file immediately. - */ - void setChunkData(const ByteVector &name, const ByteVector &data, bool alwaysCreate); - - /*! - * Removes the specified chunk. - * - * \warning This will update the file immediately. - */ - void removeChunk(uint i); - - /*! - * Removes the chunk \a name. - * - * \warning This will update the file immediately. - * \warning This removes all the chunks with the given name. - */ - void removeChunk(const ByteVector &name); - - private: - File(const File &); - File &operator=(const File &); - - void read(); - void writeChunk(const ByteVector &name, const ByteVector &data, - ulong offset, ulong replace = 0, - uint leadingPadding = 0); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/riff/wav/infotag.cpp b/src/taglib/taglib/riff/wav/infotag.cpp deleted file mode 100644 index 09edfa5..0000000 --- a/src/taglib/taglib/riff/wav/infotag.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Tsuda Kageyu - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tfile.h> - -#include "infotag.h" - -using namespace TagLib; -using namespace RIFF::Info; - -namespace { - static bool isValidChunkID(const ByteVector &name) - { - if(name.size() != 4) - return false; - - for(int i = 0; i < 4; i++) { - if(name[i] < 32 || name[i] > 127) - return false; - } - - return true; - } -} - -class RIFF::Info::Tag::TagPrivate -{ -public: - TagPrivate() - {} - - FieldListMap fieldListMap; - - static const StringHandler *stringHandler; -}; - -//////////////////////////////////////////////////////////////////////////////// -// StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -StringHandler::StringHandler() -{ -} - -StringHandler::~StringHandler() -{ -} - -String RIFF::Info::StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::UTF8); -} - -ByteVector RIFF::Info::StringHandler::render(const String &s) const -{ - return s.data(String::UTF8); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -static const StringHandler defaultStringHandler; -const RIFF::Info::StringHandler *RIFF::Info::Tag::TagPrivate::stringHandler = &defaultStringHandler; - -RIFF::Info::Tag::Tag(const ByteVector &data) - : TagLib::Tag() - , d(new TagPrivate()) -{ - parse(data); -} - -RIFF::Info::Tag::Tag() - : TagLib::Tag() - , d(new TagPrivate()) -{ -} - -RIFF::Info::Tag::~Tag() -{ - delete d; -} - -String RIFF::Info::Tag::title() const -{ - return fieldText("INAM"); -} - -String RIFF::Info::Tag::artist() const -{ - return fieldText("IART"); -} - -String RIFF::Info::Tag::album() const -{ - return fieldText("IPRD"); -} - -String RIFF::Info::Tag::comment() const -{ - return fieldText("ICMT"); -} - -String RIFF::Info::Tag::genre() const -{ - return fieldText("IGNR"); -} - -TagLib::uint RIFF::Info::Tag::year() const -{ - return fieldText("ICRD").substr(0, 4).toInt(); -} - -TagLib::uint RIFF::Info::Tag::track() const -{ - return fieldText("IPRT").toInt(); -} - -void RIFF::Info::Tag::setTitle(const String &s) -{ - setFieldText("INAM", s); -} - -void RIFF::Info::Tag::setArtist(const String &s) -{ - setFieldText("IART", s); -} - -void RIFF::Info::Tag::setAlbum(const String &s) -{ - setFieldText("IPRD", s); -} - -void RIFF::Info::Tag::setComment(const String &s) -{ - setFieldText("ICMT", s); -} - -void RIFF::Info::Tag::setGenre(const String &s) -{ - setFieldText("IGNR", s); -} - -void RIFF::Info::Tag::setYear(uint i) -{ - if(i != 0) - setFieldText("ICRD", String::number(i)); - else - d->fieldListMap.erase("ICRD"); -} - -void RIFF::Info::Tag::setTrack(uint i) -{ - if(i != 0) - setFieldText("IPRT", String::number(i)); - else - d->fieldListMap.erase("IPRT"); -} - -bool RIFF::Info::Tag::isEmpty() const -{ - return d->fieldListMap.isEmpty(); -} - -FieldListMap RIFF::Info::Tag::fieldListMap() const -{ - return d->fieldListMap; -} - -String RIFF::Info::Tag::fieldText(const ByteVector &id) const -{ - if(d->fieldListMap.contains(id)) - return String(d->fieldListMap[id]); - else - return String(); -} - -void RIFF::Info::Tag::setFieldText(const ByteVector &id, const String &s) -{ - // id must be four-byte long pure ascii string. - if(!isValidChunkID(id)) - return; - - if(!s.isEmpty()) - d->fieldListMap[id] = s; - else - removeField(id); -} - -void RIFF::Info::Tag::removeField(const ByteVector &id) -{ - if(d->fieldListMap.contains(id)) - d->fieldListMap.erase(id); -} - -ByteVector RIFF::Info::Tag::render() const -{ - ByteVector data("INFO"); - - FieldListMap::ConstIterator it = d->fieldListMap.begin(); - for(; it != d->fieldListMap.end(); ++it) { - ByteVector text = TagPrivate::stringHandler->render(it->second); - if(text.isEmpty()) - continue; - - data.append(it->first); - data.append(ByteVector::fromUInt(text.size() + 1, false)); - data.append(text); - - do { - data.append('\0'); - } while(data.size() & 1); - } - - if(data.size() == 4) - return ByteVector(); - else - return data; -} - -void RIFF::Info::Tag::setStringHandler(const StringHandler *handler) -{ - if(handler) - TagPrivate::stringHandler = handler; - else - TagPrivate::stringHandler = &defaultStringHandler; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::Info::Tag::parse(const ByteVector &data) -{ - uint p = 4; - while(p < data.size()) { - const uint size = data.toUInt(p + 4, false); - d->fieldListMap[data.mid(p, 4)] = TagPrivate::stringHandler->parse(data.mid(p + 8, size)); - - p += ((size + 1) & ~1) + 8; - } -} - diff --git a/src/taglib/taglib/riff/wav/infotag.h b/src/taglib/taglib/riff/wav/infotag.h deleted file mode 100644 index 4007ae6..0000000 --- a/src/taglib/taglib/riff/wav/infotag.h +++ /dev/null @@ -1,192 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_INFOTAG_H -#define TAGLIB_INFOTAG_H - -#include "tag.h" -#include "tmap.h" -#include "tstring.h" -#include "tstringlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - class File; - - //! A RIFF Info tag implementation. - namespace RIFF { - namespace Info { - - typedef Map<ByteVector, String> FieldListMap; - - //! A abstraction for the string to data encoding in Info tags. - - /*! - * RIFF Info tag has no clear definitions about character encodings. - * In practice, local encoding of each system is largely used and UTF-8 is - * popular too. - * - * Here is an option to read and write tags in your preferrd encoding - * by subclassing this class, reimplementing parse() and render() and setting - * your reimplementation as the default with Info::Tag::setStringHandler(). - * - * \see ID3v1::Tag::setStringHandler() - */ - - class TAGLIB_EXPORT StringHandler - { - public: - StringHandler(); - ~StringHandler(); - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an UTF-8 character array. - */ - virtual String parse(const ByteVector &data) const; - - /*! - * Encode a ByteVector with the data from \a s. The default implementation - * assumes that \a s is an UTF-8 string. - */ - virtual ByteVector render(const String &s) const; - }; - - //! The main class in the ID3v2 implementation - - /*! - * This is the main class in the INFO tag implementation. RIFF INFO tag is a - * metadata format found in WAV audio and AVI video files. Though it is a part - * of Microsoft/IBM's RIFF specification, the author could not find the official - * documents about it. So, this implementation is referring to unofficial documents - * online and some applications' behaviors especially Windows Explorer. - */ - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Constructs an empty Info tag. - */ - Tag(); - - /*! - * Constructs an Info tag read from \a data which is contents of "LIST" chunk. - */ - Tag(const ByteVector &data); - - virtual ~Tag(); - - // Reimplementations - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - - virtual bool isEmpty() const; - - /*! - * Returns a copy of the internal fields of the tag. The returned map directly - * reflects the contents of the "INFO" chunk. - * - * \note Modifying this map does not affect the tag's internal data. - * Use setFieldText() and removeField() instead. - * - * \see setFieldText() - * \see removeField() - */ - FieldListMap fieldListMap() const; - - /* - * Gets the value of the field with the ID \a id. - */ - String fieldText(const ByteVector &id) const; - - /* - * Sets the value of the field with the ID \a id to \a s. - * If the field does not exist, it is created. - * If \s is empty, the field is removed. - * - * \note fieldId must be four-byte long pure ASCII string. This function - * performs nothing if fieldId is invalid. - */ - void setFieldText(const ByteVector &id, const String &s); - - /* - * Removes the field with the ID \a id. - */ - void removeField(const ByteVector &id); - - /*! - * Render the tag back to binary data, suitable to be written to disk. - * - * \note Returns empty ByteVector is the tag contains no fields. - */ - ByteVector render() const; - - /*! - * Sets the string handler that decides how the text data will be - * converted to and from binary data. - * If the parameter \a handler is null, the previous handler is - * released and default UTF-8 handler is restored. - * - * \note The caller is responsible for deleting the previous handler - * as needed after it is released. - * - * \see StringHandler - */ - static void setStringHandler(const StringHandler *handler); - - protected: - /*! - * Pareses the body of the tag in \a data. - */ - void parse(const ByteVector &data); - - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - }} -} - -#endif diff --git a/src/taglib/taglib/riff/wav/wavfile.cpp b/src/taglib/taglib/riff/wav/wavfile.cpp deleted file mode 100644 index abecea3..0000000 --- a/src/taglib/taglib/riff/wav/wavfile.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tbytevector.h" -#include "tdebug.h" -#include "tstringlist.h" -#include "tpropertymap.h" - -#include "wavfile.h" -#include "id3v2tag.h" -#include "infotag.h" -#include "tagunion.h" - -using namespace TagLib; - -namespace -{ - enum { ID3v2Index = 0, InfoIndex = 1 }; -} - -class RIFF::WAV::File::FilePrivate -{ -public: - FilePrivate() : - properties(0), - tagChunkID("ID3 "), - hasID3v2(false), - hasInfo(false) - { - } - - ~FilePrivate() - { - delete properties; - } - - Properties *properties; - - ByteVector tagChunkID; - - TagUnion tag; - - bool hasID3v2; - bool hasInfo; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::WAV::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : RIFF::File(file, LittleEndian) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -RIFF::WAV::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : RIFF::File(stream, LittleEndian) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -RIFF::WAV::File::~File() -{ - delete d; -} - -ID3v2::Tag *RIFF::WAV::File::tag() const -{ - return ID3v2Tag(); -} - -ID3v2::Tag *RIFF::WAV::File::ID3v2Tag() const -{ - return d->tag.access<ID3v2::Tag>(ID3v2Index, false); -} - -RIFF::Info::Tag *RIFF::WAV::File::InfoTag() const -{ - return d->tag.access<RIFF::Info::Tag>(InfoIndex, false); -} - -PropertyMap RIFF::WAV::File::properties() const -{ - return tag()->properties(); -} - -void RIFF::WAV::File::removeUnsupportedProperties(const StringList &unsupported) -{ - tag()->removeUnsupportedProperties(unsupported); -} - -PropertyMap RIFF::WAV::File::setProperties(const PropertyMap &properties) -{ - return tag()->setProperties(properties); -} - -RIFF::WAV::Properties *RIFF::WAV::File::audioProperties() const -{ - return d->properties; -} - -bool RIFF::WAV::File::save() -{ - return RIFF::WAV::File::save(AllTags); -} - -bool RIFF::WAV::File::save(TagTypes tags, bool stripOthers, int id3v2Version) -{ - if(readOnly()) { - debug("RIFF::WAV::File::save() -- File is read only."); - return false; - } - - if(!isValid()) { - debug("RIFF::WAV::File::save() -- Trying to save invalid file."); - return false; - } - - if(stripOthers) - strip(static_cast<TagTypes>(AllTags & ~tags)); - - ID3v2::Tag *id3v2tag = d->tag.access<ID3v2::Tag>(ID3v2Index, false); - if(!id3v2tag->isEmpty()) { - if(tags & ID3v2) { - setChunkData(d->tagChunkID, id3v2tag->render(id3v2Version)); - d->hasID3v2 = true; - } - } - - Info::Tag *infotag = d->tag.access<Info::Tag>(InfoIndex, false); - if(!infotag->isEmpty()) { - if(tags & Info) { - int chunkId = findInfoTagChunk(); - if(chunkId != -1) - setChunkData(chunkId, infotag->render()); - else - setChunkData("LIST", infotag->render(), true); - - d->hasInfo = true; - } - } - - return true; -} - -bool RIFF::WAV::File::hasID3v2Tag() const -{ - return d->hasID3v2; -} - -bool RIFF::WAV::File::hasInfoTag() const -{ - return d->hasInfo; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::WAV::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - ByteVector formatData; - uint streamLength = 0; - for(uint i = 0; i < chunkCount(); i++) { - String name = chunkName(i); - if(name == "ID3 " || name == "id3 ") { - d->tagChunkID = chunkName(i); - d->tag.set(ID3v2Index, new ID3v2::Tag(this, chunkOffset(i))); - d->hasID3v2 = true; - } - else if(name == "fmt " && readProperties) - formatData = chunkData(i); - else if(name == "data" && readProperties) - streamLength = chunkDataSize(i); - else if(name == "LIST") { - ByteVector data = chunkData(i); - ByteVector type = data.mid(0, 4); - - if(type == "INFO") { - d->tag.set(InfoIndex, new RIFF::Info::Tag(data)); - d->hasInfo = true; - } - } - } - - if (!d->tag[ID3v2Index]) - d->tag.set(ID3v2Index, new ID3v2::Tag); - - if (!d->tag[InfoIndex]) - d->tag.set(InfoIndex, new RIFF::Info::Tag); - - if(!formatData.isEmpty()) - d->properties = new Properties(formatData, streamLength, propertiesStyle); -} - -void RIFF::WAV::File::strip(TagTypes tags) -{ - if(tags & ID3v2) - removeChunk(d->tagChunkID); - - if(tags & Info){ - TagLib::uint chunkId = findInfoTagChunk(); - if(chunkId != TagLib::uint(-1)) - removeChunk(chunkId); - } -} - -TagLib::uint RIFF::WAV::File::findInfoTagChunk() -{ - for(uint i = 0; i < chunkCount(); ++i) { - if(chunkName(i) == "LIST" && chunkData(i).mid(0, 4) == "INFO") { - return i; - } - } - - return TagLib::uint(-1); -} diff --git a/src/taglib/taglib/riff/wav/wavfile.h b/src/taglib/taglib/riff/wav/wavfile.h deleted file mode 100644 index 2f83332..0000000 --- a/src/taglib/taglib/riff/wav/wavfile.h +++ /dev/null @@ -1,189 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_WAVFILE_H -#define TAGLIB_WAVFILE_H - -#include "rifffile.h" -#include "id3v2tag.h" -#include "infotag.h" -#include "wavproperties.h" - -namespace TagLib { - - namespace RIFF { - - //! An implementation of WAV metadata - - /*! - * This is implementation of WAV metadata. - * - * This supports an ID3v2 tag as well as reading stream from the ID3 RIFF - * chunk as well as properties from the file. - */ - - namespace WAV { - - //! An implementation of TagLib::File with WAV specific methods - - /*! - * This implements and provides an interface for WAV files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to WAV files. - */ - - class TAGLIB_EXPORT File : public TagLib::RIFF::File - { - public: - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v2 tags. - ID3v2 = 0x0001, - //! Matches Info tags. - Info = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs a WAV file from \a file. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a WAV file from \a stream. If \a readProperties is true the - * file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the ID3v2 Tag for this file. - * - * \note This method does not return all the tags for this file for - * backward compatibility. Will be fixed in TagLib 2.0. - */ - ID3v2::Tag *tag() const; - - /*! - * Returns the ID3v2 Tag for this file. - * - * \note This always returns a valid pointer regardless of whether or not - * the file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the - * file on disk actually has an ID3v2 tag. - * - * \see hasID3v2Tag() - */ - ID3v2::Tag *ID3v2Tag() const; - - /*! - * Returns the RIFF INFO Tag for this file. - * - * \note This always returns a valid pointer regardless of whether or not - * the file on disk has a RIFF INFO tag. Use hasInfoTag() to check if the - * file on disk actually has a RIFF INFO tag. - * - * \see hasInfoTag() - */ - Info::Tag *InfoTag() const; - - /*! - * Implements the unified property interface -- export function. - * This method forwards to ID3v2::Tag::properties(). - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * This method forwards to ID3v2::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the WAV::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - bool save(TagTypes tags, bool stripOthers = true, int id3v2Version = 4); - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - /*! - * Returns whether or not the file on disk actually has a RIFF INFO tag. - * - * \see InfoTag() - */ - bool hasInfoTag() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - void strip(TagTypes tags); - - /*! - * Returns the index of the chunk that its name is "LIST" and list type is "INFO". - */ - uint findInfoTagChunk(); - - class FilePrivate; - FilePrivate *d; - }; - } - } -} - -#endif diff --git a/src/taglib/taglib/riff/wav/wavproperties.cpp b/src/taglib/taglib/riff/wav/wavproperties.cpp deleted file mode 100644 index 8062df5..0000000 --- a/src/taglib/taglib/riff/wav/wavproperties.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "wavproperties.h" - -#include <tstring.h> -#include <tdebug.h> -#include <cmath> -#include <math.h> - -using namespace TagLib; - -class RIFF::WAV::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(uint streamLength = 0) : - format(0), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - sampleWidth(0), - sampleFrames(0), - streamLength(streamLength) - { - - } - - short format; - int length; - int bitrate; - int sampleRate; - int channels; - int sampleWidth; - uint sampleFrames; - uint streamLength; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::WAV::Properties::Properties(const ByteVector &data, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(); - read(data); -} - -RIFF::WAV::Properties::Properties(const ByteVector &data, uint streamLength, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(streamLength); - read(data); -} - -RIFF::WAV::Properties::~Properties() -{ - delete d; -} - -int RIFF::WAV::Properties::length() const -{ - return d->length; -} - -int RIFF::WAV::Properties::bitrate() const -{ - return d->bitrate; -} - -int RIFF::WAV::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int RIFF::WAV::Properties::channels() const -{ - return d->channels; -} - -int RIFF::WAV::Properties::sampleWidth() const -{ - return d->sampleWidth; -} - -TagLib::uint RIFF::WAV::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::WAV::Properties::read(const ByteVector &data) -{ - d->format = data.toShort(0, false); - d->channels = data.toShort(2, false); - d->sampleRate = data.toUInt(4, false); - d->sampleWidth = data.toShort(14, false); - - const uint byteRate = data.toUInt(8, false); - d->bitrate = byteRate * 8 / 1000; - - d->length = byteRate > 0 ? d->streamLength / byteRate : 0; - if(d->channels > 0 && d->sampleWidth > 0) - d->sampleFrames = d->streamLength / (d->channels * ((d->sampleWidth + 7) / 8)); -} diff --git a/src/taglib/taglib/riff/wav/wavproperties.h b/src/taglib/taglib/riff/wav/wavproperties.h deleted file mode 100644 index 2023f53..0000000 --- a/src/taglib/taglib/riff/wav/wavproperties.h +++ /dev/null @@ -1,92 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_WAVPROPERTIES_H -#define TAGLIB_WAVPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - - class ByteVector; - - namespace RIFF { - - namespace WAV { - - class File; - - //! An implementation of audio property reading for WAV - - /*! - * This reads the data from an WAV stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of WAV::Properties with the data read from the - * ByteVector \a data. - */ - Properties(const ByteVector &data, ReadStyle style); - - /*! - * Create an instance of WAV::Properties with the data read from the - * ByteVector \a data and the length calculated using \a streamLength. - */ - Properties(const ByteVector &data, uint streamLength, ReadStyle style); - - /*! - * Destroys this WAV::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - int sampleWidth() const; - uint sampleFrames() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(const ByteVector &data); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - } -} - -#endif diff --git a/src/taglib/taglib/s3m/s3mfile.cpp b/src/taglib/taglib/s3m/s3mfile.cpp deleted file mode 100644 index 371340a..0000000 --- a/src/taglib/taglib/s3m/s3mfile.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "s3mfile.h" -#include "tstringlist.h" -#include "tdebug.h" -#include "modfileprivate.h" -#include "tpropertymap.h" - -#include <iostream> - -using namespace TagLib; -using namespace S3M; - -class S3M::File::FilePrivate -{ -public: - FilePrivate(AudioProperties::ReadStyle propertiesStyle) - : properties(propertiesStyle) - { - } - - Mod::Tag tag; - S3M::Properties properties; -}; - -S3M::File::File(FileName file, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(file), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -S3M::File::File(IOStream *stream, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(stream), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -S3M::File::~File() -{ - delete d; -} - -Mod::Tag *S3M::File::tag() const -{ - return &d->tag; -} - -PropertyMap S3M::File::properties() const -{ - return d->tag.properties(); -} - -PropertyMap S3M::File::setProperties(const PropertyMap &properties) -{ - return d->tag.setProperties(properties); -} - -S3M::Properties *S3M::File::audioProperties() const -{ - return &d->properties; -} - -bool S3M::File::save() -{ - if(readOnly()) { - debug("S3M::File::save() - Cannot save to a read only file."); - return false; - } - // note: if title starts with "Extended Module: " - // the file would look like an .xm file - seek(0); - writeString(d->tag.title(), 27); - // string terminating NUL is not optional: - writeByte(0); - - seek(32); - - ushort length = 0; - ushort sampleCount = 0; - - if(!readU16L(length) || !readU16L(sampleCount)) - return false; - - seek(28, Current); - - int channels = 0; - for(int i = 0; i < 32; ++ i) { - uchar setting = 0; - if(!readByte(setting)) - return false; - // or if(setting >= 128)? - // or channels = i + 1;? - // need a better spec! - if(setting != 0xff) ++ channels; - } - - seek(channels, Current); - - StringList lines = d->tag.comment().split("\n"); - // write comment as sample names: - for(ushort i = 0; i < sampleCount; ++ i) { - seek(96L + length + ((long)i << 1)); - - ushort instrumentOffset = 0; - if(!readU16L(instrumentOffset)) - return false; - seek(((long)instrumentOffset << 4) + 48); - - if(i < lines.size()) - writeString(lines[i], 27); - else - writeString(String::null, 27); - // string terminating NUL is not optional: - writeByte(0); - } - return true; -} - -void S3M::File::read(bool) -{ - if(!isOpen()) - return; - - READ_STRING(d->tag.setTitle, 28); - READ_BYTE_AS(mark); - READ_BYTE_AS(type); - - READ_ASSERT(mark == 0x1A && type == 0x10); - - seek(32); - - READ_U16L_AS(length); - READ_U16L_AS(sampleCount); - - d->properties.setSampleCount(sampleCount); - - READ_U16L(d->properties.setPatternCount); - READ_U16L(d->properties.setFlags); - READ_U16L(d->properties.setTrackerVersion); - READ_U16L(d->properties.setFileFormatVersion); - - READ_ASSERT(readBlock(4) == "SCRM"); - - READ_BYTE(d->properties.setGlobalVolume); - READ_BYTE(d->properties.setBpmSpeed); - READ_BYTE(d->properties.setTempo); - - READ_BYTE_AS(masterVolume); - d->properties.setMasterVolume(masterVolume & 0x7f); - d->properties.setStereo((masterVolume & 0x80) != 0); - - // I've seen players who call the next two bytes - // "ultra click" and "use panning values" (if == 0xFC). - // I don't see them in any spec, though. - // Hm, but there is "UltraClick-removal" and some other - // variables in ScreamTracker IIIs GUI. - - seek(12, Current); - - int channels = 0; - for(int i = 0; i < 32; ++ i) { - READ_BYTE_AS(setting); - // or if(setting >= 128)? - // or channels = i + 1;? - // need a better spec! - if(setting != 0xff) ++ channels; - } - d->properties.setChannels(channels); - - seek(96); - ushort realLength = 0; - for(ushort i = 0; i < length; ++ i) { - READ_BYTE_AS(order); - if(order == 255) break; - if(order != 254) ++ realLength; - } - d->properties.setLengthInPatterns(realLength); - - seek(channels, Current); - - // Note: The S3M spec mentions samples and instruments, but in - // the header there are only pointers to instruments. - // However, there I never found instruments (SCRI) but - // instead samples (SCRS). - StringList comment; - for(ushort i = 0; i < sampleCount; ++ i) { - seek(96L + length + ((long)i << 1)); - - READ_U16L_AS(sampleHeaderOffset); - seek((long)sampleHeaderOffset << 4); - - READ_BYTE_AS(sampleType); - READ_STRING_AS(dosFileName, 13); - READ_U16L_AS(sampleDataOffset); - READ_U32L_AS(sampleLength); - READ_U32L_AS(repeatStart); - READ_U32L_AS(repeatStop); - READ_BYTE_AS(sampleVolume); - - seek(1, Current); - - READ_BYTE_AS(packing); - READ_BYTE_AS(sampleFlags); - READ_U32L_AS(baseFrequency); - - seek(12, Current); - - READ_STRING_AS(sampleName, 28); - // The next 4 bytes should be "SCRS", but I've found - // files that are otherwise ok with 4 nils instead. - // READ_ASSERT(readBlock(4) == "SCRS"); - - comment.append(sampleName); - } - - d->tag.setComment(comment.toString("\n")); - d->tag.setTrackerName("ScreamTracker III"); -} diff --git a/src/taglib/taglib/s3m/s3mfile.h b/src/taglib/taglib/s3m/s3mfile.h deleted file mode 100644 index 5f45297..0000000 --- a/src/taglib/taglib/s3m/s3mfile.h +++ /dev/null @@ -1,108 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_S3MFILE_H -#define TAGLIB_S3MFILE_H - -#include "tfile.h" -#include "audioproperties.h" -#include "taglib_export.h" -#include "modfilebase.h" -#include "modtag.h" -#include "s3mproperties.h" - -namespace TagLib { - - namespace S3M { - - class TAGLIB_EXPORT File : public Mod::FileBase { - public: - /*! - * Constructs a ScreamTracker III from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Constructs a ScreamTracker III file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - Mod::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * Forwards to Mod::Tag::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Forwards to Mod::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the S3M::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - S3M::Properties *audioProperties() const; - - /*! - * Save the file. - * This is the same as calling save(AllTags); - * - * \note Saving ScreamTracker III tags is not supported. - */ - bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/s3m/s3mproperties.cpp b/src/taglib/taglib/s3m/s3mproperties.cpp deleted file mode 100644 index a1a010a..0000000 --- a/src/taglib/taglib/s3m/s3mproperties.cpp +++ /dev/null @@ -1,204 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "s3mproperties.h" - -using namespace TagLib; -using namespace S3M; - -class S3M::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - lengthInPatterns(0), - channels(0), - stereo(false), - sampleCount(0), - patternCount(0), - flags(0), - trackerVersion(0), - fileFormatVersion(0), - globalVolume(0), - masterVolume(0), - tempo(0), - bpmSpeed(0) - { - } - - ushort lengthInPatterns; - int channels; - bool stereo; - ushort sampleCount; - ushort patternCount; - ushort flags; - ushort trackerVersion; - ushort fileFormatVersion; - uchar globalVolume; - uchar masterVolume; - uchar tempo; - uchar bpmSpeed; -}; - -S3M::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : - AudioProperties(propertiesStyle), - d(new PropertiesPrivate) -{ -} - -S3M::Properties::~Properties() -{ - delete d; -} - -int S3M::Properties::length() const -{ - return 0; -} - -int S3M::Properties::bitrate() const -{ - return 0; -} - -int S3M::Properties::sampleRate() const -{ - return 0; -} - -int S3M::Properties::channels() const -{ - return d->channels; -} - -TagLib::ushort S3M::Properties::lengthInPatterns() const -{ - return d->lengthInPatterns; -} - -bool S3M::Properties::stereo() const -{ - return d->stereo; -} - -TagLib::ushort S3M::Properties::sampleCount() const -{ - return d->sampleCount; -} - -TagLib::ushort S3M::Properties::patternCount() const -{ - return d->patternCount; -} - -TagLib::ushort S3M::Properties::flags() const -{ - return d->flags; -} - -TagLib::ushort S3M::Properties::trackerVersion() const -{ - return d->trackerVersion; -} - -TagLib::ushort S3M::Properties::fileFormatVersion() const -{ - return d->fileFormatVersion; -} - -uchar S3M::Properties::globalVolume() const -{ - return d->globalVolume; -} - -uchar S3M::Properties::masterVolume() const -{ - return d->masterVolume; -} - -uchar S3M::Properties::tempo() const -{ - return d->tempo; -} - -uchar S3M::Properties::bpmSpeed() const -{ - return d->bpmSpeed; -} - -void S3M::Properties::setLengthInPatterns(ushort lengthInPatterns) -{ - d->lengthInPatterns = lengthInPatterns; -} - -void S3M::Properties::setChannels(int channels) -{ - d->channels = channels; -} - -void S3M::Properties::setStereo(bool stereo) -{ - d->stereo = stereo; -} - -void S3M::Properties::setSampleCount(ushort sampleCount) -{ - d->sampleCount = sampleCount; -} - -void S3M::Properties::setPatternCount(ushort patternCount) -{ - d->patternCount = patternCount; -} - -void S3M::Properties::setFlags(ushort flags) -{ - d->flags = flags; -} - -void S3M::Properties::setTrackerVersion(ushort trackerVersion) -{ - d->trackerVersion = trackerVersion; -} - -void S3M::Properties::setFileFormatVersion(ushort fileFormatVersion) -{ - d->fileFormatVersion = fileFormatVersion; -} - -void S3M::Properties::setGlobalVolume(uchar globalVolume) -{ - d->globalVolume = globalVolume; -} - -void S3M::Properties::setMasterVolume(uchar masterVolume) -{ - d->masterVolume = masterVolume; -} - -void S3M::Properties::setTempo(uchar tempo) -{ - d->tempo = tempo; -} - -void S3M::Properties::setBpmSpeed(uchar bpmSpeed) -{ - d->bpmSpeed = bpmSpeed; -} diff --git a/src/taglib/taglib/s3m/s3mproperties.h b/src/taglib/taglib/s3m/s3mproperties.h deleted file mode 100644 index 6e9f1d2..0000000 --- a/src/taglib/taglib/s3m/s3mproperties.h +++ /dev/null @@ -1,88 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_S3MPROPERTIES_H -#define TAGLIB_S3MPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - namespace S3M { - class TAGLIB_EXPORT Properties : public AudioProperties { - friend class File; - public: - /*! Flag bits. */ - enum { - ST2Vibrato = 1, - ST2Tempo = 2, - AmigaSlides = 4, - Vol0MixOptimizations = 8, - AmigaLimits = 16, - EnableFilter = 32, - CustomData = 128 - }; - - Properties(AudioProperties::ReadStyle propertiesStyle); - virtual ~Properties(); - - int length() const; - int bitrate() const; - int sampleRate() const; - int channels() const; - - ushort lengthInPatterns() const; - bool stereo() const; - ushort sampleCount() const; - ushort patternCount() const; - ushort flags() const; - ushort trackerVersion() const; - ushort fileFormatVersion() const; - uchar globalVolume() const; - uchar masterVolume() const; - uchar tempo() const; - uchar bpmSpeed() const; - - void setChannels(int channels); - - void setLengthInPatterns (ushort lengthInPatterns); - void setStereo (bool stereo); - void setSampleCount (ushort sampleCount); - void setPatternCount (ushort patternCount); - void setFlags (ushort flags); - void setTrackerVersion (ushort trackerVersion); - void setFileFormatVersion(ushort fileFormatVersion); - void setGlobalVolume (uchar globalVolume); - void setMasterVolume (uchar masterVolume); - void setTempo (uchar tempo); - void setBpmSpeed (uchar bpmSpeed); - - private: - Properties(const Properties&); - Properties &operator=(const Properties&); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/tag.cpp b/src/taglib/taglib/tag.cpp deleted file mode 100644 index 6763408..0000000 --- a/src/taglib/taglib/tag.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tag.h" -#include "tstringlist.h" -#include "tpropertymap.h" - -using namespace TagLib; - -class Tag::TagPrivate -{ - -}; - -Tag::Tag() -{ - -} - -Tag::~Tag() -{ - -} - -bool Tag::isEmpty() const -{ - return (title().isEmpty() && - artist().isEmpty() && - album().isEmpty() && - comment().isEmpty() && - genre().isEmpty() && - year() == 0 && - track() == 0); -} - -PropertyMap Tag::properties() const -{ - PropertyMap map; - if(!(title().isNull())) - map["TITLE"].append(title()); - if(!(artist().isNull())) - map["ARTIST"].append(artist()); - if(!(album().isNull())) - map["ALBUM"].append(album()); - if(!(comment().isNull())) - map["COMMENT"].append(comment()); - if(!(genre().isNull())) - map["GENRE"].append(genre()); - if(!(year() == 0)) - map["DATE"].append(String::number(year())); - if(!(track() == 0)) - map["TRACKNUMBER"].append(String::number(track())); - return map; -} - -void Tag::removeUnsupportedProperties(const StringList&) -{ -} - -PropertyMap Tag::setProperties(const PropertyMap &origProps) -{ - PropertyMap properties(origProps); - properties.removeEmpty(); - StringList oneValueSet; - // can this be simplified by using some preprocessor defines / function pointers? - if(properties.contains("TITLE")) { - setTitle(properties["TITLE"].front()); - oneValueSet.append("TITLE"); - } else - setTitle(String::null); - - if(properties.contains("ARTIST")) { - setArtist(properties["ARTIST"].front()); - oneValueSet.append("ARTIST"); - } else - setArtist(String::null); - - if(properties.contains("ALBUM")) { - setAlbum(properties["ALBUM"].front()); - oneValueSet.append("ALBUM"); - } else - setAlbum(String::null); - - if(properties.contains("COMMENT")) { - setComment(properties["COMMENT"].front()); - oneValueSet.append("COMMENT"); - } else - setComment(String::null); - - if(properties.contains("GENRE")) { - setGenre(properties["GENRE"].front()); - oneValueSet.append("GENRE"); - } else - setGenre(String::null); - - if(properties.contains("DATE")) { - bool ok; - int date = properties["DATE"].front().toInt(&ok); - if(ok) { - setYear(date); - oneValueSet.append("DATE"); - } else - setYear(0); - } - else - setYear(0); - - if(properties.contains("TRACKNUMBER")) { - bool ok; - int track = properties["TRACKNUMBER"].front().toInt(&ok); - if(ok) { - setTrack(track); - oneValueSet.append("TRACKNUMBER"); - } else - setTrack(0); - } - else - setYear(0); - - // for each tag that has been set above, remove the first entry in the corresponding - // value list. The others will be returned as unsupported by this format. - for(StringList::Iterator it = oneValueSet.begin(); it != oneValueSet.end(); ++it) { - if(properties[*it].size() == 1) - properties.erase(*it); - else - properties[*it].erase( properties[*it].begin() ); - } - return properties; -} - -void Tag::duplicate(const Tag *source, Tag *target, bool overwrite) // static -{ - if(overwrite) { - target->setTitle(source->title()); - target->setArtist(source->artist()); - target->setAlbum(source->album()); - target->setComment(source->comment()); - target->setGenre(source->genre()); - target->setYear(source->year()); - target->setTrack(source->track()); - } - else { - if(target->title().isEmpty()) - target->setTitle(source->title()); - if(target->artist().isEmpty()) - target->setArtist(source->artist()); - if(target->album().isEmpty()) - target->setAlbum(source->album()); - if(target->comment().isEmpty()) - target->setComment(source->comment()); - if(target->genre().isEmpty()) - target->setGenre(source->genre()); - if(target->year() <= 0) - target->setYear(source->year()); - if(target->track() <= 0) - target->setTrack(source->track()); - } -} diff --git a/src/taglib/taglib/tag.h b/src/taglib/taglib/tag.h deleted file mode 100644 index 76c9a82..0000000 --- a/src/taglib/taglib/tag.h +++ /dev/null @@ -1,201 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TAG_H -#define TAGLIB_TAG_H - -#include "taglib_export.h" -#include "tstring.h" - -namespace TagLib { - - //! A simple, generic interface to common audio meta data fields - - /*! - * This is an attempt to abstract away the difference in the meta data formats - * of various audio codecs and tagging schemes. As such it is generally a - * subset of what is available in the specific formats but should be suitable - * for most applications. This is meant to compliment the generic APIs found - * in TagLib::AudioProperties, TagLib::File and TagLib::FileRef. - */ - - class PropertyMap; - - class TAGLIB_EXPORT Tag - { - public: - - /*! - * Detroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Exports the tags of the file as dictionary mapping (human readable) tag - * names (Strings) to StringLists of tag values. - * The default implementation in this class considers only the usual built-in - * tags (artist, album, ...) and only one value per key. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties, or a subset of them, from the tag. - * The parameter \a properties must contain only entries from - * properties().unsupportedData(). - * BIC: Will become virtual in future releases. Currently the non-virtual - * standard implementation of TagLib::Tag does nothing, since there are - * no unsupported elements. - */ - void removeUnsupportedProperties(const StringList& properties); - - /*! - * Sets the tags of this File to those specified in \a properties. This default - * implementation sets only the tags for which setter methods exist in this class - * (artist, album, ...), and only one value per key; the rest will be contained - * in the returned PropertyMap. - */ - PropertyMap setProperties(const PropertyMap &properties); - - /*! - * Returns the track name; if no track name is present in the tag - * String::null will be returned. - */ - virtual String title() const = 0; - - /*! - * Returns the artist name; if no artist name is present in the tag - * String::null will be returned. - */ - virtual String artist() const = 0; - - /*! - * Returns the album name; if no album name is present in the tag - * String::null will be returned. - */ - virtual String album() const = 0; - - /*! - * Returns the track comment; if no comment is present in the tag - * String::null will be returned. - */ - virtual String comment() const = 0; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String genre() const = 0; - - /*! - * Returns the year; if there is no year set, this will return 0. - */ - virtual uint year() const = 0; - - /*! - * Returns the track number; if there is no track number set, this will - * return 0. - */ - virtual uint track() const = 0; - - /*! - * Sets the title to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setTitle(const String &s) = 0; - - /*! - * Sets the artist to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setArtist(const String &s) = 0; - - /*! - * Sets the album to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setAlbum(const String &s) = 0; - - /*! - * Sets the comment to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setComment(const String &s) = 0; - - /*! - * Sets the genre to \a s. If \a s is String::null then this value will be - * cleared. For tag formats that use a fixed set of genres, the appropriate - * value will be selected based on a string comparison. A list of available - * genres for those formats should be available in that type's - * implementation. - */ - virtual void setGenre(const String &s) = 0; - - /*! - * Sets the year to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setYear(uint i) = 0; - - /*! - * Sets the track to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setTrack(uint i) = 0; - - /*! - * Returns true if the tag does not contain any data. This should be - * reimplemented in subclasses that provide more than the basic tagging - * abilities in this class. - */ - virtual bool isEmpty() const; - - /*! - * Copies the generic data from one tag to another. - * - * \note This will no affect any of the lower level details of the tag. For - * instance if any of the tag type specific data (maybe a URL for a band) is - * set, this will not modify or copy that. This just copies using the API - * in this class. - * - * If \a overwrite is true then the values will be unconditionally copied. - * If false only empty values will be overwritten. - */ - static void duplicate(const Tag *source, Tag *target, bool overwrite = true); - - protected: - /*! - * Construct a Tag. This is protected since tags should only be instantiated - * through subclasses. - */ - Tag(); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; -} - -#endif diff --git a/src/taglib/taglib/taglib_config.h b/src/taglib/taglib/taglib_config.h deleted file mode 100644 index 0f499e2..0000000 --- a/src/taglib/taglib/taglib_config.h +++ /dev/null @@ -1,4 +0,0 @@ -/* taglib_config.h. Generated by cmake from taglib_config.h.cmake */ - -#define TAGLIB_WITH_ASF 1 -#define TAGLIB_WITH_MP4 1 diff --git a/src/taglib/taglib/taglib_export.h b/src/taglib/taglib/taglib_export.h deleted file mode 100644 index 737ae64..0000000 --- a/src/taglib/taglib/taglib_export.h +++ /dev/null @@ -1,43 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_EXPORT_H -#define TAGLIB_EXPORT_H - -#if defined(TAGLIB_STATIC) -#define TAGLIB_EXPORT -#elif (defined(_WIN32) || defined(_WIN64)) -#ifdef MAKE_TAGLIB_LIB -#define TAGLIB_EXPORT __declspec(dllexport) -#else -#define TAGLIB_EXPORT __declspec(dllimport) -#endif -#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1) -#define TAGLIB_EXPORT __attribute__ ((visibility("default"))) -#else -#define TAGLIB_EXPORT -#endif - -#endif diff --git a/src/taglib/taglib/tagunion.cpp b/src/taglib/taglib/tagunion.cpp deleted file mode 100644 index 52d7136..0000000 --- a/src/taglib/taglib/tagunion.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tagunion.h" -#include "tstringlist.h" - -using namespace TagLib; - -#define stringUnion(method) \ - if(tag(0) && !tag(0)->method().isEmpty()) \ - return tag(0)->method(); \ - if(tag(1) && !tag(1)->method().isEmpty()) \ - return tag(1)->method(); \ - if(tag(2) && !tag(2)->method().isEmpty()) \ - return tag(2)->method(); \ - return String::null \ - -#define numberUnion(method) \ - if(tag(0) && tag(0)->method() > 0) \ - return tag(0)->method(); \ - if(tag(1) && tag(1)->method() > 0) \ - return tag(1)->method(); \ - if(tag(2) && tag(2)->method() > 0) \ - return tag(2)->method(); \ - return 0 - -#define setUnion(method, value) \ - if(tag(0)) \ - tag(0)->set##method(value); \ - if(tag(1)) \ - tag(1)->set##method(value); \ - if(tag(2)) \ - tag(2)->set##method(value); \ - -class TagUnion::TagUnionPrivate -{ -public: - TagUnionPrivate() : tags(3, static_cast<Tag *>(0)) - { - - } - - ~TagUnionPrivate() - { - delete tags[0]; - delete tags[1]; - delete tags[2]; - } - - std::vector<Tag *> tags; -}; - -TagUnion::TagUnion(Tag *first, Tag *second, Tag *third) -{ - d = new TagUnionPrivate; - - d->tags[0] = first; - d->tags[1] = second; - d->tags[2] = third; -} - -TagUnion::~TagUnion() -{ - delete d; -} - -Tag *TagUnion::operator[](int index) const -{ - return tag(index); -} - -Tag *TagUnion::tag(int index) const -{ - return d->tags[index]; -} - -void TagUnion::set(int index, Tag *tag) -{ - delete d->tags[index]; - d->tags[index] = tag; -} - -String TagUnion::title() const -{ - stringUnion(title); -} - -String TagUnion::artist() const -{ - stringUnion(artist); -} - -String TagUnion::album() const -{ - stringUnion(album); -} - -String TagUnion::comment() const -{ - stringUnion(comment); -} - -String TagUnion::genre() const -{ - stringUnion(genre); -} - -TagLib::uint TagUnion::year() const -{ - numberUnion(year); -} - -TagLib::uint TagUnion::track() const -{ - numberUnion(track); -} - -void TagUnion::setTitle(const String &s) -{ - setUnion(Title, s); -} - -void TagUnion::setArtist(const String &s) -{ - setUnion(Artist, s); -} - -void TagUnion::setAlbum(const String &s) -{ - setUnion(Album, s); -} - -void TagUnion::setComment(const String &s) -{ - setUnion(Comment, s); -} - -void TagUnion::setGenre(const String &s) -{ - setUnion(Genre, s); -} - -void TagUnion::setYear(uint i) -{ - setUnion(Year, i); -} - -void TagUnion::setTrack(uint i) -{ - setUnion(Track, i); -} - -bool TagUnion::isEmpty() const -{ - if(d->tags[0] && !d->tags[0]->isEmpty()) - return false; - if(d->tags[1] && !d->tags[1]->isEmpty()) - return false; - if(d->tags[2] && !d->tags[2]->isEmpty()) - return false; - - return true; -} - diff --git a/src/taglib/taglib/tagunion.h b/src/taglib/taglib/tagunion.h deleted file mode 100644 index e94d523..0000000 --- a/src/taglib/taglib/tagunion.h +++ /dev/null @@ -1,95 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TAGUNION_H -#define TAGLIB_TAGUNION_H - -#include "tag.h" - -#ifndef DO_NOT_DOCUMENT - -namespace TagLib { - - /*! - * \internal - */ - - class TagUnion : public Tag - { - public: - - enum AccessType { Read, Write }; - - /*! - * Creates a TagLib::Tag that is the union of \a first, \a second, and - * \a third. The TagUnion takes ownership of these tags and will handle - * their deletion. - */ - TagUnion(Tag *first = 0, Tag *second = 0, Tag *third = 0); - - virtual ~TagUnion(); - - Tag *operator[](int index) const; - Tag *tag(int index) const; - - void set(int index, Tag *tag); - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - virtual bool isEmpty() const; - - template <class T> T *access(int index, bool create) - { - if(!create || tag(index)) - return static_cast<T *>(tag(index)); - - set(index, new T); - return static_cast<T *>(tag(index)); - } - - private: - TagUnion(const Tag &); - TagUnion &operator=(const Tag &); - - class TagUnionPrivate; - TagUnionPrivate *d; - }; -} - -#endif -#endif diff --git a/src/taglib/taglib/toolkit/taglib.h b/src/taglib/taglib/toolkit/taglib.h deleted file mode 100644 index cbca107..0000000 --- a/src/taglib/taglib/toolkit/taglib.h +++ /dev/null @@ -1,170 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_H -#define TAGLIB_H - -#include "taglib_config.h" - -#define TAGLIB_MAJOR_VERSION 1 -#define TAGLIB_MINOR_VERSION 9 -#define TAGLIB_PATCH_VERSION 1 - -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 1)) -#define TAGLIB_IGNORE_MISSING_DESTRUCTOR _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"") -#else -#define TAGLIB_IGNORE_MISSING_DESTRUCTOR -#endif - -#if (defined(_MSC_VER) && _MSC_VER >= 1600) -#define TAGLIB_CONSTRUCT_BITSET(x) static_cast<unsigned long long>(x) -#else -#define TAGLIB_CONSTRUCT_BITSET(x) static_cast<unsigned long>(x) -#endif - -#include <string> - -//! A namespace for all TagLib related classes and functions - -/*! - * This namespace contains everything in TagLib. For projects working with - * TagLib extensively it may be convenient to add a - * \code - * using namespace TagLib; - * \endcode - */ - -namespace TagLib { - - class String; - - typedef wchar_t wchar; // Assumed to be sufficient to store a UTF-16 char. - typedef unsigned char uchar; - typedef unsigned short ushort; - typedef unsigned int uint; - typedef unsigned long long ulonglong; - - // long/ulong can be either 32-bit or 64-bit wide. - typedef unsigned long ulong; - - /*! - * Unfortunately std::wstring isn't defined on some systems, (i.e. GCC < 3) - * so I'm providing something here that should be constant. - */ - typedef std::basic_string<wchar> wstring; -} - -/*! - * \mainpage TagLib - * - * \section intro Introduction - * - * TagLib is a library for reading and editing audio meta data, commonly know as \e tags. - * - * Features: - * - A clean, high level, C++ API to handling audio meta data. - * - Format specific APIs for advanced API users. - * - ID3v1, ID3v2, APE, FLAC, Xiph, iTunes-style MP4 and WMA tag formats. - * - MP3, MPC, FLAC, MP4, ASF, AIFF, WAV, TrueAudio, WavPack, Ogg FLAC, Ogg Vorbis, Speex and Opus file formats. - * - Basic audio file properties such as length, sample rate, etc. - * - Long term binary and source compatibility. - * - Extensible design, notably the ability to add other formats or extend current formats as a library user. - * - Full support for unicode and internationalized tags. - * - Dual <a href="http://www.mozilla.org/MPL/MPL-1.1.html">MPL</a> and - * <a href="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</a> licenses. - * - No external toolkit dependancies. - * - * \section why Why TagLib? - * - * TagLib originally was written to provide an updated and improved ID3v2 implementation in C++ for use - * in a variety of Open Source projects. Since development began in 2002 and the 1.0 release in 2004 - * it has expanded to cover a wide variety of tag and file formats and is used in a wide variety of - * Open Source and proprietary applications. It now supports a variety of UNIXes, including Apple's OS - * X, as well as Microsoft Windows. - * - * \section commercial Usage in Commercial Applications - * - * TagLib's licenses \e do allow usage within propriety (\e closed) applications, however TagLib is \e not - * public domain. Please note the requirements of the LGPL or MPL, and adhere to at least one of them. - * In simple terms, you must at a minimum note your usage of TagLib, note the licensing terms of TagLib and - * if you make changes to TagLib publish them. Please review the licenses above before using TagLib in your - * software. Note that you may choose either the MPL or the LGPL, you do not have to fulfill the - * requirements of both. - * - * \section installing Installing TagLib - * - * Please see the <a href="http://developer.kde.org/~wheeler/taglib.html">TagLib website</a> for the latest - * downloads. - * - * TagLib can be built using the CMake build system. TagLib installs a taglib-config and pkg-config file to - * make it easier to integrate into various build systems. Note that TagLib's include install directory \e must - * be included in the header include path. Simply adding <taglib/tag.h> will \e not work. - * - * \section start Getting Started - * - * TagLib provides both simple, abstract APIs which make it possible to ignore the differences between tagging - * formats and format specific APIs which allow programmers to work with the features of specific tagging - * schemes. There is a similar abstraction mechanism for AudioProperties. - * - * The best place to start is with the <b>Class Hierarchy</b> linked at the top of the page. The File and - * AudioProperties classes and their subclasses are the core of TagLib. The FileRef class is also a convenient - * way for using a value-based handle. - * - * \note When working with FileRef please consider that it has only the most basic (extension-based) file - * type resolution. Please see its documentation on how to plug in more advanced file type resolution. (Such - * resolution may be part of later TagLib releases by default.) - * - * Here's a very simple example with TagLib: - * - * \code - * - * TagLib::FileRef f("Latex Solar Beef.mp3"); - * TagLib::String artist = f.tag()->artist(); // artist == "Frank Zappa" - * - * f.tag()->setAlbum("Fillmore East"); - * f.save(); - * - * TagLib::FileRef g("Free City Rhymes.ogg"); - * TagLib::String album = g.tag()->album(); // album == "NYC Ghosts & Flowers" - * - * g.tag()->setTrack(1); - * g.save(); - * - * \endcode - * - * More examples can be found in the \e examples directory of the source distribution. - * - * \section Contact - * - * Questions about TagLib should be directed to the TagLib mailing list, not directly to the author. - * - * - <a href="http://developer.kde.org/~wheeler/taglib/">TagLib Homepage</a> - * - <a href="https://mail.kde.org/mailman/listinfo/taglib-devel">TagLib Mailing List (taglib-devel@kde.org)</a> - * - * \author Scott Wheeler <wheeler@kde.org> et al. - * - */ - -#endif diff --git a/src/taglib/taglib/toolkit/tbytevector.cpp b/src/taglib/taglib/toolkit/tbytevector.cpp deleted file mode 100644 index b658246..0000000 --- a/src/taglib/taglib/toolkit/tbytevector.cpp +++ /dev/null @@ -1,857 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <algorithm> -#include <iostream> -#include <cstdio> -#include <cstring> - -#include <tstring.h> -#include <tdebug.h> -#include "trefcounter.h" -#include "tutils.h" - -#include "tbytevector.h" - -// This is a bit ugly to keep writing over and over again. - -// A rather obscure feature of the C++ spec that I hadn't thought of that makes -// working with C libs much more efficient. There's more here: -// -// http://www.informit.com/isapi/product_id~{9C84DAB4-FE6E-49C5-BB0A-FB50331233EA}/content/index.asp - -#define DATA(x) (&(x->data->data[0])) - -namespace TagLib { - -static const char hexTable[17] = "0123456789abcdef"; - -static const uint crcTable[256] = { - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, - 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, - 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, - 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, - 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, - 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, - 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, - 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, - 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, - 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, - 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, - 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, - 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, - 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, - 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, - 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, - 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, - 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, - 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, - 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, - 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, - 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, - 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, - 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, - 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, - 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, - 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, - 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, - 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, - 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, - 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, - 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, - 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, - 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, - 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, - 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, - 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, - 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, - 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, - 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 -}; - -/*! - * A templatized straightforward find that works with the types - * std::vector<char>::iterator and std::vector<char>::reverse_iterator. - */ -template <class TIterator> -int findChar( - const TIterator dataBegin, const TIterator dataEnd, - char c, uint offset, int byteAlign) -{ - const size_t dataSize = dataEnd - dataBegin; - if(dataSize == 0 || offset > dataSize - 1) - return -1; - - // n % 0 is invalid - - if(byteAlign == 0) - return -1; - - for(TIterator it = dataBegin + offset; it < dataEnd; it += byteAlign) { - if(*it == c) - return (it - dataBegin); - } - - return -1; -} - -/*! - * A templatized KMP find that works with the types - * std::vector<char>::iterator and std::vector<char>::reverse_iterator. - */ -template <class TIterator> -int findVector( - const TIterator dataBegin, const TIterator dataEnd, - const TIterator patternBegin, const TIterator patternEnd, - uint offset, int byteAlign) -{ - const size_t dataSize = dataEnd - dataBegin; - const size_t patternSize = patternEnd - patternBegin; - if(patternSize > dataSize || offset > dataSize - 1) - return -1; - - // n % 0 is invalid - - if(byteAlign == 0) - return -1; - - // Special case that pattern contains just single char. - - if(patternSize == 1) - return findChar(dataBegin, dataEnd, *patternBegin, offset, byteAlign); - - size_t lastOccurrence[256]; - - for(size_t i = 0; i < 256; ++i) - lastOccurrence[i] = patternSize; - - for(size_t i = 0; i < patternSize - 1; ++i) - lastOccurrence[static_cast<uchar>(*(patternBegin + i))] = patternSize - i - 1; - - TIterator it = dataBegin + patternSize - 1 + offset; - while(true) - { - TIterator itBuffer = it; - TIterator itPattern = patternBegin + patternSize - 1; - - while(*itBuffer == *itPattern) - { - if(itPattern == patternBegin) - { - if((itBuffer - dataBegin - offset) % byteAlign == 0) - return (itBuffer - dataBegin); - else - break; - } - - --itBuffer; - --itPattern; - } - - const size_t step = lastOccurrence[static_cast<uchar>(*it)]; - if(dataEnd - step <= it) - break; - - it += step; - } - - return -1; -} - -template <class T> -T toNumber(const ByteVector &v, size_t offset, size_t length, bool mostSignificantByteFirst) -{ - if(offset >= v.size()) { - debug("toNumber<T>() -- No data to convert. Returning 0."); - return 0; - } - - length = std::min(length, v.size() - offset); - - T sum = 0; - for(size_t i = 0; i < length; i++) { - const size_t shift = (mostSignificantByteFirst ? length - 1 - i : i) * 8; - sum |= static_cast<T>(static_cast<uchar>(v[offset + i])) << shift; - } - - return sum; -} - -template <class T> -T toNumber(const ByteVector &v, size_t offset, bool mostSignificantByteFirst) -{ - static const bool isBigEndian = (Utils::SystemByteOrder == Utils::BigEndian); - const bool swap = (mostSignificantByteFirst != isBigEndian); - - if(offset + sizeof(T) > v.size()) - return toNumber<T>(v, offset, v.size() - offset, mostSignificantByteFirst); - - // Uses memcpy instead of reinterpret_cast to avoid an alignment exception. - T tmp; - ::memcpy(&tmp, v.data() + offset, sizeof(T)); - - if(swap) - return Utils::byteSwap(tmp); - else - return tmp; -} - -template <class T> -ByteVector fromNumber(T value, bool mostSignificantByteFirst) -{ - static const bool isBigEndian = (Utils::SystemByteOrder == Utils::BigEndian); - const bool swap = (mostSignificantByteFirst != isBigEndian); - - if(swap) - value = Utils::byteSwap(value); - - return ByteVector(reinterpret_cast<const char *>(&value), sizeof(T)); -} - -class DataPrivate : public RefCounter -{ -public: - DataPrivate() - { - } - - DataPrivate(const std::vector<char> &v, uint offset, uint length) - : data(v.begin() + offset, v.begin() + offset + length) - { - } - - // A char* can be an iterator. - DataPrivate(const char *begin, const char *end) - : data(begin, end) - { - } - - DataPrivate(uint len, char c) - : data(len, c) - { - } - - std::vector<char> data; -}; - -class ByteVector::ByteVectorPrivate : public RefCounter -{ -public: - ByteVectorPrivate() - : RefCounter() - , data(new DataPrivate()) - , offset(0) - , length(0) - { - } - - ByteVectorPrivate(ByteVectorPrivate *d, uint o, uint l) - : RefCounter() - , data(d->data) - , offset(d->offset + o) - , length(l) - { - data->ref(); - } - - ByteVectorPrivate(const std::vector<char> &v, uint o, uint l) - : RefCounter() - , data(new DataPrivate(v, o, l)) - , offset(0) - , length(l) - { - } - - ByteVectorPrivate(uint l, char c) - : RefCounter() - , data(new DataPrivate(l, c)) - , offset(0) - , length(l) - { - } - - ByteVectorPrivate(const char *s, uint l) - : RefCounter() - , data(new DataPrivate(s, s + l)) - , offset(0) - , length(l) - { - } - - void detach() - { - if(data->count() > 1) { - data->deref(); - data = new DataPrivate(data->data, offset, length); - offset = 0; - } - } - - ~ByteVectorPrivate() - { - if(data->deref()) - delete data; - } - - ByteVectorPrivate &operator=(const ByteVectorPrivate &x) - { - if(&x != this) - { - if(data->deref()) - delete data; - - data = x.data; - data->ref(); - } - - return *this; - } - - DataPrivate *data; - uint offset; - uint length; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -ByteVector ByteVector::null; - -ByteVector ByteVector::fromCString(const char *s, uint length) -{ - if(length == 0xffffffff) - return ByteVector(s, ::strlen(s)); - else - return ByteVector(s, length); -} - -ByteVector ByteVector::fromUInt(uint value, bool mostSignificantByteFirst) -{ - return fromNumber<uint>(value, mostSignificantByteFirst); -} - -ByteVector ByteVector::fromShort(short value, bool mostSignificantByteFirst) -{ - return fromNumber<ushort>(value, mostSignificantByteFirst); -} - -ByteVector ByteVector::fromLongLong(long long value, bool mostSignificantByteFirst) -{ - return fromNumber<unsigned long long>(value, mostSignificantByteFirst); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ByteVector::ByteVector() - : d(new ByteVectorPrivate()) -{ -} - -ByteVector::ByteVector(uint size, char value) - : d(new ByteVectorPrivate(size, value)) -{ -} - -ByteVector::ByteVector(const ByteVector &v) - : d(v.d) -{ - d->ref(); -} - -ByteVector::ByteVector(const ByteVector &v, uint offset, uint length) - : d(new ByteVectorPrivate(v.d, offset, length)) -{ -} - -ByteVector::ByteVector(char c) - : d(new ByteVectorPrivate(1, c)) -{ -} - -ByteVector::ByteVector(const char *data, uint length) - : d(new ByteVectorPrivate(data, length)) -{ -} - -ByteVector::ByteVector(const char *data) - : d(new ByteVectorPrivate(data, ::strlen(data))) -{ -} - -ByteVector::~ByteVector() -{ - if(d->deref()) - delete d; -} - -ByteVector &ByteVector::setData(const char *s, uint length) -{ - *this = ByteVector(s, length); - return *this; -} - -ByteVector &ByteVector::setData(const char *data) -{ - *this = ByteVector(data); - return *this; -} - -char *ByteVector::data() -{ - detach(); - return size() > 0 ? (DATA(d) + d->offset) : 0; -} - -const char *ByteVector::data() const -{ - return size() > 0 ? (DATA(d) + d->offset) : 0; -} - -ByteVector ByteVector::mid(uint index, uint length) const -{ - index = std::min(index, size()); - length = std::min(length, size() - index); - - return ByteVector(*this, index, length); -} - -char ByteVector::at(uint index) const -{ - return index < size() ? DATA(d)[d->offset + index] : 0; -} - -int ByteVector::find(const ByteVector &pattern, uint offset, int byteAlign) const -{ - return findVector<ConstIterator>( - begin(), end(), pattern.begin(), pattern.end(), offset, byteAlign); -} - -int ByteVector::find(char c, uint offset, int byteAlign) const -{ - return findChar<ConstIterator>(begin(), end(), c, offset, byteAlign); -} - -int ByteVector::rfind(const ByteVector &pattern, uint offset, int byteAlign) const -{ - if(offset > 0) { - offset = size() - offset - pattern.size(); - if(offset >= size()) - offset = 0; - } - - const int pos = findVector<ConstReverseIterator>( - rbegin(), rend(), pattern.rbegin(), pattern.rend(), offset, byteAlign); - - if(pos == -1) - return -1; - else - return size() - pos - pattern.size(); -} - -bool ByteVector::containsAt(const ByteVector &pattern, uint offset, uint patternOffset, uint patternLength) const -{ - if(pattern.size() < patternLength) - patternLength = pattern.size(); - - // do some sanity checking -- all of these things are needed for the search to be valid - const uint compareLength = patternLength - patternOffset; - if(offset + compareLength > size() || patternOffset >= pattern.size() || patternLength == 0) - return false; - - return (::memcmp(data() + offset, pattern.data() + patternOffset, compareLength) == 0); -} - -bool ByteVector::startsWith(const ByteVector &pattern) const -{ - return containsAt(pattern, 0); -} - -bool ByteVector::endsWith(const ByteVector &pattern) const -{ - return containsAt(pattern, size() - pattern.size()); -} - -ByteVector &ByteVector::replace(const ByteVector &pattern, const ByteVector &with) -{ - if(pattern.size() == 0 || pattern.size() > size()) - return *this; - - const uint withSize = with.size(); - const uint patternSize = pattern.size(); - int offset = 0; - - if(withSize == patternSize) { - // I think this case might be common enough to optimize it - detach(); - offset = find(pattern); - while(offset >= 0) { - ::memcpy(data() + offset, with.data(), withSize); - offset = find(pattern, offset + withSize); - } - return *this; - } - - // calculate new size: - uint newSize = 0; - for(;;) { - int next = find(pattern, offset); - if(next < 0) { - if(offset == 0) - // pattern not found, do nothing: - return *this; - newSize += size() - offset; - break; - } - newSize += (next - offset) + withSize; - offset = next + patternSize; - } - - // new private data of appropriate size: - ByteVectorPrivate *newData = new ByteVectorPrivate(newSize, 0); - char *target = DATA(newData); - const char *source = data(); - - // copy modified data into new private data: - offset = 0; - for(;;) { - int next = find(pattern, offset); - if(next < 0) { - ::memcpy(target, source + offset, size() - offset); - break; - } - int chunkSize = next - offset; - ::memcpy(target, source + offset, chunkSize); - target += chunkSize; - ::memcpy(target, with.data(), withSize); - target += withSize; - offset += chunkSize + patternSize; - } - - // replace private data: - if(d->deref()) - delete d; - - d = newData; - - return *this; -} - -int ByteVector::endsWithPartialMatch(const ByteVector &pattern) const -{ - if(pattern.size() > size()) - return -1; - - const int startIndex = size() - pattern.size(); - - // try to match the last n-1 bytes from the vector (where n is the pattern - // size) -- continue trying to match n-2, n-3...1 bytes - - for(uint i = 1; i < pattern.size(); i++) { - if(containsAt(pattern, startIndex + i, 0, pattern.size() - i)) - return startIndex + i; - } - - return -1; -} - -ByteVector &ByteVector::append(const ByteVector &v) -{ - if(v.d->length != 0) - { - detach(); - - uint originalSize = size(); - resize(originalSize + v.size()); - ::memcpy(data() + originalSize, v.data(), v.size()); - } - - return *this; -} - -ByteVector &ByteVector::clear() -{ - *this = ByteVector(); - return *this; -} - -TagLib::uint ByteVector::size() const -{ - return d->length; -} - -ByteVector &ByteVector::resize(uint size, char padding) -{ - if(size != d->length) { - detach(); - d->data->data.resize(d->offset + size, padding); - d->length = size; - } - - return *this; -} - -ByteVector::Iterator ByteVector::begin() -{ - return d->data->data.begin() + d->offset; -} - -ByteVector::ConstIterator ByteVector::begin() const -{ - return d->data->data.begin() + d->offset; -} - -ByteVector::Iterator ByteVector::end() -{ - return d->data->data.begin() + d->offset + d->length; -} - -ByteVector::ConstIterator ByteVector::end() const -{ - return d->data->data.begin() + d->offset + d->length; -} - -ByteVector::ReverseIterator ByteVector::rbegin() -{ - std::vector<char> &v = d->data->data; - return v.rbegin() + (v.size() - (d->offset + d->length)); -} - -ByteVector::ConstReverseIterator ByteVector::rbegin() const -{ - std::vector<char> &v = d->data->data; - return v.rbegin() + (v.size() - (d->offset + d->length)); -} - -ByteVector::ReverseIterator ByteVector::rend() -{ - std::vector<char> &v = d->data->data; - return v.rbegin() + (v.size() - d->offset); -} - -ByteVector::ConstReverseIterator ByteVector::rend() const -{ - std::vector<char> &v = d->data->data; - return v.rbegin() + (v.size() - d->offset); -} - -bool ByteVector::isNull() const -{ - return (d == null.d); -} - -bool ByteVector::isEmpty() const -{ - return (d->length == 0); -} - -TagLib::uint ByteVector::checksum() const -{ - uint sum = 0; - for(ByteVector::ConstIterator it = begin(); it != end(); ++it) - sum = (sum << 8) ^ crcTable[((sum >> 24) & 0xff) ^ uchar(*it)]; - return sum; -} - -TagLib::uint ByteVector::toUInt(bool mostSignificantByteFirst) const -{ - return toNumber<uint>(*this, 0, mostSignificantByteFirst); -} - -TagLib::uint ByteVector::toUInt(uint offset, bool mostSignificantByteFirst) const -{ - return toNumber<uint>(*this, offset, mostSignificantByteFirst); -} - -TagLib::uint ByteVector::toUInt(uint offset, uint length, bool mostSignificantByteFirst) const -{ - return toNumber<uint>(*this, offset, length, mostSignificantByteFirst); -} - -short ByteVector::toShort(bool mostSignificantByteFirst) const -{ - return toNumber<unsigned short>(*this, 0, mostSignificantByteFirst); -} - -short ByteVector::toShort(uint offset, bool mostSignificantByteFirst) const -{ - return toNumber<unsigned short>(*this, offset, mostSignificantByteFirst); -} - -unsigned short ByteVector::toUShort(bool mostSignificantByteFirst) const -{ - return toNumber<unsigned short>(*this, 0, mostSignificantByteFirst); -} - -unsigned short ByteVector::toUShort(uint offset, bool mostSignificantByteFirst) const -{ - return toNumber<unsigned short>(*this, offset, mostSignificantByteFirst); -} - -long long ByteVector::toLongLong(bool mostSignificantByteFirst) const -{ - return toNumber<unsigned long long>(*this, 0, mostSignificantByteFirst); -} - -long long ByteVector::toLongLong(uint offset, bool mostSignificantByteFirst) const -{ - return toNumber<unsigned long long>(*this, offset, mostSignificantByteFirst); -} - -const char &ByteVector::operator[](int index) const -{ - return d->data->data[d->offset + index]; -} - -char &ByteVector::operator[](int index) -{ - detach(); - return d->data->data[d->offset + index]; -} - -bool ByteVector::operator==(const ByteVector &v) const -{ - if(size() != v.size()) - return false; - - return (::memcmp(data(), v.data(), size()) == 0); -} - -bool ByteVector::operator!=(const ByteVector &v) const -{ - return !operator==(v); -} - -bool ByteVector::operator==(const char *s) const -{ - if(size() != ::strlen(s)) - return false; - - return (::memcmp(data(), s, size()) == 0); -} - -bool ByteVector::operator!=(const char *s) const -{ - return !operator==(s); -} - -bool ByteVector::operator<(const ByteVector &v) const -{ - const int result = ::memcmp(data(), v.data(), std::min(size(), v.size())); - if(result != 0) - return result < 0; - else - return size() < v.size(); -} - -bool ByteVector::operator>(const ByteVector &v) const -{ - return v < *this; -} - -ByteVector ByteVector::operator+(const ByteVector &v) const -{ - ByteVector sum(*this); - sum.append(v); - return sum; -} - -ByteVector &ByteVector::operator=(const ByteVector &v) -{ - if(&v == this) - return *this; - - if(d->deref()) - delete d; - - d = v.d; - d->ref(); - return *this; -} - -ByteVector &ByteVector::operator=(char c) -{ - *this = ByteVector(c); - return *this; -} - -ByteVector &ByteVector::operator=(const char *data) -{ - *this = ByteVector(data); - return *this; -} - -ByteVector ByteVector::toHex() const -{ - ByteVector encoded(size() * 2); - char *p = encoded.data(); - - for(uint i = 0; i < size(); i++) { - unsigned char c = data()[i]; - *p++ = hexTable[(c >> 4) & 0x0F]; - *p++ = hexTable[(c ) & 0x0F]; - } - - return encoded; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void ByteVector::detach() -{ - if(d->data->count() > 1) { - d->data->deref(); - d->data = new DataPrivate(d->data->data, d->offset, d->length); - d->offset = 0; - } - - if(d->count() > 1) { - d->deref(); - d = new ByteVectorPrivate(d->data->data, d->offset, d->length); - } -} -} - -//////////////////////////////////////////////////////////////////////////////// -// related functions -//////////////////////////////////////////////////////////////////////////////// - -std::ostream &operator<<(std::ostream &s, const TagLib::ByteVector &v) -{ - for(TagLib::uint i = 0; i < v.size(); i++) - s << v[i]; - return s; -} diff --git a/src/taglib/taglib/toolkit/tbytevector.h b/src/taglib/taglib/toolkit/tbytevector.h deleted file mode 100644 index 538565b..0000000 --- a/src/taglib/taglib/toolkit/tbytevector.h +++ /dev/null @@ -1,518 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_BYTEVECTOR_H -#define TAGLIB_BYTEVECTOR_H - -#include "taglib.h" -#include "taglib_export.h" - -#include <vector> -#include <iostream> - -namespace TagLib { - - //! A byte vector - - /*! - * This class provides a byte vector with some methods that are useful for - * tagging purposes. Many of the search functions are tailored to what is - * useful for finding tag related paterns in a data array. - */ - - class TAGLIB_EXPORT ByteVector - { - public: -#ifndef DO_NOT_DOCUMENT - typedef std::vector<char>::iterator Iterator; - typedef std::vector<char>::const_iterator ConstIterator; - typedef std::vector<char>::reverse_iterator ReverseIterator; - typedef std::vector<char>::const_reverse_iterator ConstReverseIterator; -#endif - - /*! - * Constructs an empty byte vector. - */ - ByteVector(); - - /*! - * Construct a vector of size \a size with all values set to \a value by - * default. - */ - ByteVector(uint size, char value = 0); - - /*! - * Constructs a byte vector that is a copy of \a v. - */ - ByteVector(const ByteVector &v); - - /*! - * Constructs a byte vector that is a copy of \a v. - */ - ByteVector(const ByteVector &v, uint offset, uint length); - - /*! - * Constructs a byte vector that contains \a c. - */ - ByteVector(char c); - - /*! - * Constructs a byte vector that copies \a data for up to \a length bytes. - */ - ByteVector(const char *data, uint length); - - /*! - * Constructs a byte vector that copies \a data up to the first null - * byte. The behavior is undefined if \a data is not null terminated. - * This is particularly useful for constructing byte arrays from string - * constants. - */ - ByteVector(const char *data); - - /*! - * Destroys this ByteVector instance. - */ - virtual ~ByteVector(); - - /*! - * Sets the data for the byte array using the first \a length bytes of \a data - */ - ByteVector &setData(const char *data, uint length); - - /*! - * Sets the data for the byte array copies \a data up to the first null - * byte. The behavior is undefined if \a data is not null terminated. - */ - ByteVector &setData(const char *data); - - /*! - * Returns a pointer to the internal data structure. - * - * \warning Care should be taken when modifying this data structure as it is - * easy to corrupt the ByteVector when doing so. Specifically, while the - * data may be changed, its length may not be. - */ - char *data(); - - /*! - * Returns a pointer to the internal data structure which may not be modified. - */ - const char *data() const; - - /*! - * Returns a byte vector made up of the bytes starting at \a index and - * for \a length bytes. If \a length is not specified it will return the bytes - * from \a index to the end of the vector. - */ - ByteVector mid(uint index, uint length = 0xffffffff) const; - - /*! - * This essentially performs the same as operator[](), but instead of causing - * a runtime error if the index is out of bounds, it will return a null byte. - */ - char at(uint index) const; - - /*! - * Searches the ByteVector for \a pattern starting at \a offset and returns - * the offset. Returns -1 if the pattern was not found. If \a byteAlign is - * specified the pattern will only be matched if it starts on a byte divisible - * by \a byteAlign (starting from \a offset). - */ - int find(const ByteVector &pattern, uint offset = 0, int byteAlign = 1) const; - - /*! - * Searches the char for \a c starting at \a offset and returns - * the offset. Returns \a npos if the pattern was not found. If \a byteAlign is - * specified the pattern will only be matched if it starts on a byte divisible - * by \a byteAlign (starting from \a offset). - */ - int find(char c, uint offset = 0, int byteAlign = 1) const; - - /*! - * Searches the ByteVector for \a pattern starting from either the end of the - * vector or \a offset and returns the offset. Returns -1 if the pattern was - * not found. If \a byteAlign is specified the pattern will only be matched - * if it starts on a byte divisible by \a byteAlign (starting from \a offset). - */ - int rfind(const ByteVector &pattern, uint offset = 0, int byteAlign = 1) const; - - /*! - * Checks to see if the vector contains the \a pattern starting at position - * \a offset. Optionally, if you only want to search for part of the pattern - * you can specify an offset within the pattern to start from. Also, you can - * specify to only check for the first \a patternLength bytes of \a pattern with - * the \a patternLength argument. - */ - bool containsAt(const ByteVector &pattern, uint offset, uint patternOffset = 0, uint patternLength = 0xffffffff) const; - - /*! - * Returns true if the vector starts with \a pattern. - */ - bool startsWith(const ByteVector &pattern) const; - - /*! - * Returns true if the vector ends with \a pattern. - */ - bool endsWith(const ByteVector &pattern) const; - - /*! - * Replaces \a pattern with \a with and returns a reference to the ByteVector - * after the operation. This \e does modify the vector. - */ - ByteVector &replace(const ByteVector &pattern, const ByteVector &with); - - /*! - * Checks for a partial match of \a pattern at the end of the vector. It - * returns the offset of the partial match within the vector, or -1 if the - * pattern is not found. This method is particularly useful when searching for - * patterns that start in one vector and end in another. When combined with - * startsWith() it can be used to find a pattern that overlaps two buffers. - * - * \note This will not match the complete pattern at the end of the string; use - * endsWith() for that. - */ - int endsWithPartialMatch(const ByteVector &pattern) const; - - /*! - * Appends \a v to the end of the ByteVector. - */ - ByteVector &append(const ByteVector &v); - - /*! - * Clears the data. - */ - ByteVector &clear(); - - /*! - * Returns the size of the array. - */ - uint size() const; - - /*! - * Resize the vector to \a size. If the vector is currently less than - * \a size, pad the remaining spaces with \a padding. Returns a reference - * to the resized vector. - */ - ByteVector &resize(uint size, char padding = 0); - - /*! - * Returns an Iterator that points to the front of the vector. - */ - Iterator begin(); - - /*! - * Returns a ConstIterator that points to the front of the vector. - */ - ConstIterator begin() const; - - /*! - * Returns an Iterator that points to the back of the vector. - */ - Iterator end(); - - /*! - * Returns a ConstIterator that points to the back of the vector. - */ - ConstIterator end() const; - - /*! - * Returns a ReverseIterator that points to the front of the vector. - */ - ReverseIterator rbegin(); - - /*! - * Returns a ConstReverseIterator that points to the front of the vector. - */ - ConstReverseIterator rbegin() const; - - /*! - * Returns a ReverseIterator that points to the back of the vector. - */ - ReverseIterator rend(); - - /*! - * Returns a ConstReverseIterator that points to the back of the vector. - */ - ConstReverseIterator rend() const; - - /*! - * Returns true if the vector is null. - * - * \note A vector may be empty without being null. - * \see isEmpty() - */ - bool isNull() const; - - /*! - * Returns true if the ByteVector is empty. - * - * \see size() - * \see isNull() - */ - bool isEmpty() const; - - /*! - * Returns a CRC checksum of the byte vector's data. - */ - uint checksum() const; - - /*! - * Converts the first 4 bytes of the vector to an unsigned integer. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see fromUInt() - */ - uint toUInt(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the 4 bytes at \a offset of the vector to an unsigned integer. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see fromUInt() - */ - uint toUInt(uint offset, bool mostSignificantByteFirst = true) const; - - /*! - * Converts the \a length bytes at \a offset of the vector to an unsigned - * integer. If \a length is larger than 4, the excess is ignored. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see fromUInt() - */ - uint toUInt(uint offset, uint length, bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 2 bytes of the vector to a (signed) short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - short toShort(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the 2 bytes at \a offset of the vector to a (signed) short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - short toShort(uint offset, bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 2 bytes of the vector to a unsigned short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - unsigned short toUShort(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the 2 bytes at \a offset of the vector to a unsigned short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - unsigned short toUShort(uint offset, bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 8 bytes of the vector to a (signed) long long. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 00 00 00 00 00 00 01 == 0x0000000000000001 == 1, - * if false, $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. - * - * \see fromUInt() - */ - long long toLongLong(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the 8 bytes at \a offset of the vector to a (signed) long long. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 00 00 00 00 00 00 01 == 0x0000000000000001 == 1, - * if false, $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. - * - * \see fromUInt() - */ - long long toLongLong(uint offset, bool mostSignificantByteFirst = true) const; - - /*! - * Creates a 4 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 00 00 01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see toUInt() - */ - static ByteVector fromUInt(uint value, bool mostSignificantByteFirst = true); - - /*! - * Creates a 2 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 01 == 0x0001 == 1, if false, $01 00 == 0x0100 == 1. - * - * \see toShort() - */ - static ByteVector fromShort(short value, bool mostSignificantByteFirst = true); - - /*! - * Creates a 8 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 00 00 01 == 0x0000000000000001 == 1, if false, - * $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. - * - * \see toLongLong() - */ - static ByteVector fromLongLong(long long value, bool mostSignificantByteFirst = true); - - /*! - * Returns a ByteVector based on the CString \a s. - */ - static ByteVector fromCString(const char *s, uint length = 0xffffffff); - - /*! - * Returns a const refernence to the byte at \a index. - */ - const char &operator[](int index) const; - - /*! - * Returns a reference to the byte at \a index. - */ - char &operator[](int index); - - /*! - * Returns true if this ByteVector and \a v are equal. - */ - bool operator==(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector and \a v are not equal. - */ - bool operator!=(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector and the null terminated C string \a s - * contain the same data. - */ - bool operator==(const char *s) const; - - /*! - * Returns true if this ByteVector and the null terminated C string \a s - * do not contain the same data. - */ - bool operator!=(const char *s) const; - - /*! - * Returns true if this ByteVector is less than \a v. The value of the - * vectors is determined by evaluating the character from left to right, and - * in the event one vector is a superset of the other, the size is used. - */ - bool operator<(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector is greater than \a v. - */ - bool operator>(const ByteVector &v) const; - - /*! - * Returns a vector that is \a v appended to this vector. - */ - ByteVector operator+(const ByteVector &v) const; - - /*! - * Copies ByteVector \a v. - */ - ByteVector &operator=(const ByteVector &v); - - /*! - * Copies ByteVector \a v. - */ - ByteVector &operator=(char c); - - /*! - * Copies ByteVector \a v. - */ - ByteVector &operator=(const char *data); - - /*! - * A static, empty ByteVector which is convenient and fast (since returning - * an empty or "null" value does not require instantiating a new ByteVector). - */ - static ByteVector null; - - /*! - * Returns a hex-encoded copy of the byte vector. - */ - ByteVector toHex() const; - - protected: - /* - * If this ByteVector is being shared via implicit sharing, do a deep copy - * of the data and separate from the shared members. This should be called - * by all non-const subclass members. - */ - void detach(); - - private: - class ByteVectorPrivate; - ByteVectorPrivate *d; - }; -} - -/*! - * \relates TagLib::ByteVector - * Streams the ByteVector \a v to the output stream \a s. - */ -TAGLIB_EXPORT std::ostream &operator<<(std::ostream &s, const TagLib::ByteVector &v); - -#endif diff --git a/src/taglib/taglib/toolkit/tbytevectorlist.cpp b/src/taglib/taglib/toolkit/tbytevectorlist.cpp deleted file mode 100644 index 7ea893f..0000000 --- a/src/taglib/taglib/toolkit/tbytevectorlist.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tbytevectorlist.h" - -using namespace TagLib; - -class ByteVectorListPrivate -{ - -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -ByteVectorList ByteVectorList::split(const ByteVector &v, const ByteVector &pattern, - int byteAlign) -{ - return split(v, pattern, byteAlign, 0); -} - -ByteVectorList ByteVectorList::split(const ByteVector &v, const ByteVector &pattern, - int byteAlign, int max) -{ - ByteVectorList l; - - uint previousOffset = 0; - for(int offset = v.find(pattern, 0, byteAlign); - offset != -1 && (max == 0 || max > int(l.size()) + 1); - offset = v.find(pattern, offset + pattern.size(), byteAlign)) - { - if(offset - previousOffset >= 1) - l.append(v.mid(previousOffset, offset - previousOffset)); - else - l.append(ByteVector::null); - - previousOffset = offset + pattern.size(); - } - - if(previousOffset < v.size()) - l.append(v.mid(previousOffset, v.size() - previousOffset)); - - return l; -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ByteVectorList::ByteVectorList() : List<ByteVector>() -{ - -} - -ByteVectorList::ByteVectorList(const ByteVectorList &l) : List<ByteVector>(l) -{ - -} - -ByteVectorList::~ByteVectorList() -{ - -} - -ByteVector ByteVectorList::toByteVector(const ByteVector &separator) const -{ - ByteVector v; - - ConstIterator it = begin(); - - while(it != end()) { - v.append(*it); - it++; - if(it != end()) - v.append(separator); - } - - return v; -} diff --git a/src/taglib/taglib/toolkit/tbytevectorlist.h b/src/taglib/taglib/toolkit/tbytevectorlist.h deleted file mode 100644 index 5852583..0000000 --- a/src/taglib/taglib/toolkit/tbytevectorlist.h +++ /dev/null @@ -1,91 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_BYTEVECTORLIST_H -#define TAGLIB_BYTEVECTORLIST_H - -#include "taglib_export.h" -#include "tbytevector.h" -#include "tlist.h" - -namespace TagLib { - - //! A list of ByteVectors - - /*! - * A List specialization with some handy features useful for ByteVectors. - */ - - class TAGLIB_EXPORT ByteVectorList : public List<ByteVector> - { - public: - - /*! - * Construct an empty ByteVectorList. - */ - ByteVectorList(); - - /*! - * Destroys this ByteVectorList instance. - */ - virtual ~ByteVectorList(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - ByteVectorList(const ByteVectorList &l); - - /*! - * Convert the ByteVectorList to a ByteVector separated by \a separator. By - * default a space is used. - */ - ByteVector toByteVector(const ByteVector &separator = " ") const; - - /*! - * Splits the ByteVector \a v into several strings at \a pattern. This will - * not include the pattern in the returned ByteVectors. - */ - static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, - int byteAlign = 1); - /*! - * Splits the ByteVector \a v into several strings at \a pattern. This will - * not include the pattern in the returned ByteVectors. \a max is the - * maximum number of entries that will be separated. If \a max for instance - * is 2 then a maximum of 1 match will be found and the vector will be split - * on that match. - */ - // BIC: merge with the function above - static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, - int byteAlign, int max); - private: - class ByteVectorListPrivate; - ByteVectorListPrivate *d; - }; - -} - -#endif diff --git a/src/taglib/taglib/toolkit/tbytevectorstream.cpp b/src/taglib/taglib/toolkit/tbytevectorstream.cpp deleted file mode 100644 index dc480a2..0000000 --- a/src/taglib/taglib/toolkit/tbytevectorstream.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tbytevectorstream.h" -#include "tstring.h" -#include "tdebug.h" - -#include <stdio.h> -#include <string.h> - -#include <stdlib.h> - -using namespace TagLib; - -class ByteVectorStream::ByteVectorStreamPrivate -{ -public: - ByteVectorStreamPrivate(const ByteVector &data); - - ByteVector data; - long position; -}; - -ByteVectorStream::ByteVectorStreamPrivate::ByteVectorStreamPrivate(const ByteVector &data) : - data(data), - position(0) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ByteVectorStream::ByteVectorStream(const ByteVector &data) -{ - d = new ByteVectorStreamPrivate(data); -} - -ByteVectorStream::~ByteVectorStream() -{ - delete d; -} - -FileName ByteVectorStream::name() const -{ - return FileName(""); // XXX do we need a name? -} - -ByteVector ByteVectorStream::readBlock(ulong length) -{ - if(length == 0) - return ByteVector::null; - - ByteVector v = d->data.mid(d->position, length); - d->position += v.size(); - return v; -} - -void ByteVectorStream::writeBlock(const ByteVector &data) -{ - uint size = data.size(); - if(long(d->position + size) > length()) { - truncate(d->position + size); - } - memcpy(d->data.data() + d->position, data.data(), size); - d->position += size; -} - -void ByteVectorStream::insert(const ByteVector &data, ulong start, ulong replace) -{ - long sizeDiff = data.size() - replace; - if(sizeDiff < 0) { - removeBlock(start + data.size(), -sizeDiff); - } - else if(sizeDiff > 0) { - truncate(length() + sizeDiff); - ulong readPosition = start + replace; - ulong writePosition = start + data.size(); - memmove(d->data.data() + writePosition, d->data.data() + readPosition, length() - sizeDiff - readPosition); - } - seek(start); - writeBlock(data); -} - -void ByteVectorStream::removeBlock(ulong start, ulong length) -{ - ulong readPosition = start + length; - ulong writePosition = start; - if(readPosition < ulong(ByteVectorStream::length())) { - ulong bytesToMove = ByteVectorStream::length() - readPosition; - memmove(d->data.data() + writePosition, d->data.data() + readPosition, bytesToMove); - writePosition += bytesToMove; - } - d->position = writePosition; - truncate(writePosition); -} - -bool ByteVectorStream::readOnly() const -{ - return false; -} - -bool ByteVectorStream::isOpen() const -{ - return true; -} - -void ByteVectorStream::seek(long offset, Position p) -{ - switch(p) { - case Beginning: - d->position = offset; - break; - case Current: - d->position += offset; - break; - case End: - d->position = length() - offset; - break; - } -} - -void ByteVectorStream::clear() -{ -} - -long ByteVectorStream::tell() const -{ - return d->position; -} - -long ByteVectorStream::length() -{ - return d->data.size(); -} - -void ByteVectorStream::truncate(long length) -{ - d->data.resize(length); -} - -ByteVector *ByteVectorStream::data() -{ - return &d->data; -} diff --git a/src/taglib/taglib/toolkit/tbytevectorstream.h b/src/taglib/taglib/toolkit/tbytevectorstream.h deleted file mode 100644 index 456b854..0000000 --- a/src/taglib/taglib/toolkit/tbytevectorstream.h +++ /dev/null @@ -1,145 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_BYTEVECTORSTREAM_H -#define TAGLIB_BYTEVECTORSTREAM_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tbytevector.h" -#include "tiostream.h" - -namespace TagLib { - - class String; - class Tag; - class AudioProperties; - - //! In-memory Stream class using ByteVector for its storage. - - class TAGLIB_EXPORT ByteVectorStream : public IOStream - { - public: - /*! - * Construct a File object and opens the \a file. \a file should be a - * be a C-string in the local file system encoding. - */ - ByteVectorStream(const ByteVector &data); - - /*! - * Destroys this ByteVectorStream instance. - */ - virtual ~ByteVectorStream(); - - /*! - * Returns the file name in the local file system encoding. - */ - FileName name() const; - - /*! - * Reads a block of size \a length at the current get pointer. - */ - ByteVector readBlock(ulong length); - - /*! - * Attempts to write the block \a data at the current get pointer. If the - * file is currently only opened read only -- i.e. readOnly() returns true -- - * this attempts to reopen the file in read/write mode. - * - * \note This should be used instead of using the streaming output operator - * for a ByteVector. And even this function is significantly slower than - * doing output with a char[]. - */ - void writeBlock(const ByteVector &data); - - /*! - * Insert \a data at position \a start in the file overwriting \a replace - * bytes of the original content. - * - * \note This method is slow since it requires rewriting all of the file - * after the insertion point. - */ - void insert(const ByteVector &data, ulong start = 0, ulong replace = 0); - - /*! - * Removes a block of the file starting a \a start and continuing for - * \a length bytes. - * - * \note This method is slow since it involves rewriting all of the file - * after the removed portion. - */ - void removeBlock(ulong start = 0, ulong length = 0); - - /*! - * Returns true if the file is read only (or if the file can not be opened). - */ - bool readOnly() const; - - /*! - * Since the file can currently only be opened as an argument to the - * constructor (sort-of by design), this returns if that open succeeded. - */ - bool isOpen() const; - - /*! - * Move the I/O pointer to \a offset in the file from position \a p. This - * defaults to seeking from the beginning of the file. - * - * \see Position - */ - void seek(long offset, Position p = Beginning); - - /*! - * Reset the end-of-file and error flags on the file. - */ - void clear(); - - /*! - * Returns the current offset within the file. - */ - long tell() const; - - /*! - * Returns the length of the file. - */ - long length(); - - /*! - * Truncates the file to a \a length. - */ - void truncate(long length); - - ByteVector *data(); - - protected: - - private: - class ByteVectorStreamPrivate; - ByteVectorStreamPrivate *d; - }; - -} - -#endif diff --git a/src/taglib/taglib/toolkit/tdebug.cpp b/src/taglib/taglib/toolkit/tdebug.cpp deleted file mode 100644 index 71350af..0000000 --- a/src/taglib/taglib/toolkit/tdebug.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "tdebug.h" -#include "tstring.h" -#include "tdebuglistener.h" - -#include <bitset> -#include <cstdio> -#include <cstdarg> - -using namespace TagLib; - -namespace -{ - String format(const char *fmt, ...) - { - va_list args; - va_start(args, fmt); - - char buf[256]; - -#if defined(HAVE_SNPRINTF) - - vsnprintf(buf, sizeof(buf), fmt, args); - -#elif defined(HAVE_SPRINTF_S) - - vsprintf_s(buf, fmt, args); - -#else - - // Be careful. May cause a buffer overflow. - vsprintf(buf, fmt, args); - -#endif - - va_end(args); - - return String(buf); - } -} - -namespace TagLib -{ - // The instance is defined in tdebuglistener.cpp. - extern DebugListener *debugListener; - - void debug(const String &s) - { -#if !defined(NDEBUG) || defined(TRACE_IN_RELEASE) - - debugListener->printMessage("TagLib: " + s + "\n"); - -#endif - } - - void debugData(const ByteVector &v) - { -#if !defined(NDEBUG) || defined(TRACE_IN_RELEASE) - - for(size_t i = 0; i < v.size(); ++i) - { - std::string bits = std::bitset<8>(v[i]).to_string(); - String msg = format("*** [%d] - char '%c' - int %d, 0x%02x, 0b%s\n", - i, v[i], v[i], v[i], bits.c_str()); - - debugListener->printMessage(msg); - } - -#endif - } -} diff --git a/src/taglib/taglib/toolkit/tdebug.h b/src/taglib/taglib/toolkit/tdebug.h deleted file mode 100644 index bd94d15..0000000 --- a/src/taglib/taglib/toolkit/tdebug.h +++ /dev/null @@ -1,62 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_DEBUG_H -#define TAGLIB_DEBUG_H - -namespace TagLib { - - class String; - class ByteVector; - -#ifndef DO_NOT_DOCUMENT - - /*! - * A simple function that outputs the debug messages to the listener. - * The default listener redirects the messages to \a stderr when NDEBUG is - * not defined. - * - * \warning Do not use this outside of TagLib, it could lead to undefined - * symbols in your build if TagLib is built with NDEBUG defined and your - * application is not. - * - * \internal - */ - void debug(const String &s); - - /*! - * For debugging binary data. - * - * \warning Do not use this outside of TagLib, it could lead to undefined - * symbols in your build if TagLib is built with NDEBUG defined and your - * application is not. - * - * \internal - */ - void debugData(const ByteVector &v); -} - -#endif -#endif diff --git a/src/taglib/taglib/toolkit/tdebuglistener.cpp b/src/taglib/taglib/toolkit/tdebuglistener.cpp deleted file mode 100644 index 4891222..0000000 --- a/src/taglib/taglib/toolkit/tdebuglistener.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tdebuglistener.h" - -#include <iostream> -#include <bitset> - -#ifdef _WIN32 -# include <windows.h> -#endif - -using namespace TagLib; - -namespace -{ - class DefaultListener : public DebugListener - { - public: - virtual void printMessage(const String &msg) - { -#ifdef _WIN32 - - const wstring wstr = msg.toWString(); - const int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL); - if(len != 0) { - std::vector<char> buf(len); - WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &buf[0], len, NULL, NULL); - - std::cerr << std::string(&buf[0]); - } - -#else - - std::cerr << msg; - -#endif - } - }; - - DefaultListener defaultListener; -} - -namespace TagLib -{ - DebugListener *debugListener = &defaultListener; - - DebugListener::DebugListener() - { - } - - DebugListener::~DebugListener() - { - } - - void setDebugListener(DebugListener *listener) - { - if(listener) - debugListener = listener; - else - debugListener = &defaultListener; - } -} diff --git a/src/taglib/taglib/toolkit/tdebuglistener.h b/src/taglib/taglib/toolkit/tdebuglistener.h deleted file mode 100644 index a32f285..0000000 --- a/src/taglib/taglib/toolkit/tdebuglistener.h +++ /dev/null @@ -1,74 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_DEBUGLISTENER_H -#define TAGLIB_DEBUGLISTENER_H - -#include "taglib_export.h" -#include "tstring.h" - -namespace TagLib -{ - //! An abstraction for the listener to the debug messages. - - /*! - * This class enables you to handle the debug messages in your preferred - * way by subclassing this class, reimplementing printMessage() and setting - * your reimplementation as the default with setDebugListener(). - * - * \see setDebugListener() - */ - class TAGLIB_EXPORT DebugListener - { - public: - DebugListener(); - virtual ~DebugListener(); - - /*! - * When overridden in a derived class, redirects \a msg to your preferred - * channel such as stderr, Windows debugger or so forth. - */ - virtual void printMessage(const String &msg) = 0; - - private: - // Noncopyable - DebugListener(const DebugListener &); - DebugListener &operator=(const DebugListener &); - }; - - /*! - * Sets the listener that decides how the debug messages are redirected. - * If the parameter \a listener is null, the previous listener is released - * and default stderr listener is restored. - * - * \note The caller is responsible for deleting the previous listener - * as needed after it is released. - * - * \see DebugListener - */ - TAGLIB_EXPORT void setDebugListener(DebugListener *listener); -} - -#endif diff --git a/src/taglib/taglib/toolkit/tfile.cpp b/src/taglib/taglib/toolkit/tfile.cpp deleted file mode 100644 index 4a05b05..0000000 --- a/src/taglib/taglib/toolkit/tfile.cpp +++ /dev/null @@ -1,503 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tfile.h" -#include "tfilestream.h" -#include "tstring.h" -#include "tdebug.h" -#include "tpropertymap.h" - -#ifdef _WIN32 -# include <windows.h> -# include <io.h> -#else -# include <stdio.h> -# include <unistd.h> -#endif - -#ifndef R_OK -# define R_OK 4 -#endif -#ifndef W_OK -# define W_OK 2 -#endif - -#include "asffile.h" -#include "mpegfile.h" -#include "vorbisfile.h" -#include "flacfile.h" -#include "oggflacfile.h" -#include "mpcfile.h" -#include "mp4file.h" -#include "wavpackfile.h" -#include "speexfile.h" -#include "opusfile.h" -#include "trueaudiofile.h" -#include "aifffile.h" -#include "wavfile.h" -#include "apefile.h" -#include "modfile.h" -#include "s3mfile.h" -#include "itfile.h" -#include "xmfile.h" -#include "mp4file.h" - -using namespace TagLib; - -namespace -{ -#ifdef _WIN32 - const TagLib::uint BufferSize = 8192; -#else - const TagLib::uint BufferSize = 1024; -#endif -} - -class File::FilePrivate -{ -public: - FilePrivate(IOStream *stream, bool owner); - - IOStream *stream; - bool streamOwner; - bool valid; -}; - -File::FilePrivate::FilePrivate(IOStream *stream, bool owner) : - stream(stream), - streamOwner(owner), - valid(true) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -File::File(FileName fileName) -{ - IOStream *stream = new FileStream(fileName); - d = new FilePrivate(stream, true); -} - -File::File(IOStream *stream) -{ - d = new FilePrivate(stream, false); -} - -File::~File() -{ - if(d->stream && d->streamOwner) - delete d->stream; - delete d; -} - -FileName File::name() const -{ - return d->stream->name(); -} - -PropertyMap File::properties() const -{ - // ugly workaround until this method is virtual - if(dynamic_cast<const APE::File* >(this)) - return dynamic_cast<const APE::File* >(this)->properties(); - if(dynamic_cast<const FLAC::File* >(this)) - return dynamic_cast<const FLAC::File* >(this)->properties(); - if(dynamic_cast<const IT::File* >(this)) - return dynamic_cast<const IT::File* >(this)->properties(); - if(dynamic_cast<const Mod::File* >(this)) - return dynamic_cast<const Mod::File* >(this)->properties(); - if(dynamic_cast<const MPC::File* >(this)) - return dynamic_cast<const MPC::File* >(this)->properties(); - if(dynamic_cast<const MPEG::File* >(this)) - return dynamic_cast<const MPEG::File* >(this)->properties(); - if(dynamic_cast<const Ogg::FLAC::File* >(this)) - return dynamic_cast<const Ogg::FLAC::File* >(this)->properties(); - if(dynamic_cast<const Ogg::Speex::File* >(this)) - return dynamic_cast<const Ogg::Speex::File* >(this)->properties(); - if(dynamic_cast<const Ogg::Opus::File* >(this)) - return dynamic_cast<const Ogg::Opus::File* >(this)->properties(); - if(dynamic_cast<const Ogg::Vorbis::File* >(this)) - return dynamic_cast<const Ogg::Vorbis::File* >(this)->properties(); - if(dynamic_cast<const RIFF::AIFF::File* >(this)) - return dynamic_cast<const RIFF::AIFF::File* >(this)->properties(); - if(dynamic_cast<const RIFF::WAV::File* >(this)) - return dynamic_cast<const RIFF::WAV::File* >(this)->properties(); - if(dynamic_cast<const S3M::File* >(this)) - return dynamic_cast<const S3M::File* >(this)->properties(); - if(dynamic_cast<const TrueAudio::File* >(this)) - return dynamic_cast<const TrueAudio::File* >(this)->properties(); - if(dynamic_cast<const WavPack::File* >(this)) - return dynamic_cast<const WavPack::File* >(this)->properties(); - if(dynamic_cast<const XM::File* >(this)) - return dynamic_cast<const XM::File* >(this)->properties(); - if(dynamic_cast<const MP4::File* >(this)) - return dynamic_cast<const MP4::File* >(this)->properties(); - if(dynamic_cast<const ASF::File* >(this)) - return dynamic_cast<const ASF::File* >(this)->properties(); - return tag()->properties(); -} - -void File::removeUnsupportedProperties(const StringList &properties) -{ - // here we only consider those formats that could possibly contain - // unsupported properties - if(dynamic_cast<APE::File* >(this)) - dynamic_cast<APE::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<FLAC::File* >(this)) - dynamic_cast<FLAC::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<MPC::File* >(this)) - dynamic_cast<MPC::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<MPEG::File* >(this)) - dynamic_cast<MPEG::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<Ogg::Vorbis::File* >(this)) - dynamic_cast<Ogg::Vorbis::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<RIFF::AIFF::File* >(this)) - dynamic_cast<RIFF::AIFF::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<RIFF::WAV::File* >(this)) - dynamic_cast<RIFF::WAV::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<TrueAudio::File* >(this)) - dynamic_cast<TrueAudio::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<WavPack::File* >(this)) - dynamic_cast<WavPack::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<MP4::File* >(this)) - dynamic_cast<MP4::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<ASF::File* >(this)) - dynamic_cast<ASF::File* >(this)->removeUnsupportedProperties(properties); - else - tag()->removeUnsupportedProperties(properties); -} - -PropertyMap File::setProperties(const PropertyMap &properties) -{ - if(dynamic_cast<APE::File* >(this)) - return dynamic_cast<APE::File* >(this)->setProperties(properties); - else if(dynamic_cast<FLAC::File* >(this)) - return dynamic_cast<FLAC::File* >(this)->setProperties(properties); - else if(dynamic_cast<IT::File* >(this)) - return dynamic_cast<IT::File* >(this)->setProperties(properties); - else if(dynamic_cast<Mod::File* >(this)) - return dynamic_cast<Mod::File* >(this)->setProperties(properties); - else if(dynamic_cast<MPC::File* >(this)) - return dynamic_cast<MPC::File* >(this)->setProperties(properties); - else if(dynamic_cast<MPEG::File* >(this)) - return dynamic_cast<MPEG::File* >(this)->setProperties(properties); - else if(dynamic_cast<Ogg::FLAC::File* >(this)) - return dynamic_cast<Ogg::FLAC::File* >(this)->setProperties(properties); - else if(dynamic_cast<Ogg::Speex::File* >(this)) - return dynamic_cast<Ogg::Speex::File* >(this)->setProperties(properties); - else if(dynamic_cast<Ogg::Opus::File* >(this)) - return dynamic_cast<Ogg::Opus::File* >(this)->setProperties(properties); - else if(dynamic_cast<Ogg::Vorbis::File* >(this)) - return dynamic_cast<Ogg::Vorbis::File* >(this)->setProperties(properties); - else if(dynamic_cast<RIFF::AIFF::File* >(this)) - return dynamic_cast<RIFF::AIFF::File* >(this)->setProperties(properties); - else if(dynamic_cast<RIFF::WAV::File* >(this)) - return dynamic_cast<RIFF::WAV::File* >(this)->setProperties(properties); - else if(dynamic_cast<S3M::File* >(this)) - return dynamic_cast<S3M::File* >(this)->setProperties(properties); - else if(dynamic_cast<TrueAudio::File* >(this)) - return dynamic_cast<TrueAudio::File* >(this)->setProperties(properties); - else if(dynamic_cast<WavPack::File* >(this)) - return dynamic_cast<WavPack::File* >(this)->setProperties(properties); - else if(dynamic_cast<XM::File* >(this)) - return dynamic_cast<XM::File* >(this)->setProperties(properties); - else if(dynamic_cast<MP4::File* >(this)) - return dynamic_cast<MP4::File* >(this)->setProperties(properties); - else if(dynamic_cast<ASF::File* >(this)) - return dynamic_cast<ASF::File* >(this)->setProperties(properties); - else - return tag()->setProperties(properties); -} - -ByteVector File::readBlock(ulong length) -{ - return d->stream->readBlock(length); -} - -void File::writeBlock(const ByteVector &data) -{ - d->stream->writeBlock(data); -} - -long File::find(const ByteVector &pattern, long fromOffset, const ByteVector &before) -{ - if(!d->stream || pattern.size() > bufferSize()) - return -1; - - // The position in the file that the current buffer starts at. - - long bufferOffset = fromOffset; - ByteVector buffer; - - // These variables are used to keep track of a partial match that happens at - // the end of a buffer. - - int previousPartialMatch = -1; - int beforePreviousPartialMatch = -1; - - // Save the location of the current read pointer. We will restore the - // position using seek() before all returns. - - long originalPosition = tell(); - - // Start the search at the offset. - - seek(fromOffset); - - // This loop is the crux of the find method. There are three cases that we - // want to account for: - // - // (1) The previously searched buffer contained a partial match of the search - // pattern and we want to see if the next one starts with the remainder of - // that pattern. - // - // (2) The search pattern is wholly contained within the current buffer. - // - // (3) The current buffer ends with a partial match of the pattern. We will - // note this for use in the next itteration, where we will check for the rest - // of the pattern. - // - // All three of these are done in two steps. First we check for the pattern - // and do things appropriately if a match (or partial match) is found. We - // then check for "before". The order is important because it gives priority - // to "real" matches. - - for(buffer = readBlock(bufferSize()); buffer.size() > 0; buffer = readBlock(bufferSize())) { - - // (1) previous partial match - - if(previousPartialMatch >= 0 && int(bufferSize()) > previousPartialMatch) { - const int patternOffset = (bufferSize() - previousPartialMatch); - if(buffer.containsAt(pattern, 0, patternOffset)) { - seek(originalPosition); - return bufferOffset - bufferSize() + previousPartialMatch; - } - } - - if(!before.isNull() && beforePreviousPartialMatch >= 0 && int(bufferSize()) > beforePreviousPartialMatch) { - const int beforeOffset = (bufferSize() - beforePreviousPartialMatch); - if(buffer.containsAt(before, 0, beforeOffset)) { - seek(originalPosition); - return -1; - } - } - - // (2) pattern contained in current buffer - - long location = buffer.find(pattern); - if(location >= 0) { - seek(originalPosition); - return bufferOffset + location; - } - - if(!before.isNull() && buffer.find(before) >= 0) { - seek(originalPosition); - return -1; - } - - // (3) partial match - - previousPartialMatch = buffer.endsWithPartialMatch(pattern); - - if(!before.isNull()) - beforePreviousPartialMatch = buffer.endsWithPartialMatch(before); - - bufferOffset += bufferSize(); - } - - // Since we hit the end of the file, reset the status before continuing. - - clear(); - - seek(originalPosition); - - return -1; -} - - -long File::rfind(const ByteVector &pattern, long fromOffset, const ByteVector &before) -{ - if(!d->stream || pattern.size() > bufferSize()) - return -1; - - // The position in the file that the current buffer starts at. - - ByteVector buffer; - - // These variables are used to keep track of a partial match that happens at - // the end of a buffer. - - /* - int previousPartialMatch = -1; - int beforePreviousPartialMatch = -1; - */ - - // Save the location of the current read pointer. We will restore the - // position using seek() before all returns. - - long originalPosition = tell(); - - // Start the search at the offset. - - long bufferOffset; - if(fromOffset == 0) { - seek(-1 * int(bufferSize()), End); - bufferOffset = tell(); - } - else { - seek(fromOffset + -1 * int(bufferSize()), Beginning); - bufferOffset = tell(); - } - - // See the notes in find() for an explanation of this algorithm. - - for(buffer = readBlock(bufferSize()); buffer.size() > 0; buffer = readBlock(bufferSize())) { - - // TODO: (1) previous partial match - - // (2) pattern contained in current buffer - - long location = buffer.rfind(pattern); - if(location >= 0) { - seek(originalPosition); - return bufferOffset + location; - } - - if(!before.isNull() && buffer.find(before) >= 0) { - seek(originalPosition); - return -1; - } - - // TODO: (3) partial match - - bufferOffset -= bufferSize(); - seek(bufferOffset); - } - - // Since we hit the end of the file, reset the status before continuing. - - clear(); - - seek(originalPosition); - - return -1; -} - -void File::insert(const ByteVector &data, ulong start, ulong replace) -{ - d->stream->insert(data, start, replace); -} - -void File::removeBlock(ulong start, ulong length) -{ - d->stream->removeBlock(start, length); -} - -bool File::readOnly() const -{ - return d->stream->readOnly(); -} - -bool File::isOpen() const -{ - return d->stream->isOpen(); -} - -bool File::isValid() const -{ - return isOpen() && d->valid; -} - -void File::seek(long offset, Position p) -{ - d->stream->seek(offset, IOStream::Position(p)); -} - -void File::truncate(long length) -{ - d->stream->truncate(length); -} - -void File::clear() -{ - d->stream->clear(); -} - -long File::tell() const -{ - return d->stream->tell(); -} - -long File::length() -{ - return d->stream->length(); -} - -bool File::isReadable(const char *file) -{ - -#if defined(_MSC_VER) && (_MSC_VER >= 1400) // VC++2005 or later - - return _access_s(file, R_OK) == 0; - -#else - - return access(file, R_OK) == 0; - -#endif - -} - -bool File::isWritable(const char *file) -{ - -#if defined(_MSC_VER) && (_MSC_VER >= 1400) // VC++2005 or later - - return _access_s(file, W_OK) == 0; - -#else - - return access(file, W_OK) == 0; - -#endif - -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -TagLib::uint File::bufferSize() -{ - return BufferSize; -} - -void File::setValid(bool valid) -{ - d->valid = valid; -} - diff --git a/src/taglib/taglib/toolkit/tfile.h b/src/taglib/taglib/toolkit/tfile.h deleted file mode 100644 index 67f6f80..0000000 --- a/src/taglib/taglib/toolkit/tfile.h +++ /dev/null @@ -1,306 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FILE_H -#define TAGLIB_FILE_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tag.h" -#include "tbytevector.h" -#include "tiostream.h" - -namespace TagLib { - - class String; - class Tag; - class AudioProperties; - class PropertyMap; - - //! A file class with some useful methods for tag manipulation - - /*! - * This class is a basic file class with some methods that are particularly - * useful for tag editors. It has methods to take advantage of - * ByteVector and a binary search method for finding patterns in a file. - */ - - class TAGLIB_EXPORT File - { - public: - /*! - * Position in the file used for seeking. - */ - enum Position { - //! Seek from the beginning of the file. - Beginning, - //! Seek from the current position in the file. - Current, - //! Seek from the end of the file. - End - }; - - /*! - * Destroys this File instance. - */ - virtual ~File(); - - /*! - * Returns the file name in the local file system encoding. - */ - FileName name() const; - - /*! - * Returns a pointer to this file's tag. This should be reimplemented in - * the concrete subclasses. - */ - virtual Tag *tag() const = 0; - - /*! - * Exports the tags of the file as dictionary mapping (human readable) tag - * names (uppercase Strings) to StringLists of tag values. Calls the according - * specialization in the File subclasses. - * For each metadata object of the file that could not be parsed into the PropertyMap - * format, the returend map's unsupportedData() list will contain one entry identifying - * that object (e.g. the frame type for ID3v2 tags). Use removeUnsupportedProperties() - * to remove (a subset of) them. - * For files that contain more than one tag (e.g. an MP3 with both an ID3v2 and an ID3v2 - * tag) only the most "modern" one will be exported (ID3v2 in this case). - * BIC: Will be made virtual in future releases. - */ - PropertyMap properties() const; - - /*! - * Removes unsupported properties, or a subset of them, from the file's metadata. - * The parameter \a properties must contain only entries from - * properties().unsupportedData(). - * BIC: Will be mad virtual in future releases. - */ - void removeUnsupportedProperties(const StringList& properties); - - /*! - * Sets the tags of this File to those specified in \a properties. Calls the - * according specialization method in the subclasses of File to do the translation - * into the format-specific details. - * If some value(s) could not be written imported to the specific metadata format, - * the returned PropertyMap will contain those value(s). Otherwise it will be empty, - * indicating that no problems occured. - * With file types that support several tag formats (for instance, MP3 files can have - * ID3v1, ID3v2, and APEv2 tags), this function will create the most appropriate one - * (ID3v2 for MP3 files). Older formats will be updated as well, if they exist, but won't - * be taken into account for the return value of this function. - * See the documentation of the subclass implementations for detailed descriptions. - * BIC: will become pure virtual in the future - */ - PropertyMap setProperties(const PropertyMap &properties); - - /*! - * Returns a pointer to this file's audio properties. This should be - * reimplemented in the concrete subclasses. If no audio properties were - * read then this will return a null pointer. - */ - virtual AudioProperties *audioProperties() const = 0; - - /*! - * Save the file and its associated tags. This should be reimplemented in - * the concrete subclasses. Returns true if the save succeeds. - * - * \warning On UNIX multiple processes are able to write to the same file at - * the same time. This can result in serious file corruption. If you are - * developing a program that makes use of TagLib from multiple processes you - * must insure that you are only doing writes to a particular file from one - * of them. - */ - virtual bool save() = 0; - - /*! - * Reads a block of size \a length at the current get pointer. - */ - ByteVector readBlock(ulong length); - - /*! - * Attempts to write the block \a data at the current get pointer. If the - * file is currently only opened read only -- i.e. readOnly() returns true -- - * this attempts to reopen the file in read/write mode. - * - * \note This should be used instead of using the streaming output operator - * for a ByteVector. And even this function is significantly slower than - * doing output with a char[]. - */ - void writeBlock(const ByteVector &data); - - /*! - * Returns the offset in the file that \a pattern occurs at or -1 if it can - * not be found. If \a before is set, the search will only continue until the - * pattern \a before is found. This is useful for tagging purposes to search - * for a tag before the synch frame. - * - * Searching starts at \a fromOffset, which defaults to the beginning of the - * file. - * - * \note This has the practial limitation that \a pattern can not be longer - * than the buffer size used by readBlock(). Currently this is 1024 bytes. - */ - long find(const ByteVector &pattern, - long fromOffset = 0, - const ByteVector &before = ByteVector::null); - - /*! - * Returns the offset in the file that \a pattern occurs at or -1 if it can - * not be found. If \a before is set, the search will only continue until the - * pattern \a before is found. This is useful for tagging purposes to search - * for a tag before the synch frame. - * - * Searching starts at \a fromOffset and proceeds from the that point to the - * beginning of the file and defaults to the end of the file. - * - * \note This has the practial limitation that \a pattern can not be longer - * than the buffer size used by readBlock(). Currently this is 1024 bytes. - */ - long rfind(const ByteVector &pattern, - long fromOffset = 0, - const ByteVector &before = ByteVector::null); - - /*! - * Insert \a data at position \a start in the file overwriting \a replace - * bytes of the original content. - * - * \note This method is slow since it requires rewriting all of the file - * after the insertion point. - */ - void insert(const ByteVector &data, ulong start = 0, ulong replace = 0); - - /*! - * Removes a block of the file starting a \a start and continuing for - * \a length bytes. - * - * \note This method is slow since it involves rewriting all of the file - * after the removed portion. - */ - void removeBlock(ulong start = 0, ulong length = 0); - - /*! - * Returns true if the file is read only (or if the file can not be opened). - */ - bool readOnly() const; - - /*! - * Since the file can currently only be opened as an argument to the - * constructor (sort-of by design), this returns if that open succeeded. - */ - bool isOpen() const; - - /*! - * Returns true if the file is open and readable. - */ - bool isValid() const; - - /*! - * Move the I/O pointer to \a offset in the file from position \a p. This - * defaults to seeking from the beginning of the file. - * - * \see Position - */ - void seek(long offset, Position p = Beginning); - - /*! - * Reset the end-of-file and error flags on the file. - */ - void clear(); - - /*! - * Returns the current offset within the file. - */ - long tell() const; - - /*! - * Returns the length of the file. - */ - long length(); - - /*! - * Returns true if \a file can be opened for reading. If the file does not - * exist, this will return false. - * - * \deprecated - */ - static bool isReadable(const char *file); - - /*! - * Returns true if \a file can be opened for writing. - * - * \deprecated - */ - static bool isWritable(const char *name); - - protected: - /*! - * Construct a File object and opens the \a file. \a file should be a - * be a C-string in the local file system encoding. - * - * \note Constructor is protected since this class should only be - * instantiated through subclasses. - */ - File(FileName file); - - /*! - * Construct a File object and use the \a stream instance. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note Constructor is protected since this class should only be - * instantiated through subclasses. - */ - File(IOStream *stream); - - /*! - * Marks the file as valid or invalid. - * - * \see isValid() - */ - void setValid(bool valid); - - /*! - * Truncates the file to a \a length. - */ - void truncate(long length); - - /*! - * Returns the buffer size that is used for internal buffering. - */ - static uint bufferSize(); - - private: - File(const File &); - File &operator=(const File &); - - class FilePrivate; - FilePrivate *d; - }; - -} - -#endif diff --git a/src/taglib/taglib/toolkit/tfilestream.cpp b/src/taglib/taglib/toolkit/tfilestream.cpp deleted file mode 100644 index eae5257..0000000 --- a/src/taglib/taglib/toolkit/tfilestream.cpp +++ /dev/null @@ -1,492 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tfilestream.h" -#include "tstring.h" -#include "tdebug.h" - -#ifdef _WIN32 -# include <windows.h> -#else -# include <stdio.h> -# include <unistd.h> -#endif - -using namespace TagLib; - -namespace -{ -#ifdef _WIN32 - - // Uses Win32 native API instead of POSIX API to reduce the resource consumption. - - typedef FileName FileNameHandle; - typedef HANDLE FileHandle; - - const TagLib::uint BufferSize = 8192; - const FileHandle InvalidFileHandle = INVALID_HANDLE_VALUE; - - inline FileHandle openFile(const FileName &path, bool readOnly) - { - const DWORD access = readOnly ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE); - - if(!path.wstr().empty()) - return CreateFileW(path.wstr().c_str(), access, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); - else if(!path.str().empty()) - return CreateFileA(path.str().c_str(), access, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); - else - return InvalidFileHandle; - } - - inline void closeFile(FileHandle file) - { - CloseHandle(file); - } - - inline size_t readFile(FileHandle file, ByteVector &buffer) - { - DWORD length; - if(ReadFile(file, buffer.data(), static_cast<DWORD>(buffer.size()), &length, NULL)) - return static_cast<size_t>(length); - else - return 0; - } - - inline size_t writeFile(FileHandle file, const ByteVector &buffer) - { - DWORD length; - if(WriteFile(file, buffer.data(), static_cast<DWORD>(buffer.size()), &length, NULL)) - return static_cast<size_t>(length); - else - return 0; - } - -#else // _WIN32 - - struct FileNameHandle : public std::string - { - FileNameHandle(FileName name) : std::string(name) {} - operator FileName () const { return c_str(); } - }; - - typedef FILE* FileHandle; - - const TagLib::uint BufferSize = 8192; - const FileHandle InvalidFileHandle = 0; - - inline FileHandle openFile(const FileName &path, bool readOnly) - { - return fopen(path, readOnly ? "rb" : "rb+"); - } - - inline void closeFile(FileHandle file) - { - fclose(file); - } - - inline size_t readFile(FileHandle file, ByteVector &buffer) - { - return fread(buffer.data(), sizeof(char), buffer.size(), file); - } - - inline size_t writeFile(FileHandle file, const ByteVector &buffer) - { - return fwrite(buffer.data(), sizeof(char), buffer.size(), file); - } - -#endif // _WIN32 -} - -class FileStream::FileStreamPrivate -{ -public: - FileStreamPrivate(const FileName &fileName) - : file(InvalidFileHandle) - , name(fileName) - , readOnly(true) - { - } - - FileHandle file; - FileNameHandle name; - bool readOnly; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FileStream::FileStream(FileName fileName, bool openReadOnly) - : d(new FileStreamPrivate(fileName)) -{ - // First try with read / write mode, if that fails, fall back to read only. - - if(!openReadOnly) - d->file = openFile(fileName, false); - - if(d->file != InvalidFileHandle) - d->readOnly = false; - else - d->file = openFile(fileName, true); - - if(d->file == InvalidFileHandle) - { -# ifdef _WIN32 - debug("Could not open file " + fileName.toString()); -# else - debug("Could not open file " + String(static_cast<const char *>(d->name))); -# endif - } -} - -FileStream::~FileStream() -{ - if(isOpen()) - closeFile(d->file); - - delete d; -} - -FileName FileStream::name() const -{ - return d->name; -} - -ByteVector FileStream::readBlock(ulong length) -{ - if(!isOpen()) { - debug("File::readBlock() -- invalid file."); - return ByteVector::null; - } - - if(length == 0) - return ByteVector::null; - - const ulong streamLength = static_cast<ulong>(FileStream::length()); - if(length > bufferSize() && length > streamLength) - length = streamLength; - - ByteVector buffer(static_cast<uint>(length)); - - const size_t count = readFile(d->file, buffer); - buffer.resize(static_cast<uint>(count)); - - return buffer; -} - -void FileStream::writeBlock(const ByteVector &data) -{ - if(!isOpen()) { - debug("File::writeBlock() -- invalid file."); - return; - } - - if(readOnly()) { - debug("File::writeBlock() -- read only file."); - return; - } - - writeFile(d->file, data); -} - -void FileStream::insert(const ByteVector &data, ulong start, ulong replace) -{ - if(!isOpen()) { - debug("File::insert() -- invalid file."); - return; - } - - if(readOnly()) { - debug("File::insert() -- read only file."); - return; - } - - if(data.size() == replace) { - seek(start); - writeBlock(data); - return; - } - else if(data.size() < replace) { - seek(start); - writeBlock(data); - removeBlock(start + data.size(), replace - data.size()); - return; - } - - // Woohoo! Faster (about 20%) than id3lib at last. I had to get hardcore - // and avoid TagLib's high level API for rendering just copying parts of - // the file that don't contain tag data. - // - // Now I'll explain the steps in this ugliness: - - // First, make sure that we're working with a buffer that is longer than - // the *differnce* in the tag sizes. We want to avoid overwriting parts - // that aren't yet in memory, so this is necessary. - - ulong bufferLength = bufferSize(); - - while(data.size() - replace > bufferLength) - bufferLength += bufferSize(); - - // Set where to start the reading and writing. - - long readPosition = start + replace; - long writePosition = start; - - ByteVector buffer = data; - ByteVector aboutToOverwrite(static_cast<uint>(bufferLength)); - - while(true) - { - // Seek to the current read position and read the data that we're about - // to overwrite. Appropriately increment the readPosition. - - seek(readPosition); - const size_t bytesRead = readFile(d->file, aboutToOverwrite); - aboutToOverwrite.resize(bytesRead); - readPosition += bufferLength; - - // Check to see if we just read the last block. We need to call clear() - // if we did so that the last write succeeds. - - if(bytesRead < bufferLength) - clear(); - - // Seek to the write position and write our buffer. Increment the - // writePosition. - - seek(writePosition); - writeBlock(buffer); - - // We hit the end of the file. - - if(bytesRead == 0) - break; - - writePosition += buffer.size(); - - // Make the current buffer the data that we read in the beginning. - - buffer = aboutToOverwrite; - } -} - -void FileStream::removeBlock(ulong start, ulong length) -{ - if(!isOpen()) { - debug("File::removeBlock() -- invalid file."); - return; - } - - ulong bufferLength = bufferSize(); - - long readPosition = start + length; - long writePosition = start; - - ByteVector buffer(static_cast<uint>(bufferLength)); - - for(size_t bytesRead = -1; bytesRead != 0;) - { - seek(readPosition); - bytesRead = readFile(d->file, buffer); - readPosition += bytesRead; - - // Check to see if we just read the last block. We need to call clear() - // if we did so that the last write succeeds. - - if(bytesRead < buffer.size()) { - clear(); - buffer.resize(bytesRead); - } - - seek(writePosition); - writeFile(d->file, buffer); - - writePosition += bytesRead; - } - - truncate(writePosition); -} - -bool FileStream::readOnly() const -{ - return d->readOnly; -} - -bool FileStream::isOpen() const -{ - return (d->file != InvalidFileHandle); -} - -void FileStream::seek(long offset, Position p) -{ - if(!isOpen()) { - debug("File::seek() -- invalid file."); - return; - } - -#ifdef _WIN32 - - DWORD whence; - switch(p) { - case Beginning: - whence = FILE_BEGIN; - break; - case Current: - whence = FILE_CURRENT; - break; - case End: - whence = FILE_END; - break; - default: - debug("FileStream::seek() -- Invalid Position value."); - return; - } - - SetFilePointer(d->file, offset, NULL, whence); - if(GetLastError() != NO_ERROR) { - debug("File::seek() -- Failed to set the file pointer."); - } - -#else - - int whence; - switch(p) { - case Beginning: - whence = SEEK_SET; - break; - case Current: - whence = SEEK_CUR; - break; - case End: - whence = SEEK_END; - break; - default: - debug("FileStream::seek() -- Invalid Position value."); - return; - } - - fseek(d->file, offset, whence); - -#endif -} - -void FileStream::clear() -{ -#ifdef _WIN32 - - // NOP - -#else - - clearerr(d->file); - -#endif -} - -long FileStream::tell() const -{ -#ifdef _WIN32 - - const DWORD position = SetFilePointer(d->file, 0, NULL, FILE_CURRENT); - if(GetLastError() == NO_ERROR) { - return static_cast<long>(position); - } - else { - debug("File::tell() -- Failed to get the file pointer."); - return 0; - } - -#else - - return ftell(d->file); - -#endif -} - -long FileStream::length() -{ - if(!isOpen()) { - debug("File::length() -- invalid file."); - return 0; - } - -#ifdef _WIN32 - - const DWORD fileSize = GetFileSize(d->file, NULL); - if(GetLastError() == NO_ERROR) { - return static_cast<ulong>(fileSize); - } - else { - debug("File::length() -- Failed to get the file size."); - return 0; - } - -#else - - const long curpos = tell(); - - seek(0, End); - const long endpos = tell(); - - seek(curpos, Beginning); - - return endpos; - -#endif -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void FileStream::truncate(long length) -{ -#ifdef _WIN32 - - const long currentPos = tell(); - - seek(length); - SetEndOfFile(d->file); - if(GetLastError() != NO_ERROR) { - debug("File::truncate() -- Failed to truncate the file."); - } - - seek(currentPos); - -#else - - const int error = ftruncate(fileno(d->file), length); - if(error != 0) { - debug("FileStream::truncate() -- Coundn't truncate the file."); - } - -#endif -} - -TagLib::uint FileStream::bufferSize() -{ - return BufferSize; -} diff --git a/src/taglib/taglib/toolkit/tfilestream.h b/src/taglib/taglib/toolkit/tfilestream.h deleted file mode 100644 index fa113b7..0000000 --- a/src/taglib/taglib/toolkit/tfilestream.h +++ /dev/null @@ -1,154 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FILESTREAM_H -#define TAGLIB_FILESTREAM_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tbytevector.h" -#include "tiostream.h" - -namespace TagLib { - - class String; - class Tag; - class AudioProperties; - - //! A file class with some useful methods for tag manipulation - - /*! - * This class is a basic file class with some methods that are particularly - * useful for tag editors. It has methods to take advantage of - * ByteVector and a binary search method for finding patterns in a file. - */ - - class TAGLIB_EXPORT FileStream : public IOStream - { - public: - /*! - * Construct a File object and opens the \a file. \a file should be a - * be a C-string in the local file system encoding. - */ - FileStream(FileName file, bool openReadOnly = false); - - /*! - * Destroys this FileStream instance. - */ - virtual ~FileStream(); - - /*! - * Returns the file name in the local file system encoding. - */ - FileName name() const; - - /*! - * Reads a block of size \a length at the current get pointer. - */ - ByteVector readBlock(ulong length); - - /*! - * Attempts to write the block \a data at the current get pointer. If the - * file is currently only opened read only -- i.e. readOnly() returns true -- - * this attempts to reopen the file in read/write mode. - * - * \note This should be used instead of using the streaming output operator - * for a ByteVector. And even this function is significantly slower than - * doing output with a char[]. - */ - void writeBlock(const ByteVector &data); - - /*! - * Insert \a data at position \a start in the file overwriting \a replace - * bytes of the original content. - * - * \note This method is slow since it requires rewriting all of the file - * after the insertion point. - */ - void insert(const ByteVector &data, ulong start = 0, ulong replace = 0); - - /*! - * Removes a block of the file starting a \a start and continuing for - * \a length bytes. - * - * \note This method is slow since it involves rewriting all of the file - * after the removed portion. - */ - void removeBlock(ulong start = 0, ulong length = 0); - - /*! - * Returns true if the file is read only (or if the file can not be opened). - */ - bool readOnly() const; - - /*! - * Since the file can currently only be opened as an argument to the - * constructor (sort-of by design), this returns if that open succeeded. - */ - bool isOpen() const; - - /*! - * Move the I/O pointer to \a offset in the file from position \a p. This - * defaults to seeking from the beginning of the file. - * - * \see Position - */ - void seek(long offset, Position p = Beginning); - - /*! - * Reset the end-of-file and error flags on the file. - */ - void clear(); - - /*! - * Returns the current offset within the file. - */ - long tell() const; - - /*! - * Returns the length of the file. - */ - long length(); - - /*! - * Truncates the file to a \a length. - */ - void truncate(long length); - - protected: - - /*! - * Returns the buffer size that is used for internal buffering. - */ - static uint bufferSize(); - - private: - class FileStreamPrivate; - FileStreamPrivate *d; - }; - -} - -#endif diff --git a/src/taglib/taglib/toolkit/tiostream.cpp b/src/taglib/taglib/toolkit/tiostream.cpp deleted file mode 100644 index c2ad291..0000000 --- a/src/taglib/taglib/toolkit/tiostream.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tiostream.h" - -using namespace TagLib; - -#ifdef _WIN32 - -# include "tstring.h" -# include "tdebug.h" -# include <windows.h> - -namespace -{ - // Check if the running system has CreateFileW() function. - // Windows9x systems don't have CreateFileW() or can't accept Unicode file names. - - bool supportsUnicode() - { - const FARPROC p = GetProcAddress(GetModuleHandleA("kernel32"), "CreateFileW"); - return (p != NULL); - } - - // Indicates whether the system supports Unicode file names. - - const bool SystemSupportsUnicode = supportsUnicode(); - - // Converts a UTF-16 string into a local encoding. - // This function should only be used in Windows9x systems which don't support - // Unicode file names. - - std::string unicodeToAnsi(const wchar_t *wstr) - { - if(SystemSupportsUnicode) { - debug("unicodeToAnsi() - Should not be used on WinNT systems."); - } - - const int len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL); - if(len == 0) - return std::string(); - - std::string str(len, '\0'); - WideCharToMultiByte(CP_ACP, 0, wstr, -1, &str[0], len, NULL, NULL); - - return str; - } -} - -// If WinNT, stores a Unicode string into m_wname directly. -// If Win9x, converts and stores it into m_name to avoid calling Unicode version functions. - -FileName::FileName(const wchar_t *name) - : m_name (SystemSupportsUnicode ? "" : unicodeToAnsi(name)) - , m_wname(SystemSupportsUnicode ? name : L"") -{ -} - -FileName::FileName(const char *name) - : m_name(name) -{ -} - -FileName::FileName(const FileName &name) - : m_name (name.m_name) - , m_wname(name.m_wname) -{ -} - -FileName::operator const wchar_t *() const -{ - return m_wname.c_str(); -} - -FileName::operator const char *() const -{ - return m_name.c_str(); -} - -const std::wstring &FileName::wstr() const -{ - return m_wname; -} - -const std::string &FileName::str() const -{ - return m_name; -} - -String FileName::toString() const -{ - if(!m_wname.empty()) { - return String(m_wname); - } - else if(!m_name.empty()) { - const int len = MultiByteToWideChar(CP_ACP, 0, m_name.c_str(), -1, NULL, 0); - if(len == 0) - return String::null; - - std::vector<wchar_t> buf(len); - MultiByteToWideChar(CP_ACP, 0, m_name.c_str(), -1, &buf[0], len); - - return String(&buf[0]); - } - else { - return String::null; - } -} - - -#endif // _WIN32 - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -IOStream::IOStream() -{ -} - -IOStream::~IOStream() -{ -} - -void IOStream::clear() -{ -} - diff --git a/src/taglib/taglib/toolkit/tiostream.h b/src/taglib/taglib/toolkit/tiostream.h deleted file mode 100644 index 8682696..0000000 --- a/src/taglib/taglib/toolkit/tiostream.h +++ /dev/null @@ -1,169 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_IOSTREAM_H -#define TAGLIB_IOSTREAM_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tbytevector.h" - -namespace TagLib { - -#ifdef _WIN32 - class TAGLIB_EXPORT FileName - { - public: - FileName(const wchar_t *name); - FileName(const char *name); - - FileName(const FileName &name); - - operator const wchar_t *() const; - operator const char *() const; - - const std::wstring &wstr() const; - const std::string &str() const; - - String toString() const; - - private: - const std::string m_name; - const std::wstring m_wname; - }; -#else - typedef const char *FileName; -#endif - - //! An abstract class that provides operations on a sequence of bytes - - class TAGLIB_EXPORT IOStream - { - public: - /*! - * Position in the file used for seeking. - */ - enum Position { - //! Seek from the beginning of the file. - Beginning, - //! Seek from the current position in the file. - Current, - //! Seek from the end of the file. - End - }; - - IOStream(); - - /*! - * Destroys this IOStream instance. - */ - virtual ~IOStream(); - - /*! - * Returns the stream name in the local file system encoding. - */ - virtual FileName name() const = 0; - - /*! - * Reads a block of size \a length at the current get pointer. - */ - virtual ByteVector readBlock(ulong length) = 0; - - /*! - * Attempts to write the block \a data at the current get pointer. If the - * file is currently only opened read only -- i.e. readOnly() returns true -- - * this attempts to reopen the file in read/write mode. - * - * \note This should be used instead of using the streaming output operator - * for a ByteVector. And even this function is significantly slower than - * doing output with a char[]. - */ - virtual void writeBlock(const ByteVector &data) = 0; - - /*! - * Insert \a data at position \a start in the file overwriting \a replace - * bytes of the original content. - * - * \note This method is slow since it requires rewriting all of the file - * after the insertion point. - */ - virtual void insert(const ByteVector &data, ulong start = 0, ulong replace = 0) = 0; - - /*! - * Removes a block of the file starting a \a start and continuing for - * \a length bytes. - * - * \note This method is slow since it involves rewriting all of the file - * after the removed portion. - */ - virtual void removeBlock(ulong start = 0, ulong length = 0) = 0; - - /*! - * Returns true if the file is read only (or if the file can not be opened). - */ - virtual bool readOnly() const = 0; - - /*! - * Since the file can currently only be opened as an argument to the - * constructor (sort-of by design), this returns if that open succeeded. - */ - virtual bool isOpen() const = 0; - - /*! - * Move the I/O pointer to \a offset in the stream from position \a p. This - * defaults to seeking from the beginning of the stream. - * - * \see Position - */ - virtual void seek(long offset, Position p = Beginning) = 0; - - /*! - * Reset the end-of-stream and error flags on the stream. - */ - virtual void clear(); - - /*! - * Returns the current offset within the stream. - */ - virtual long tell() const = 0; - - /*! - * Returns the length of the stream. - */ - virtual long length() = 0; - - /*! - * Truncates the stream to a \a length. - */ - virtual void truncate(long length) = 0; - - private: - IOStream(const IOStream &); - IOStream &operator=(const IOStream &); - }; - -} - -#endif diff --git a/src/taglib/taglib/toolkit/tlist.h b/src/taglib/taglib/toolkit/tlist.h deleted file mode 100644 index 0099dad..0000000 --- a/src/taglib/taglib/toolkit/tlist.h +++ /dev/null @@ -1,257 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_LIST_H -#define TAGLIB_LIST_H - -#include "taglib.h" - -#include <list> - -namespace TagLib { - - //! A generic, implicitly shared list. - - /*! - * This is basic generic list that's somewhere between a std::list and a - * QValueList. This class is implicitly shared. For example: - * - * \code - * - * TagLib::List<int> l = someOtherIntList; - * - * \endcode - * - * The above example is very cheap. This also makes lists suitable for the - * return types of functions. The above example will just copy a pointer rather - * than copying the data in the list. When your \e shared list's data changes, - * only \e then will the data be copied. - */ - - template <class T> class List - { - public: -#ifndef DO_NOT_DOCUMENT - typedef typename std::list<T>::iterator Iterator; - typedef typename std::list<T>::const_iterator ConstIterator; -#endif - - /*! - * Constructs an empty list. - */ - List(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - List(const List<T> &l); - - /*! - * Destroys this List instance. If auto deletion is enabled and this list - * contains a pointer type all of the memebers are also deleted. - */ - virtual ~List(); - - /*! - * Returns an STL style iterator to the beginning of the list. See - * std::list::const_iterator for the semantics. - */ - Iterator begin(); - - /*! - * Returns an STL style constant iterator to the beginning of the list. See - * std::list::iterator for the semantics. - */ - ConstIterator begin() const; - - /*! - * Returns an STL style iterator to the end of the list. See - * std::list::iterator for the semantics. - */ - Iterator end(); - - /*! - * Returns an STL style constant iterator to the end of the list. See - * std::list::const_iterator for the semantics. - */ - ConstIterator end() const; - - /*! - * Inserts a copy of \a value before \a it. - */ - Iterator insert(Iterator it, const T &value); - - /*! - * Inserts the \a value into the list. This assumes that the list is - * currently sorted. If \a unique is true then the value will not - * be inserted if it is already in the list. - */ - List<T> &sortedInsert(const T &value, bool unique = false); - - /*! - * Appends \a item to the end of the list and returns a reference to the - * list. - */ - List<T> &append(const T &item); - - /*! - * Appends all of the values in \a l to the end of the list and returns a - * reference to the list. - */ - List<T> &append(const List<T> &l); - - /*! - * Prepends \a item to the beginning list and returns a reference to the - * list. - */ - List<T> &prepend(const T &item); - - /*! - * Prepends all of the items in \a l to the beginning list and returns a - * reference to the list. - */ - List<T> &prepend(const List<T> &l); - - /*! - * Clears the list. If auto deletion is enabled and this list contains a - * pointer type the members are also deleted. - * - * \see setAutoDelete() - */ - List<T> &clear(); - - /*! - * Returns the number of elements in the list. - */ - uint size() const; - bool isEmpty() const; - - /*! - * Find the first occurrence of \a value. - */ - Iterator find(const T &value); - - /*! - * Find the first occurrence of \a value. - */ - ConstIterator find(const T &value) const; - - /*! - * Returns true if the list contains \a value. - */ - bool contains(const T &value) const; - - /*! - * Erase the item at \a it from the list. - */ - Iterator erase(Iterator it); - - /*! - * Returns a reference to the first item in the list. - */ - const T &front() const; - - /*! - * Returns a reference to the first item in the list. - */ - T &front(); - - /*! - * Returns a reference to the last item in the list. - */ - const T &back() const; - - /*! - * Returns a reference to the last item in the list. - */ - T &back(); - - /*! - * Auto delete the members of the list when the last reference to the list - * passes out of scope. This will have no effect on lists which do not - * contain a pointer type. - * - * \note This relies on partial template instantiation -- most modern C++ - * compilers should now support this. - */ - void setAutoDelete(bool autoDelete); - - /*! - * Returns a reference to item \a i in the list. - * - * \warning This method is slow. Use iterators to loop through the list. - */ - T &operator[](uint i); - - /*! - * Returns a const reference to item \a i in the list. - * - * \warning This method is slow. Use iterators to loop through the list. - */ - const T &operator[](uint i) const; - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - List<T> &operator=(const List<T> &l); - - /*! - * Compares this list with \a l and returns true if all of the elements are - * the same. - */ - bool operator==(const List<T> &l) const; - - /*! - * Compares this list with \a l and returns true if the lists differ. - */ - bool operator!=(const List<T> &l) const; - - protected: - /* - * If this List is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: -#ifndef DO_NOT_DOCUMENT - template <class TP> class ListPrivate; - ListPrivate<T> *d; -#endif - }; - -} - -// Since GCC doesn't support the "export" keyword, we have to include the -// implementation. - -#include "tlist.tcc" - -#endif diff --git a/src/taglib/taglib/toolkit/tlist.tcc b/src/taglib/taglib/toolkit/tlist.tcc deleted file mode 100644 index 72d4767..0000000 --- a/src/taglib/taglib/toolkit/tlist.tcc +++ /dev/null @@ -1,324 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <algorithm> -#include "trefcounter.h" - -namespace TagLib { - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -// The functionality of List<T>::setAutoDelete() is implemented here partial -// template specialization. This is implemented in such a way that calling -// setAutoDelete() on non-pointer types will simply have no effect. - -// A base for the generic and specialized private class types. New -// non-templatized members should be added here. - -// BIC change to RefCounter -class ListPrivateBase : public RefCounterOld -{ -public: - ListPrivateBase() : autoDelete(false) {} - bool autoDelete; -}; - -// A generic implementation - -template <class T> -template <class TP> class List<T>::ListPrivate : public ListPrivateBase -{ -public: - ListPrivate() : ListPrivateBase() {} - ListPrivate(const std::list<TP> &l) : ListPrivateBase(), list(l) {} - void clear() { - list.clear(); - } - std::list<TP> list; -}; - -// A partial specialization for all pointer types that implements the -// setAutoDelete() functionality. - -template <class T> -template <class TP> class List<T>::ListPrivate<TP *> : public ListPrivateBase -{ -public: - ListPrivate() : ListPrivateBase() {} - ListPrivate(const std::list<TP *> &l) : ListPrivateBase(), list(l) {} - ~ListPrivate() { - clear(); - } - void clear() { - if(autoDelete) { - typename std::list<TP *>::const_iterator it = list.begin(); - for(; it != list.end(); ++it) - delete *it; - } - list.clear(); - } - std::list<TP *> list; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -template <class T> -List<T>::List() -{ - d = new ListPrivate<T>; -} - -template <class T> -List<T>::List(const List<T> &l) : d(l.d) -{ - d->ref(); -} - -template <class T> -List<T>::~List() -{ - if(d->deref()) - delete d; -} - -template <class T> -typename List<T>::Iterator List<T>::begin() -{ - detach(); - return d->list.begin(); -} - -template <class T> -typename List<T>::ConstIterator List<T>::begin() const -{ - return d->list.begin(); -} - -template <class T> -typename List<T>::Iterator List<T>::end() -{ - detach(); - return d->list.end(); -} - -template <class T> -typename List<T>::ConstIterator List<T>::end() const -{ - return d->list.end(); -} - -template <class T> -typename List<T>::Iterator List<T>::insert(Iterator it, const T &item) -{ - detach(); - return d->list.insert(it, item); -} - -template <class T> -List<T> &List<T>::sortedInsert(const T &value, bool unique) -{ - detach(); - Iterator it = begin(); - while(it != end() && *it < value) - ++it; - if(unique && it != end() && *it == value) - return *this; - insert(it, value); - return *this; -} - -template <class T> -List<T> &List<T>::append(const T &item) -{ - detach(); - d->list.push_back(item); - return *this; -} - -template <class T> -List<T> &List<T>::append(const List<T> &l) -{ - detach(); - d->list.insert(d->list.end(), l.begin(), l.end()); - return *this; -} - -template <class T> -List<T> &List<T>::prepend(const T &item) -{ - detach(); - d->list.push_front(item); - return *this; -} - -template <class T> -List<T> &List<T>::prepend(const List<T> &l) -{ - detach(); - d->list.insert(d->list.begin(), l.begin(), l.end()); - return *this; -} - -template <class T> -List<T> &List<T>::clear() -{ - detach(); - d->clear(); - return *this; -} - -template <class T> -TagLib::uint List<T>::size() const -{ - return d->list.size(); -} - -template <class T> -bool List<T>::isEmpty() const -{ - return d->list.empty(); -} - -template <class T> -typename List<T>::Iterator List<T>::find(const T &value) -{ - return std::find(d->list.begin(), d->list.end(), value); -} - -template <class T> -typename List<T>::ConstIterator List<T>::find(const T &value) const -{ - return std::find(d->list.begin(), d->list.end(), value); -} - -template <class T> -bool List<T>::contains(const T &value) const -{ - return std::find(d->list.begin(), d->list.end(), value) != d->list.end(); -} - -template <class T> -typename List<T>::Iterator List<T>::erase(Iterator it) -{ - return d->list.erase(it); -} - -template <class T> -const T &List<T>::front() const -{ - return d->list.front(); -} - -template <class T> -T &List<T>::front() -{ - detach(); - return d->list.front(); -} - -template <class T> -const T &List<T>::back() const -{ - return d->list.back(); -} - -template <class T> -void List<T>::setAutoDelete(bool autoDelete) -{ - d->autoDelete = autoDelete; -} - -template <class T> -T &List<T>::back() -{ - detach(); - return d->list.back(); -} - -template <class T> -T &List<T>::operator[](uint i) -{ - Iterator it = d->list.begin(); - - for(uint j = 0; j < i; j++) - ++it; - - return *it; -} - -template <class T> -const T &List<T>::operator[](uint i) const -{ - ConstIterator it = d->list.begin(); - - for(uint j = 0; j < i; j++) - ++it; - - return *it; -} - -template <class T> -List<T> &List<T>::operator=(const List<T> &l) -{ - if(&l == this) - return *this; - - if(d->deref()) - delete d; - d = l.d; - d->ref(); - return *this; -} - -template <class T> -bool List<T>::operator==(const List<T> &l) const -{ - return d->list == l.d->list; -} - -template <class T> -bool List<T>::operator!=(const List<T> &l) const -{ - return d->list != l.d->list; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -template <class T> -void List<T>::detach() -{ - if(d->count() > 1) { - d->deref(); - d = new ListPrivate<T>(d->list); - } -} - -} // namespace TagLib diff --git a/src/taglib/taglib/toolkit/tmap.h b/src/taglib/taglib/toolkit/tmap.h deleted file mode 100644 index a7d9930..0000000 --- a/src/taglib/taglib/toolkit/tmap.h +++ /dev/null @@ -1,199 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MAP_H -#define TAGLIB_MAP_H - -#include <map> - -#include "taglib.h" - -namespace TagLib { - - //! A generic, implicitly shared map. - - /*! - * This implements a standard map container that associates a key with a value - * and has fast key-based lookups. This map is also implicitly shared making - * it suitable for pass-by-value usage. - */ - - template <class Key, class T> class Map - { - public: -#ifndef DO_NOT_DOCUMENT -#ifdef WANT_CLASS_INSTANTIATION_OF_MAP - // Some STL implementations get snippy over the use of the - // class keyword to distinguish different templates; Sun Studio - // in particular finds multiple specializations in certain rare - // cases and complains about that. GCC doesn't seem to mind, - // and uses the typedefs further below without the class keyword. - // Not all the specializations of Map can use the class keyword - // (when T is not actually a class type), so don't apply this - // generally. - typedef typename std::map<class Key, class T>::iterator Iterator; - typedef typename std::map<class Key, class T>::const_iterator ConstIterator; -#else - typedef typename std::map<Key, T>::iterator Iterator; - typedef typename std::map<Key, T>::const_iterator ConstIterator; -#endif -#endif - - /*! - * Constructs an empty Map. - */ - Map(); - - /*! - * Make a shallow, implicitly shared, copy of \a m. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - Map(const Map<Key, T> &m); - - /*! - * Destroys this instance of the Map. - */ - virtual ~Map(); - - /*! - * Returns an STL style iterator to the beginning of the map. See - * std::map::iterator for the semantics. - */ - Iterator begin(); - - /*! - * Returns an STL style iterator to the beginning of the map. See - * std::map::const_iterator for the semantics. - */ - ConstIterator begin() const; - - /*! - * Returns an STL style iterator to the end of the map. See - * std::map::iterator for the semantics. - */ - Iterator end(); - - /*! - * Returns an STL style iterator to the end of the map. See - * std::map::const_iterator for the semantics. - */ - ConstIterator end() const; - - /*! - * Inserts \a value under \a key in the map. If a value for \a key already - * exists it will be overwritten. - */ - Map<Key, T> &insert(const Key &key, const T &value); - - /*! - * Removes all of the elements from elements from the map. This however - * will not delete pointers if the mapped type is a pointer type. - */ - Map<Key, T> &clear(); - - /*! - * The number of elements in the map. - * - * \see isEmpty() - */ - uint size() const; - - /*! - * Returns true if the map is empty. - * - * \see size() - */ - bool isEmpty() const; - - /*! - * Find the first occurrence of \a key. - */ - Iterator find(const Key &key); - - /*! - * Find the first occurrence of \a key. - */ - ConstIterator find(const Key &key) const; - - /*! - * Returns true if the map contains an instance of \a key. - */ - bool contains(const Key &key) const; - - /*! - * Erase the item at \a it from the list. - */ - Map<Key, T> &erase(Iterator it); - - /*! - * Erase the item with \a key from the list. - */ - Map<Key, T> &erase(const Key &key); - - /*! - * Returns a reference to the value associated with \a key. - * - * \note This has undefined behavior if the key is not present in the map. - */ - const T &operator[](const Key &key) const; - - /*! - * Returns a reference to the value associated with \a key. - * - * \note This has undefined behavior if the key is not present in the map. - */ - T &operator[](const Key &key); - - /*! - * Make a shallow, implicitly shared, copy of \a m. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - Map<Key, T> &operator=(const Map<Key, T> &m); - - protected: - /* - * If this List is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: -#ifndef DO_NOT_DOCUMENT - template <class KeyP, class TP> class MapPrivate; - MapPrivate<Key, T> *d; -#endif - }; - -} - -// Since GCC doesn't support the "export" keyword, we have to include the -// implementation. - -#include "tmap.tcc" - -#endif diff --git a/src/taglib/taglib/toolkit/tmap.tcc b/src/taglib/taglib/toolkit/tmap.tcc deleted file mode 100644 index 5d3abca..0000000 --- a/src/taglib/taglib/toolkit/tmap.tcc +++ /dev/null @@ -1,199 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "trefcounter.h" - -namespace TagLib { - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -// BIC change to RefCounter -template <class Key, class T> -template <class KeyP, class TP> -class Map<Key, T>::MapPrivate : public RefCounterOld -{ -public: - MapPrivate() : RefCounterOld() {} -#ifdef WANT_CLASS_INSTANTIATION_OF_MAP - MapPrivate(const std::map<class KeyP, class TP>& m) : RefCounterOld(), map(m) {} - std::map<class KeyP, class TP> map; -#else - MapPrivate(const std::map<KeyP, TP>& m) : RefCounterOld(), map(m) {} - std::map<KeyP, TP> map; -#endif -}; - -template <class Key, class T> -Map<Key, T>::Map() -{ - d = new MapPrivate<Key, T>; -} - -template <class Key, class T> -Map<Key, T>::Map(const Map<Key, T> &m) : d(m.d) -{ - d->ref(); -} - -template <class Key, class T> -Map<Key, T>::~Map() -{ - if(d->deref()) - delete(d); -} - -template <class Key, class T> -typename Map<Key, T>::Iterator Map<Key, T>::begin() -{ - detach(); - return d->map.begin(); -} - -template <class Key, class T> -typename Map<Key, T>::ConstIterator Map<Key, T>::begin() const -{ - return d->map.begin(); -} - -template <class Key, class T> -typename Map<Key, T>::Iterator Map<Key, T>::end() -{ - detach(); - return d->map.end(); -} - -template <class Key, class T> -typename Map<Key, T>::ConstIterator Map<Key, T>::end() const -{ - return d->map.end(); -} - -template <class Key, class T> -Map<Key, T> &Map<Key, T>::insert(const Key &key, const T &value) -{ - detach(); - d->map[key] = value; - return *this; -} - -template <class Key, class T> -Map<Key, T> &Map<Key, T>::clear() -{ - detach(); - d->map.clear(); - return *this; -} - -template <class Key, class T> -bool Map<Key, T>::isEmpty() const -{ - return d->map.empty(); -} - -template <class Key, class T> -typename Map<Key, T>::Iterator Map<Key, T>::find(const Key &key) -{ - detach(); - return d->map.find(key); -} - -template <class Key, class T> -typename Map<Key,T>::ConstIterator Map<Key, T>::find(const Key &key) const -{ - return d->map.find(key); -} - -template <class Key, class T> -bool Map<Key, T>::contains(const Key &key) const -{ - return d->map.find(key) != d->map.end(); -} - -template <class Key, class T> -Map<Key, T> &Map<Key,T>::erase(Iterator it) -{ - detach(); - d->map.erase(it); - return *this; -} - -template <class Key, class T> -Map<Key, T> &Map<Key,T>::erase(const Key &key) -{ - detach(); - Iterator it = d->map.find(key); - if(it != d->map.end()) - d->map.erase(it); - return *this; -} - -template <class Key, class T> -TagLib::uint Map<Key, T>::size() const -{ - return d->map.size(); -} - -template <class Key, class T> -const T &Map<Key, T>::operator[](const Key &key) const -{ - return d->map[key]; -} - -template <class Key, class T> -T &Map<Key, T>::operator[](const Key &key) -{ - detach(); - return d->map[key]; -} - -template <class Key, class T> -Map<Key, T> &Map<Key, T>::operator=(const Map<Key, T> &m) -{ - if(&m == this) - return *this; - - if(d->deref()) - delete(d); - d = m.d; - d->ref(); - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -template <class Key, class T> -void Map<Key, T>::detach() -{ - if(d->count() > 1) { - d->deref(); - d = new MapPrivate<Key, T>(d->map); - } -} - -} // namespace TagLib diff --git a/src/taglib/taglib/toolkit/tpropertymap.cpp b/src/taglib/taglib/toolkit/tpropertymap.cpp deleted file mode 100644 index 3317cc9..0000000 --- a/src/taglib/taglib/toolkit/tpropertymap.cpp +++ /dev/null @@ -1,173 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Michael Helmling - email : helmling@mathematik.uni-kl.de - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "tpropertymap.h" -using namespace TagLib; - - -PropertyMap::PropertyMap() : SimplePropertyMap() -{ -} - -PropertyMap::PropertyMap(const PropertyMap &m) : SimplePropertyMap(m), unsupported(m.unsupported) -{ -} - -PropertyMap::PropertyMap(const SimplePropertyMap &m) -{ - for(SimplePropertyMap::ConstIterator it = m.begin(); it != m.end(); ++it){ - String key = it->first.upper(); - if(!key.isNull()) - insert(it->first, it->second); - else - unsupported.append(it->first); - } -} - -PropertyMap::~PropertyMap() -{ -} - -bool PropertyMap::insert(const String &key, const StringList &values) -{ - String realKey = key.upper(); - Iterator result = SimplePropertyMap::find(realKey); - if(result == end()) - SimplePropertyMap::insert(realKey, values); - else - SimplePropertyMap::operator[](realKey).append(values); - return true; -} - -bool PropertyMap::replace(const String &key, const StringList &values) -{ - String realKey = key.upper(); - SimplePropertyMap::erase(realKey); - SimplePropertyMap::insert(realKey, values); - return true; -} - -PropertyMap::Iterator PropertyMap::find(const String &key) -{ - return SimplePropertyMap::find(key.upper()); -} - -PropertyMap::ConstIterator PropertyMap::find(const String &key) const -{ - return SimplePropertyMap::find(key.upper()); -} - -bool PropertyMap::contains(const String &key) const -{ - return SimplePropertyMap::contains(key.upper()); -} - -bool PropertyMap::contains(const PropertyMap &other) const -{ - for(ConstIterator it = other.begin(); it != other.end(); ++it) { - if(!SimplePropertyMap::contains(it->first)) - return false; - if ((*this)[it->first] != it->second) - return false; - } - return true; -} - -PropertyMap &PropertyMap::erase(const String &key) -{ - SimplePropertyMap::erase(key.upper()); - return *this; -} - -PropertyMap &PropertyMap::erase(const PropertyMap &other) -{ - for(ConstIterator it = other.begin(); it != other.end(); ++it) - erase(it->first); - return *this; -} - -PropertyMap &PropertyMap::merge(const PropertyMap &other) -{ - for(PropertyMap::ConstIterator it = other.begin(); it != other.end(); ++it) - insert(it->first, it->second); - unsupported.append(other.unsupported); - return *this; -} - -const StringList &PropertyMap::operator[](const String &key) const -{ - return SimplePropertyMap::operator[](key.upper()); -} - -StringList &PropertyMap::operator[](const String &key) -{ - return SimplePropertyMap::operator[](key.upper()); -} - -bool PropertyMap::operator==(const PropertyMap &other) const -{ - for(ConstIterator it = other.begin(); it != other.end(); ++it) { - ConstIterator thisFind = find(it->first); - if( thisFind == end() || (thisFind->second != it->second) ) - return false; - } - for(ConstIterator it = begin(); it != end(); ++it) { - ConstIterator otherFind = other.find(it->first); - if( otherFind == other.end() || (otherFind->second != it->second) ) - return false; - } - return unsupported == other.unsupported; -} - -bool PropertyMap::operator!=(const PropertyMap &other) const -{ - return !(*this == other); -} - -String PropertyMap::toString() const -{ - String ret = ""; - for(ConstIterator it = begin(); it != end(); ++it) - ret += it->first+"="+it->second.toString(", ") + "\n"; - if(!unsupported.isEmpty()) - ret += "Unsupported Data: " + unsupported.toString(", ") + "\n"; - return ret; -} - -void PropertyMap::removeEmpty() -{ - StringList emptyKeys; - for(Iterator it = begin(); it != end(); ++it) - if(it->second.isEmpty()) - emptyKeys.append(it->first); - for(StringList::Iterator emptyIt = emptyKeys.begin(); emptyIt != emptyKeys.end(); emptyIt++ ) - erase(*emptyIt); -} - -StringList &PropertyMap::unsupportedData() -{ - return unsupported; -} - -const StringList &PropertyMap::unsupportedData() const -{ - return unsupported; -} diff --git a/src/taglib/taglib/toolkit/tpropertymap.h b/src/taglib/taglib/toolkit/tpropertymap.h deleted file mode 100644 index 2be49dd..0000000 --- a/src/taglib/taglib/toolkit/tpropertymap.h +++ /dev/null @@ -1,233 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Michael Helmling - email : helmling@mathematik.uni-kl.de - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef PROPERTYMAP_H_ -#define PROPERTYMAP_H_ - -#include "tmap.h" -#include "tstringlist.h" - -namespace TagLib { - - typedef Map<String,StringList> SimplePropertyMap; - - //! A map for format-independent <key,valuelist> tag representations. - - /*! - * This map implements a generic representation of textual audio metadata - * ("tags") realized as pairs of a case-insensitive key - * and a nonempty list of corresponding values, each value being an an arbitrary - * unicode String. - * - * Note that most metadata formats pose additional conditions on the tag keys. The - * most popular ones (Vorbis, APE, ID3v2) should support all ASCII only words of - * length between 2 and 16. - * - * This class can contain any tags, but here is a list of "well-known" tags that - * you might want to use: - * - * Basic tags: - * - * - TITLE - * - ALBUM - * - ARTIST - * - ALBUMARTIST - * - SUBTITLE - * - TRACKNUMBER - * - DISCNUMBER - * - DATE - * - ORIGINALDATE - * - GENRE - * - COMMENT - * - * Sort names: - * - * - TITLESORT - * - ALBUMSORT - * - ARTISTSORT - * - ALBUMARTISTSORT - * - * Credits: - * - * - COMPOSER - * - LYRICIST - * - CONDUCTOR - * - REMIXER - * - PERFORMER:<XXXX> - * - * Other tags: - * - * - ISRC - * - ASIN - * - BPM - * - COPYRIGHT - * - ENCODEDBY - * - MOOD - * - COMMENT - * - MEDIA - * - LABEL - * - CATALOGNUMBER - * - BARCODE - * - * MusicBrainz identifiers: - * - * - MUSICBRAINZ_TRACKID - * - MUSICBRAINZ_ALBUMID - * - MUSICBRAINZ_RELEASEGROUPID - * - MUSICBRAINZ_WORKID - * - MUSICBRAINZ_ARTISTID - * - MUSICBRAINZ_ALBUMARTISTID - * - ACOUSTID_ID - * - ACOUSTID_FINGERPRINT - * - MUSICIP_PUID - * - */ - - class TAGLIB_EXPORT PropertyMap: public SimplePropertyMap - { - public: - - typedef SimplePropertyMap::Iterator Iterator; - typedef SimplePropertyMap::ConstIterator ConstIterator; - - PropertyMap(); - - PropertyMap(const PropertyMap &m); - - /*! - * Creates a PropertyMap initialized from a SimplePropertyMap. Copies all - * entries from \a m that have valid keys. - * Invalid keys will be appended to the unsupportedData() list. - */ - PropertyMap(const SimplePropertyMap &m); - - virtual ~PropertyMap(); - - /*! - * Inserts \a values under \a key in the map. If \a key already exists, - * then \values will be appended to the existing StringList. - * The returned value indicates success, i.e. whether \a key is a - * valid key. - */ - bool insert(const String &key, const StringList &values); - - /*! - * Replaces any existing values for \a key with the given \a values, - * and simply insert them if \a key did not exist before. - * The returned value indicates success, i.e. whether \a key is a - * valid key. - */ - bool replace(const String &key, const StringList &values); - - /*! - * Find the first occurrence of \a key. - */ - Iterator find(const String &key); - - /*! - * Find the first occurrence of \a key. - */ - ConstIterator find(const String &key) const; - - /*! - * Returns true if the map contains values for \a key. - */ - bool contains(const String &key) const; - - /*! - * Returns true if this map contains all keys of \a other - * and the values coincide for that keys. Does not take - * the unsupportedData list into account. - */ - bool contains(const PropertyMap &other) const; - - /*! - * Erase the \a key and its values from the map. - */ - PropertyMap &erase(const String &key); - - /*! - * Erases from this map all keys that appear in \a other. - */ - PropertyMap &erase(const PropertyMap &other); - - /*! - * Merge the contents of \a other into this PropertyMap. - * If a key is contained in both maps, the values of the second - * are appended to that of the first. - * The unsupportedData() lists are concatenated as well. - */ - PropertyMap &merge(const PropertyMap &other); - - /*! - * Returns a reference to the value associated with \a key. - * - * \note: If \a key is not contained in the map, an empty - * StringList is returned without error. - */ - const StringList &operator[](const String &key) const; - - /*! - * Returns a reference to the value associated with \a key. - * - * \note: If \a key is not contained in the map, an empty - * StringList is returned. You can also directly add entries - * by using this function as an lvalue. - */ - StringList &operator[](const String &key); - - /*! - * Returns true if and only if \other has the same contents as this map. - */ - bool operator==(const PropertyMap &other) const; - - /*! - * Returns false if and only \other has the same contents as this map. - */ - bool operator!=(const PropertyMap &other) const; - - /*! - * If a PropertyMap is read from a File object using File::properties(), - * the StringList returned from this function will represent metadata - * that could not be parsed into the PropertyMap representation. This could - * be e.g. binary data, unknown ID3 frames, etc. - * You can remove items from the returned list, which tells TagLib to remove - * those unsupported elements if you call File::setProperties() with the - * same PropertyMap as argument. - */ - StringList &unsupportedData(); - const StringList &unsupportedData() const; - - /*! - * Removes all entries which have an empty value list. - */ - void removeEmpty(); - - String toString() const; - - private: - - - StringList unsupported; - }; - -} -#endif /* PROPERTYMAP_H_ */ diff --git a/src/taglib/taglib/toolkit/trefcounter.cpp b/src/taglib/taglib/toolkit/trefcounter.cpp deleted file mode 100644 index 71f3c2f..0000000 --- a/src/taglib/taglib/toolkit/trefcounter.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "trefcounter.h" - -#if defined(HAVE_STD_ATOMIC) -# include <atomic> -# define ATOMIC_INT std::atomic<unsigned int> -# define ATOMIC_INC(x) x.fetch_add(1) -# define ATOMIC_DEC(x) (x.fetch_sub(1) - 1) -#elif defined(HAVE_BOOST_ATOMIC) -# include <boost/atomic.hpp> -# define ATOMIC_INT boost::atomic<unsigned int> -# define ATOMIC_INC(x) x.fetch_add(1) -# define ATOMIC_DEC(x) (x.fetch_sub(1) - 1) -#elif defined(HAVE_GCC_ATOMIC) -# define ATOMIC_INT int -# define ATOMIC_INC(x) __sync_add_and_fetch(&x, 1) -# define ATOMIC_DEC(x) __sync_sub_and_fetch(&x, 1) -#elif defined(HAVE_WIN_ATOMIC) -# if !defined(NOMINMAX) -# define NOMINMAX -# endif -# include <windows.h> -# define ATOMIC_INT long -# define ATOMIC_INC(x) InterlockedIncrement(&x) -# define ATOMIC_DEC(x) InterlockedDecrement(&x) -#elif defined(HAVE_MAC_ATOMIC) -# include <libkern/OSAtomic.h> -# define ATOMIC_INT int32_t -# define ATOMIC_INC(x) OSAtomicIncrement32Barrier(&x) -# define ATOMIC_DEC(x) OSAtomicDecrement32Barrier(&x) -#elif defined(HAVE_IA64_ATOMIC) -# include <ia64intrin.h> -# define ATOMIC_INT int -# define ATOMIC_INC(x) __sync_add_and_fetch(&x, 1) -# define ATOMIC_DEC(x) __sync_sub_and_fetch(&x, 1) -#else -# define ATOMIC_INT int -# define ATOMIC_INC(x) (++x) -# define ATOMIC_DEC(x) (--x) -#endif - -namespace TagLib -{ - class RefCounter::RefCounterPrivate - { - public: - RefCounterPrivate() : refCount(1) {} - - void ref() { ATOMIC_INC(refCount); } - bool deref() { return (ATOMIC_DEC(refCount) == 0); } - int count() const { return refCount; } - - volatile ATOMIC_INT refCount; - }; - - RefCounter::RefCounter() - : d(new RefCounterPrivate()) - { - } - - RefCounter::~RefCounter() - { - delete d; - } - - void RefCounter::ref() - { - d->ref(); - } - - bool RefCounter::deref() - { - return d->deref(); - } - - int RefCounter::count() const - { - return d->count(); - } -} diff --git a/src/taglib/taglib/toolkit/trefcounter.h b/src/taglib/taglib/toolkit/trefcounter.h deleted file mode 100644 index 75388b1..0000000 --- a/src/taglib/taglib/toolkit/trefcounter.h +++ /dev/null @@ -1,111 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_REFCOUNTER_H -#define TAGLIB_REFCOUNTER_H - -#include "taglib_export.h" -#include "taglib.h" - -#ifdef __APPLE__ -# include <libkern/OSAtomic.h> -# define TAGLIB_ATOMIC_MAC -#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) -# define NOMINMAX -# include <windows.h> -# define TAGLIB_ATOMIC_WIN -#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 401) \ - && (defined(__i386__) || defined(__i486__) || defined(__i586__) || \ - defined(__i686__) || defined(__x86_64) || defined(__ia64)) \ - && !defined(__INTEL_COMPILER) -# define TAGLIB_ATOMIC_GCC -#elif defined(__ia64) && defined(__INTEL_COMPILER) -# include <ia64intrin.h> -# define TAGLIB_ATOMIC_GCC -#endif - -#ifndef DO_NOT_DOCUMENT // Tell Doxygen to skip this class. -/*! - * \internal - * This is just used as a base class for shared classes in TagLib. - * - * \warning This <b>is not</b> part of the TagLib public API! - */ -namespace TagLib -{ - - class TAGLIB_EXPORT RefCounter - { - public: - RefCounter(); - virtual ~RefCounter(); - - void ref(); - bool deref(); - int count() const; - - private: - class RefCounterPrivate; - RefCounterPrivate *d; - }; - - // BIC this old class is needed by tlist.tcc and tmap.tcc - class RefCounterOld - { - public: - RefCounterOld() : refCount(1) {} - -#ifdef TAGLIB_ATOMIC_MAC - void ref() { OSAtomicIncrement32Barrier(const_cast<int32_t*>(&refCount)); } - bool deref() { return ! OSAtomicDecrement32Barrier(const_cast<int32_t*>(&refCount)); } - int32_t count() { return refCount; } - private: - volatile int32_t refCount; -#elif defined(TAGLIB_ATOMIC_WIN) - void ref() { InterlockedIncrement(&refCount); } - bool deref() { return ! InterlockedDecrement(&refCount); } - long count() { return refCount; } - private: - volatile long refCount; -#elif defined(TAGLIB_ATOMIC_GCC) - void ref() { __sync_add_and_fetch(&refCount, 1); } - bool deref() { return ! __sync_sub_and_fetch(&refCount, 1); } - int count() { return refCount; } - private: - volatile int refCount; -#else - void ref() { refCount++; } - bool deref() { return ! --refCount; } - int count() { return refCount; } - private: - uint refCount; -#endif - }; - -} - -#endif // DO_NOT_DOCUMENT -#endif - diff --git a/src/taglib/taglib/toolkit/tstring.cpp b/src/taglib/taglib/toolkit/tstring.cpp deleted file mode 100644 index 75a9833..0000000 --- a/src/taglib/taglib/toolkit/tstring.cpp +++ /dev/null @@ -1,880 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -// This class assumes that std::basic_string<T> has a contiguous and null-terminated buffer. - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "tstring.h" -#include "tdebug.h" -#include "tstringlist.h" -#include "trefcounter.h" -#include "tutils.h" - -#include <iostream> -#include <cstdio> -#include <cstring> - -#ifdef HAVE_STD_CODECVT -# include <codecvt> -#else -# include "unicode.h" -#endif - -namespace -{ - - inline unsigned short combine(unsigned char c1, unsigned char c2) - { - return (c1 << 8) | c2; - } - - void UTF16toUTF8(const wchar_t *src, size_t srcLength, char *dst, size_t dstLength) - { -#ifdef HAVE_STD_CODECVT - - typedef std::codecvt_utf8_utf16<wchar_t> utf8_utf16_t; - - using namespace TagLib; - - const wchar_t *srcBegin = src; - const wchar_t *srcEnd = srcBegin + srcLength; - - char *dstBegin = dst; - char *dstEnd = dstBegin + dstLength; - - std::mbstate_t st; - const wchar_t *source; - char *target; - memset(&st, 0, sizeof(st)); - std::codecvt_base::result result = utf8_utf16_t().out( - st, srcBegin, srcEnd, source, dstBegin, dstEnd, target); - - if(result != utf8_utf16_t::ok) { - debug("String::copyFromUTF8() - Unicode conversion error."); - } - -#else - - using namespace Unicode; - using namespace TagLib; - - const Unicode::UTF16 *srcBegin = src; - const Unicode::UTF16 *srcEnd = srcBegin + srcLength; - - Unicode::UTF8 *dstBegin = reinterpret_cast<Unicode::UTF8*>(dst); - Unicode::UTF8 *dstEnd = dstBegin + dstLength; - - Unicode::ConversionResult result = Unicode::ConvertUTF16toUTF8( - &srcBegin, srcEnd, &dstBegin, dstEnd, Unicode::lenientConversion); - - if(result != Unicode::conversionOK) { - debug("String::to8Bit() - Unicode conversion error."); - } - -#endif - } - - void UTF8toUTF16(const char *src, size_t srcLength, wchar_t *dst, size_t dstLength) - { -#ifdef HAVE_STD_CODECVT - - typedef std::codecvt_utf8_utf16<wchar_t> utf8_utf16_t; - - using namespace TagLib; - - const char *srcBegin = src; - const char *srcEnd = srcBegin + srcLength; - - wchar_t *dstBegin = dst; - wchar_t *dstEnd = dstBegin + dstLength; - - std::mbstate_t st; - const char *source; - wchar_t *target; - memset(&st, 0, sizeof(st)); - std::codecvt_base::result result = utf8_utf16_t().in( - st, srcBegin, srcEnd, source, dstBegin, dstEnd, target); - - if(result != utf8_utf16_t::ok) { - debug("String::copyFromUTF8() - Unicode conversion error."); - } - -#else - - using namespace Unicode; - using namespace TagLib; - - const Unicode::UTF8 *srcBegin = reinterpret_cast<const Unicode::UTF8*>(src); - const Unicode::UTF8 *srcEnd = srcBegin + srcLength; - - Unicode::UTF16 *dstBegin = dst; - Unicode::UTF16 *dstEnd = dstBegin + dstLength; - - Unicode::ConversionResult result = Unicode::ConvertUTF8toUTF16( - &srcBegin, srcEnd, &dstBegin, dstEnd, Unicode::lenientConversion); - - if(result != Unicode::conversionOK) { - debug("String::copyFromUTF8() - Unicode conversion error."); - } - -#endif - } -} - -namespace TagLib { - -class String::StringPrivate : public RefCounter -{ -public: - StringPrivate() - : RefCounter() - { - } - - StringPrivate(const wstring &s) - : RefCounter() - , data(s) - { - } - - StringPrivate(uint n, wchar_t c) - : RefCounter() - , data(static_cast<size_t>(n), c) - { - } - - /*! - * Stores string in UTF-16. The byte order depends on the CPU endian. - */ - TagLib::wstring data; - - /*! - * This is only used to hold the the most recent value of toCString(). - */ - std::string cstring; -}; - -String String::null; - -//////////////////////////////////////////////////////////////////////////////// - -String::String() - : d(new StringPrivate()) -{ -} - -String::String(const String &s) - : d(s.d) -{ - d->ref(); -} - -String::String(const std::string &s, Type t) - : d(new StringPrivate()) -{ - if(t == Latin1) - copyFromLatin1(&s[0], s.length()); - else if(t == String::UTF8) - copyFromUTF8(&s[0], s.length()); - else { - debug("String::String() -- A std::string should not contain UTF16."); - } -} - -String::String(const wstring &s, Type t) - : d(new StringPrivate()) -{ - if(t == UTF16 || t == UTF16BE || t == UTF16LE) - copyFromUTF16(s.c_str(), s.length(), t); - else { - debug("String::String() -- A TagLib::wstring should not contain Latin1 or UTF-8."); - } -} - -String::String(const wchar_t *s, Type t) - : d(new StringPrivate()) -{ - if(t == UTF16 || t == UTF16BE || t == UTF16LE) - copyFromUTF16(s, ::wcslen(s), t); - else { - debug("String::String() -- A const wchar_t * should not contain Latin1 or UTF-8."); - } -} - -String::String(const char *s, Type t) - : d(new StringPrivate()) -{ - if(t == Latin1) - copyFromLatin1(s, ::strlen(s)); - else if(t == String::UTF8) - copyFromUTF8(s, ::strlen(s)); - else { - debug("String::String() -- A const char * should not contain UTF16."); - } -} - -String::String(wchar_t c, Type t) - : d(new StringPrivate()) -{ - if(t == UTF16 || t == UTF16BE || t == UTF16LE) - copyFromUTF16(&c, 1, t); - else { - debug("String::String() -- A const wchar_t should not contain Latin1 or UTF-8."); - } -} - -String::String(char c, Type t) - : d(new StringPrivate(1, static_cast<uchar>(c))) -{ - if(t != Latin1 && t != UTF8) { - debug("String::String() -- A char should not contain UTF16."); - } -} - -String::String(const ByteVector &v, Type t) - : d(new StringPrivate()) -{ - if(v.isEmpty()) - return; - - if(t == Latin1) - copyFromLatin1(v.data(), v.size()); - else if(t == UTF8) - copyFromUTF8(v.data(), v.size()); - else - copyFromUTF16(v.data(), v.size(), t); - - // If we hit a null in the ByteVector, shrink the string again. - d->data.resize(::wcslen(d->data.c_str())); -} - -//////////////////////////////////////////////////////////////////////////////// - -String::~String() -{ - if(d->deref()) - delete d; -} - -std::string String::to8Bit(bool unicode) const -{ - std::string s; - - if(!unicode) { - s.resize(d->data.size()); - - std::string::iterator targetIt = s.begin(); - for(wstring::const_iterator it = d->data.begin(); it != d->data.end(); it++) { - *targetIt = static_cast<char>(*it); - ++targetIt; - } - } - else { - s.resize(d->data.size() * 4 + 1); - - UTF16toUTF8(&d->data[0], d->data.size(), &s[0], s.size()); - s.resize(::strlen(s.c_str())); - } - - return s; -} - -TagLib::wstring String::toWString() const -{ - return d->data; -} - -const char *String::toCString(bool unicode) const -{ - d->cstring = to8Bit(unicode); - return d->cstring.c_str(); -} - -const wchar_t *String::toCWString() const -{ - return d->data.c_str(); -} - -String::Iterator String::begin() -{ - return d->data.begin(); -} - -String::ConstIterator String::begin() const -{ - return d->data.begin(); -} - -String::Iterator String::end() -{ - return d->data.end(); -} - -String::ConstIterator String::end() const -{ - return d->data.end(); -} - -int String::find(const String &s, int offset) const -{ - return d->data.find(s.d->data, offset); -} - -int String::rfind(const String &s, int offset) const -{ - return d->data.rfind(s.d->data, offset); -} - -StringList String::split(const String &separator) const -{ - StringList list; - for(int index = 0;;) - { - int sep = find(separator, index); - if(sep < 0) - { - list.append(substr(index, size() - index)); - break; - } - else - { - list.append(substr(index, sep - index)); - index = sep + separator.size(); - } - } - return list; -} - -bool String::startsWith(const String &s) const -{ - if(s.length() > length()) - return false; - - return substr(0, s.length()) == s; -} - -String String::substr(uint position, uint n) const -{ - return String(d->data.substr(position, n)); -} - -String &String::append(const String &s) -{ - detach(); - d->data += s.d->data; - return *this; -} - -String String::upper() const -{ - String s; - - static int shift = 'A' - 'a'; - - for(wstring::const_iterator it = d->data.begin(); it != d->data.end(); ++it) { - if(*it >= 'a' && *it <= 'z') - s.d->data.push_back(*it + shift); - else - s.d->data.push_back(*it); - } - - return s; -} - -TagLib::uint String::size() const -{ - return d->data.size(); -} - -TagLib::uint String::length() const -{ - return size(); -} - -bool String::isEmpty() const -{ - return d->data.size() == 0; -} - -bool String::isNull() const -{ - return d == null.d; -} - -ByteVector String::data(Type t) const -{ - switch(t) - { - case Latin1: - { - ByteVector v(size(), 0); - char *p = v.data(); - - for(wstring::const_iterator it = d->data.begin(); it != d->data.end(); it++) - *p++ = static_cast<char>(*it); - - return v; - } - case UTF8: - { - ByteVector v(size() * 4 + 1, 0); - - UTF16toUTF8(&d->data[0], d->data.size(), v.data(), v.size()); - v.resize(::strlen(v.data())); - - return v; - } - case UTF16: - { - ByteVector v(2 + size() * 2, 0); - char *p = v.data(); - - // Assume that if we're doing UTF16 and not UTF16BE that we want little - // endian encoding. (Byte Order Mark) - - *p++ = '\xff'; - *p++ = '\xfe'; - - for(wstring::const_iterator it = d->data.begin(); it != d->data.end(); it++) { - *p++ = static_cast<char>(*it & 0xff); - *p++ = static_cast<char>(*it >> 8); - } - - return v; - } - case UTF16BE: - { - ByteVector v(size() * 2, 0); - char *p = v.data(); - - for(wstring::const_iterator it = d->data.begin(); it != d->data.end(); it++) { - *p++ = static_cast<char>(*it >> 8); - *p++ = static_cast<char>(*it & 0xff); - } - - return v; - } - case UTF16LE: - { - ByteVector v(size() * 2, 0); - char *p = v.data(); - - for(wstring::const_iterator it = d->data.begin(); it != d->data.end(); it++) { - *p++ = static_cast<char>(*it & 0xff); - *p++ = static_cast<char>(*it >> 8); - } - - return v; - } - default: - { - debug("String::data() - Invalid Type value."); - return ByteVector(); - } - } -} - -int String::toInt() const -{ - return toInt(0); -} - -int String::toInt(bool *ok) const -{ - int value = 0; - - uint size = d->data.size(); - bool negative = size > 0 && d->data[0] == '-'; - uint start = negative ? 1 : 0; - uint i = start; - - for(; i < size && d->data[i] >= '0' && d->data[i] <= '9'; i++) - value = value * 10 + (d->data[i] - '0'); - - if(negative) - value = value * -1; - - if(ok) - *ok = (size > start && i == size); - - return value; -} - -String String::stripWhiteSpace() const -{ - wstring::const_iterator begin = d->data.begin(); - wstring::const_iterator end = d->data.end(); - - while(begin != end && - (*begin == '\t' || *begin == '\n' || *begin == '\f' || - *begin == '\r' || *begin == ' ')) - { - ++begin; - } - - if(begin == end) - return null; - - // There must be at least one non-whitespace character here for us to have - // gotten this far, so we should be safe not doing bounds checking. - - do { - --end; - } while(*end == '\t' || *end == '\n' || - *end == '\f' || *end == '\r' || *end == ' '); - - return String(wstring(begin, end + 1)); -} - -bool String::isLatin1() const -{ - for(wstring::const_iterator it = d->data.begin(); it != d->data.end(); it++) { - if(*it >= 256) - return false; - } - return true; -} - -bool String::isAscii() const -{ - for(wstring::const_iterator it = d->data.begin(); it != d->data.end(); it++) { - if(*it >= 128) - return false; - } - return true; -} - -String String::number(int n) // static -{ - static const size_t BufferSize = 11; // Sufficient to store "-214748364". - static const char *Format = "%d"; - - char buffer[BufferSize]; - int length; - -#if defined(HAVE_SNPRINTF) - - length = snprintf(buffer, BufferSize, Format, n); - -#elif defined(HAVE_SPRINTF_S) - - length = sprintf_s(buffer, Format, n); - -#else - - length = sprintf(buffer, Format, n); - -#endif - - if(length > 0) - return String(buffer); - else - return String::null; -} - -TagLib::wchar &String::operator[](int i) -{ - detach(); - return d->data[i]; -} - -const TagLib::wchar &String::operator[](int i) const -{ - return d->data[i]; -} - -bool String::operator==(const String &s) const -{ - return d == s.d || d->data == s.d->data; -} - -bool String::operator!=(const String &s) const -{ - return !operator==(s); -} - -String &String::operator+=(const String &s) -{ - detach(); - - d->data += s.d->data; - return *this; -} - -String &String::operator+=(const wchar_t *s) -{ - detach(); - - d->data += s; - return *this; -} - -String &String::operator+=(const char *s) -{ - detach(); - - for(int i = 0; s[i] != 0; i++) - d->data += uchar(s[i]); - return *this; -} - -String &String::operator+=(wchar_t c) -{ - detach(); - - d->data += c; - return *this; -} - -String &String::operator+=(char c) -{ - detach(); - - d->data += uchar(c); - return *this; -} - -String &String::operator=(const String &s) -{ - if(&s == this) - return *this; - - if(d->deref()) - delete d; - d = s.d; - d->ref(); - return *this; -} - -String &String::operator=(const std::string &s) -{ - if(d->deref()) - delete d; - - d = new StringPrivate; - copyFromLatin1(s.c_str(), s.length()); - - return *this; -} - -String &String::operator=(const wstring &s) -{ - if(d->deref()) - delete d; - d = new StringPrivate(s); - return *this; -} - -String &String::operator=(const wchar_t *s) -{ - if(d->deref()) - delete d; - - d = new StringPrivate(s); - return *this; -} - -String &String::operator=(char c) -{ - if(d->deref()) - delete d; - - d = new StringPrivate(1, static_cast<uchar>(c)); - return *this; -} - -String &String::operator=(wchar_t c) -{ - if(d->deref()) - delete d; - - d = new StringPrivate(1, c); - return *this; -} - -String &String::operator=(const char *s) -{ - if(d->deref()) - delete d; - - d = new StringPrivate; - copyFromLatin1(s, ::strlen(s)); - - return *this; -} - -String &String::operator=(const ByteVector &v) -{ - if(d->deref()) - delete d; - - d = new StringPrivate; - copyFromLatin1(v.data(), v.size()); - - // If we hit a null in the ByteVector, shrink the string again. - d->data.resize(::wcslen(d->data.c_str())); - - return *this; -} - -bool String::operator<(const String &s) const -{ - return d->data < s.d->data; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void String::detach() -{ - if(d->count() > 1) { - d->deref(); - d = new StringPrivate(d->data); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void String::copyFromLatin1(const char *s, size_t length) -{ - d->data.resize(length); - - for(size_t i = 0; i < length; ++i) - d->data[i] = static_cast<uchar>(s[i]); -} - -void String::copyFromUTF8(const char *s, size_t length) -{ - d->data.resize(length); - - UTF8toUTF16(s, length, &d->data[0], d->data.size()); - d->data.resize(::wcslen(d->data.c_str())); -} - -void String::copyFromUTF16(const wchar_t *s, size_t length, Type t) -{ - bool swap; - if(t == UTF16) { - if(length >= 1 && s[0] == 0xfeff) - swap = false; // Same as CPU endian. No need to swap bytes. - else if(length >= 1 && s[0] == 0xfffe) - swap = true; // Not same as CPU endian. Need to swap bytes. - else { - debug("String::copyFromUTF16() - Invalid UTF16 string."); - return; - } - - s++; - length--; - } - else - swap = (t != WCharByteOrder); - - d->data.resize(length); - memcpy(&d->data[0], s, length * sizeof(wchar_t)); - - if(swap) { - for(size_t i = 0; i < length; ++i) - d->data[i] = Utils::byteSwap(static_cast<ushort>(s[i])); - } -} - -void String::copyFromUTF16(const char *s, size_t length, Type t) -{ - bool swap; - if(t == UTF16) { - if(length < 2) { - debug("String::copyFromUTF16() - Invalid UTF16 string."); - return; - } - - // Uses memcpy instead of reinterpret_cast to avoid an alignment exception. - ushort bom; - ::memcpy(&bom, s, 2); - - if(bom == 0xfeff) - swap = false; // Same as CPU endian. No need to swap bytes. - else if(bom == 0xfffe) - swap = true; // Not same as CPU endian. Need to swap bytes. - else { - debug("String::copyFromUTF16() - Invalid UTF16 string."); - return; - } - - s += 2; - length -= 2; - } - else - swap = (t != WCharByteOrder); - - d->data.resize(length / 2); - for(size_t i = 0; i < length / 2; ++i) { - d->data[i] = swap ? combine(*s, *(s + 1)) : combine(*(s + 1), *s); - s += 2; - } -} - -const String::Type String::WCharByteOrder - = (Utils::SystemByteOrder == Utils::BigEndian) ? String::UTF16BE : String::UTF16LE; - -} - -//////////////////////////////////////////////////////////////////////////////// -// related functions -//////////////////////////////////////////////////////////////////////////////// - -const TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2) -{ - TagLib::String s(s1); - s.append(s2); - return s; -} - -const TagLib::String operator+(const char *s1, const TagLib::String &s2) -{ - TagLib::String s(s1); - s.append(s2); - return s; -} - -const TagLib::String operator+(const TagLib::String &s1, const char *s2) -{ - TagLib::String s(s1); - s.append(s2); - return s; -} - -std::ostream &operator<<(std::ostream &s, const TagLib::String &str) -{ - s << str.to8Bit(); - return s; -} - diff --git a/src/taglib/taglib/toolkit/tstring.h b/src/taglib/taglib/toolkit/tstring.h deleted file mode 100644 index 57945be..0000000 --- a/src/taglib/taglib/toolkit/tstring.h +++ /dev/null @@ -1,543 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_STRING_H -#define TAGLIB_STRING_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tbytevector.h" - -#include <string> -#include <iostream> - -/*! - * \relates TagLib::String - * - * Converts a QString to a TagLib::String without a requirement to link to Qt. - * - * \note consider conversion via usual char-by-char for loop to avoid UTF16->UTF8->UTF16 - * conversion happening in the background - */ -#define QStringToTString(s) TagLib::String(s.utf8().data(), TagLib::String::UTF8) - -/*! - * \relates TagLib::String - * - * Converts a TagLib::String to a QString without a requirement to link to Qt. - * - * \note consider conversion via usual char-by-char for loop to avoid UTF16->UTF8->UTF16 - * conversion happening in the background - * - */ -#define TStringToQString(s) QString::fromUtf8(s.toCString(true)) - -namespace TagLib { - - class StringList; - - //! A \e wide string class suitable for unicode. - - /*! - * This is an implicitly shared \e wide string. For storage it uses - * TagLib::wstring, but as this is an <i>implementation detail</i> this of - * course could change. Strings are stored internally as UTF-16(without BOM/ - * CPU byte order) - * - * The use of implicit sharing means that copying a string is cheap, the only - * \e cost comes into play when the copy is modified. Prior to that the string - * just has a pointer to the data of the \e parent String. This also makes - * this class suitable as a function return type. - * - * In addition to adding implicit sharing, this class keeps track of four - * possible encodings, which are the four supported by the ID3v2 standard. - */ - - class TAGLIB_EXPORT String - { - public: - -#ifndef DO_NOT_DOCUMENT - typedef std::basic_string<wchar>::iterator Iterator; - typedef std::basic_string<wchar>::const_iterator ConstIterator; -#endif - - /** - * The four types of string encodings supported by the ID3v2 specification. - * ID3v1 is assumed to be Latin1 and Ogg Vorbis comments use UTF8. - */ - enum Type { - /*! - * IS08859-1, or <i>Latin1</i> encoding. 8 bit characters. - */ - Latin1 = 0, - /*! - * UTF16 with a <i>byte order mark</i>. 16 bit characters. - */ - UTF16 = 1, - /*! - * UTF16 <i>big endian</i>. 16 bit characters. This is the encoding used - * internally by TagLib. - */ - UTF16BE = 2, - /*! - * UTF8 encoding. Characters are usually 8 bits but can be up to 32. - */ - UTF8 = 3, - /*! - * UTF16 <i>little endian</i>. 16 bit characters. - */ - UTF16LE = 4 - }; - - /*! - * Constructs an empty String. - */ - String(); - - /*! - * Make a shallow, implicitly shared, copy of \a s. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - String(const String &s); - - /*! - * Makes a deep copy of the data in \a s. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(const std::string &s, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a s. - */ - String(const wstring &s, Type t = WCharByteOrder); - - /*! - * Makes a deep copy of the data in \a s. - */ - String(const wchar_t *s, Type t = WCharByteOrder); - - /*! - * Makes a deep copy of the data in \a c. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(char c, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a c. - */ - String(wchar_t c, Type t = Latin1); - - - /*! - * Makes a deep copy of the data in \a s. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(const char *s, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a s. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(const ByteVector &v, Type t = Latin1); - - /*! - * Destroys this String instance. - */ - virtual ~String(); - - /*! - * Returns a deep copy of this String as an std::string. The returned string - * is encoded in UTF8 if \a unicode is true, otherwise Latin1. - * - * \see toCString() - */ - std::string to8Bit(bool unicode = false) const; - - /*! - * Returns a deep copy of this String as a wstring. The returned string is - * encoded in UTF-16 (without BOM/CPU byte order). - * - * \see toCWString() - */ - wstring toWString() const; - - /*! - * Creates and returns a standard C-style (null-terminated) version of this - * String. The returned string is encoded in UTF8 if \a unicode is true, - * otherwise Latin1. - * - * The returned string is still owned by this String and should not be deleted - * by the user. - * - * The returned pointer remains valid until this String instance is destroyed - * or toCString() is called again. - * - * \warning This however has the side effect that the returned string will remain - * in memory <b>in addition to</b> other memory that is consumed by this - * String instance. So, this method should not be used on large strings or - * where memory is critical. Consider using to8Bit() instead to avoid it. - * - * \see to8Bit() - */ - const char *toCString(bool unicode = false) const; - - /*! - * Returns a standard C-style (null-terminated) wide character version of - * this String. The returned string is encoded in UTF-16 (without BOM/CPU byte - * order). - * - * The returned string is still owned by this String and should not be deleted - * by the user. - * - * The returned pointer remains valid until this String instance is destroyed - * or any other method of this String is called. - * - * /note This returns a pointer to the String's internal data without any - * conversions. - * - * \see toWString() - */ - const wchar_t *toCWString() const; - - /*! - * Returns an iterator pointing to the beginning of the string. - */ - Iterator begin(); - - /*! - * Returns a const iterator pointing to the beginning of the string. - */ - ConstIterator begin() const; - - /*! - * Returns an iterator pointing to the end of the string (the position - * after the last character). - */ - Iterator end(); - - /*! - * Returns a const iterator pointing to the end of the string (the position - * after the last character). - */ - ConstIterator end() const; - - /*! - * Finds the first occurrence of pattern \a s in this string starting from - * \a offset. If the pattern is not found, -1 is returned. - */ - int find(const String &s, int offset = 0) const; - - /*! - * Finds the last occurrence of pattern \a s in this string, searched backwards, - * either from the end of the string or starting from \a offset. If the pattern - * is not found, -1 is returned. - */ - int rfind(const String &s, int offset = -1) const; - - /*! - * Splits the string on each occurrence of \a separator. - */ - StringList split(const String &separator = " ") const; - - /*! - * Returns true if the strings starts with the substring \a s. - */ - bool startsWith(const String &s) const; - - /*! - * Extract a substring from this string starting at \a position and - * continuing for \a n characters. - */ - String substr(uint position, uint n = 0xffffffff) const; - - /*! - * Append \a s to the current string and return a reference to the current - * string. - */ - String &append(const String &s); - - /*! - * Returns an upper case version of the string. - * - * \warning This only works for the characters in US-ASCII, i.e. A-Z. - */ - String upper() const; - - /*! - * Returns the size of the string. - */ - uint size() const; - - /*! - * Returns the length of the string. Equivalent to size(). - */ - uint length() const; - - /*! - * Returns true if the string is empty. - * - * \see isNull() - */ - bool isEmpty() const; - - /*! - * Returns true if this string is null -- i.e. it is a copy of the - * String::null string. - * - * \note A string can be empty and not null. - * \see isEmpty() - */ - bool isNull() const; - - /*! - * Returns a ByteVector containing the string's data. If \a t is Latin1 or - * UTF8, this will return a vector of 8 bit characters, otherwise it will use - * 16 bit characters. - */ - ByteVector data(Type t) const; - - /*! - * Convert the string to an integer. - * - * Returns the integer if the conversion was successful or 0 if the - * string does not represent a number. - */ - // BIC: merge with the method below - int toInt() const; - - /*! - * Convert the string to an integer. - * - * If the conversion was successfull, it sets the value of \a *ok to - * true and returns the integer. Otherwise it sets \a *ok to false - * and the result is undefined. - */ - int toInt(bool *ok) const; - - /*! - * Returns a string with the leading and trailing whitespace stripped. - */ - String stripWhiteSpace() const; - - /*! - * Returns true if the file only uses characters required by Latin1. - */ - bool isLatin1() const; - - /*! - * Returns true if the file only uses characters required by (7-bit) ASCII. - */ - bool isAscii() const; - - /*! - * Converts the base-10 integer \a n to a string. - */ - static String number(int n); - - /*! - * Returns a reference to the character at position \a i. - */ - wchar &operator[](int i); - - /*! - * Returns a const reference to the character at position \a i. - */ - const wchar &operator[](int i) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns true if the strings match. - */ - bool operator==(const String &s) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns false if the strings match. - */ - bool operator!=(const String &s) const; - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const String &s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const wchar_t* s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const char* s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(wchar_t c); - - /*! - * Appends \a c to the end of the String. - */ - String &operator+=(char c); - - /*! - * Performs a shallow, implicitly shared, copy of \a s, overwriting the - * String's current data. - */ - String &operator=(const String &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const std::string &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const wstring &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const wchar_t *s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(char c); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(wchar_t c); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const char *s); - - /*! - * Performs a deep copy of the data in \a v. - */ - String &operator=(const ByteVector &v); - - /*! - * To be able to use this class in a Map, this operator needed to be - * implemented. Returns true if \a s is less than this string in a bytewise - * comparison. - */ - bool operator<(const String &s) const; - - /*! - * A null string provided for convenience. - */ - static String null; - - protected: - /*! - * If this String is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: - /*! - * Converts a \e Latin-1 string into \e UTF-16(without BOM/CPU byte order) - * and copies it to the internal buffer. - */ - void copyFromLatin1(const char *s, size_t length); - - /*! - * Converts a \e UTF-8 string into \e UTF-16(without BOM/CPU byte order) - * and copies it to the internal buffer. - */ - void copyFromUTF8(const char *s, size_t length); - - /*! - * Converts a \e UTF-16 (with BOM), UTF-16LE or UTF16-BE string into - * \e UTF-16(without BOM/CPU byte order) and copies it to the internal buffer. - */ - void copyFromUTF16(const wchar_t *s, size_t length, Type t); - - /*! - * Converts a \e UTF-16 (with BOM), UTF-16LE or UTF16-BE string into - * \e UTF-16(without BOM/CPU byte order) and copies it to the internal buffer. - */ - void copyFromUTF16(const char *s, size_t length, Type t); - - /*! - * Indicates which byte order of UTF-16 is used to store strings internally. - * - * \note \e String::UTF16BE or \e String::UTF16LE - */ - static const Type WCharByteOrder; - - class StringPrivate; - StringPrivate *d; - }; -} - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT const TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2); - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT const TagLib::String operator+(const char *s1, const TagLib::String &s2); - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT const TagLib::String operator+(const TagLib::String &s1, const char *s2); - - -/*! - * \relates TagLib::String - * - * Send the string to an output stream. - */ -TAGLIB_EXPORT std::ostream &operator<<(std::ostream &s, const TagLib::String &str); - -#endif diff --git a/src/taglib/taglib/toolkit/tstringlist.cpp b/src/taglib/taglib/toolkit/tstringlist.cpp deleted file mode 100644 index 655fe6c..0000000 --- a/src/taglib/taglib/toolkit/tstringlist.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tstringlist.h" - -using namespace TagLib; - -class StringListPrivate -{ - -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -StringList StringList::split(const String &s, const String &pattern) -{ - StringList l; - - int previousOffset = 0; - for(int offset = s.find(pattern); offset != -1; offset = s.find(pattern, offset + 1)) { - l.append(s.substr(previousOffset, offset - previousOffset)); - previousOffset = offset + 1; - } - - l.append(s.substr(previousOffset, s.size() - previousOffset)); - - return l; -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -StringList::StringList() : List<String>() -{ - -} - -StringList::StringList(const StringList &l) : List<String>(l) -{ - -} - -StringList::StringList(const String &s) : List<String>() -{ - append(s); -} - -StringList::StringList(const ByteVectorList &bl, String::Type t) : List<String>() -{ - ByteVectorList::ConstIterator i = bl.begin(); - for(;i != bl.end(); i++) { - append(String(*i, t)); - } -} - -StringList::~StringList() -{ - -} - -String StringList::toString(const String &separator) const -{ - String s; - - ConstIterator it = begin(); - ConstIterator itEnd = end(); - - while(it != itEnd) { - s += *it; - it++; - if(it != itEnd) - s += separator; - } - - return s; -} - -StringList &StringList::append(const String &s) -{ - List<String>::append(s); - return *this; -} - -StringList &StringList::append(const StringList &l) -{ - List<String>::append(l); - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -// related functions -//////////////////////////////////////////////////////////////////////////////// - -std::ostream &operator<<(std::ostream &s, const StringList &l) -{ - s << l.toString(); - return s; -} diff --git a/src/taglib/taglib/toolkit/tstringlist.h b/src/taglib/taglib/toolkit/tstringlist.h deleted file mode 100644 index f94b50f..0000000 --- a/src/taglib/taglib/toolkit/tstringlist.h +++ /dev/null @@ -1,115 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_STRINGLIST_H -#define TAGLIB_STRINGLIST_H - -#include "tstring.h" -#include "tlist.h" -#include "tbytevectorlist.h" -#include "taglib_export.h" - -#include <iostream> - -namespace TagLib { - - //! A list of strings - - /*! - * This is a spcialization of the List class with some members convention for - * string operations. - */ - - class TAGLIB_EXPORT StringList : public List<String> - { - public: - - /*! - * Constructs an empty StringList. - */ - StringList(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - StringList(const StringList &l); - - /*! - * Constructs a StringList with \a s as a member. - */ - StringList(const String &s); - - /*! - * Makes a deep copy of the data in \a vl. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - StringList(const ByteVectorList &vl, String::Type t = String::Latin1); - - /*! - * Destroys this StringList instance. - */ - virtual ~StringList(); - - /*! - * Concatenate the list of strings into one string separated by \a separator. - */ - String toString(const String &separator = " ") const; - - /*! - * Appends \a s to the end of the list and returns a reference to the - * list. - */ - StringList &append(const String &s); - - /*! - * Appends all of the values in \a l to the end of the list and returns a - * reference to the list. - */ - StringList &append(const StringList &l); - - /*! - * Splits the String \a s into several strings at \a pattern. This will not include - * the pattern in the returned strings. - */ - static StringList split(const String &s, const String &pattern); - - private: - class StringListPrivate; - StringListPrivate *d; - }; - -} - -/*! - * \related TagLib::StringList - * Send the StringList to an output stream. - */ -std::ostream &operator<<(std::ostream &s, const TagLib::StringList &l); - -#endif diff --git a/src/taglib/taglib/toolkit/tutils.h b/src/taglib/taglib/toolkit/tutils.h deleted file mode 100644 index 4a398d2..0000000 --- a/src/taglib/taglib/toolkit/tutils.h +++ /dev/null @@ -1,190 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TUTILS_H -#define TAGLIB_TUTILS_H - -// THIS FILE IS NOT A PART OF THE TAGLIB API - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#if defined(HAVE_MSC_BYTESWAP) -# include <stdlib.h> -#elif defined(HAVE_GLIBC_BYTESWAP) -# include <byteswap.h> -#elif defined(HAVE_MAC_BYTESWAP) -# include <libkern/OSByteOrder.h> -#elif defined(HAVE_OPENBSD_BYTESWAP) -# include <sys/endian.h> -#endif - -namespace TagLib -{ - namespace Utils - { - inline ushort byteSwap(ushort x) - { -#if defined(HAVE_GCC_BYTESWAP_16) - - return __builtin_bswap16(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_ushort(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_16(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt16(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap16(x); - -#else - - return ((x >> 8) & 0xff) | ((x & 0xff) << 8); - -#endif - } - - inline uint byteSwap(uint x) - { -#if defined(HAVE_GCC_BYTESWAP_32) - - return __builtin_bswap32(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_ulong(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_32(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt32(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap32(x); - -#else - - return ((x & 0xff000000u) >> 24) - | ((x & 0x00ff0000u) >> 8) - | ((x & 0x0000ff00u) << 8) - | ((x & 0x000000ffu) << 24); - -#endif - } - - inline ulonglong byteSwap(ulonglong x) - { -#if defined(HAVE_GCC_BYTESWAP_64) - - return __builtin_bswap64(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_uint64(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_64(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt64(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap64(x); - -#else - - return ((x & 0xff00000000000000ull) >> 56) - | ((x & 0x00ff000000000000ull) >> 40) - | ((x & 0x0000ff0000000000ull) >> 24) - | ((x & 0x000000ff00000000ull) >> 8) - | ((x & 0x00000000ff000000ull) << 8) - | ((x & 0x0000000000ff0000ull) << 24) - | ((x & 0x000000000000ff00ull) << 40) - | ((x & 0x00000000000000ffull) << 56); - -#endif - } - - enum ByteOrder - { - LittleEndian, - BigEndian - }; - -#ifdef SYSTEM_BYTEORDER - -# if SYSTEM_BYTEORDER == 1 - - const ByteOrder SystemByteOrder = LittleEndian; - -# else - - const ByteOrder SystemByteOrder = BigEndian; - -# endif - -#else - - inline ByteOrder systemByteOrder() - { - union { - int i; - char c; - } u; - - u.i = 1; - if(u.c == 1) - return LittleEndian; - else - return BigEndian; - } - - const ByteOrder SystemByteOrder = systemByteOrder(); - -#endif - } -} - -#endif - -#endif diff --git a/src/taglib/taglib/toolkit/unicode.cpp b/src/taglib/taglib/toolkit/unicode.cpp deleted file mode 100644 index 1b26977..0000000 --- a/src/taglib/taglib/toolkit/unicode.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/******************************************************************************* - * * - * THIS FILE IS INCLUDED IN TAGLIB, BUT IS NOT COPYRIGHTED BY THE TAGLIB * - * AUTHORS, NOT PART OF THE TAGLIB API AND COULD GO AWAY AT ANY POINT IN TIME. * - * AS SUCH IT SHOULD BE CONSIERED FOR INTERNAL USE ONLY. * - * * - *******************************************************************************/ - -/* - * Copyright 2001 Unicode, Inc. - * - * Disclaimer - * - * This source code is provided as is by Unicode, Inc. No claims are - * made as to fitness for any particular purpose. No warranties of any - * kind are expressed or implied. The recipient agrees to determine - * applicability of information provided. If this file has been - * purchased on magnetic or optical media from Unicode, Inc., the - * sole remedy for any claim will be exchange of defective media - * within 90 days of receipt. - * - * Limitations on Rights to Redistribute This Code - * - * Unicode, Inc. hereby grants the right to freely use the information - * supplied in this file in the creation of products supporting the - * Unicode Standard, and to make copies of this file in any form - * for internal or external distribution as long as this notice - * remains attached. - */ - -/* - * This file has been modified by Scott Wheeler <wheeler@kde.org> to remove - * the UTF32 conversion functions and to place the appropriate functions - * in their own C++ namespace. - */ - -/* --------------------------------------------------------------------- - - Conversions between UTF32, UTF-16, and UTF-8. Source code file. - Author: Mark E. Davis, 1994. - Rev History: Rick McGowan, fixes & updates May 2001. - Sept 2001: fixed const & error conditions per - mods suggested by S. Parent & A. Lillich. - - See the header file "ConvertUTF.h" for complete documentation. - ------------------------------------------------------------------------- */ - - -#include "unicode.h" -#include <stdio.h> - -#define UNI_SUR_HIGH_START (UTF32)0xD800 -#define UNI_SUR_HIGH_END (UTF32)0xDBFF -#define UNI_SUR_LOW_START (UTF32)0xDC00 -#define UNI_SUR_LOW_END (UTF32)0xDFFF -#define false 0 -#define true 1 - -namespace Unicode { - -static const int halfShift = 10; /* used for shifting by 10 bits */ - -static const UTF32 halfBase = 0x0010000UL; -static const UTF32 halfMask = 0x3FFUL; - -/* - * Index into the table below with the first byte of a UTF-8 sequence to - * get the number of trailing bytes that are supposed to follow it. - */ -static const char trailingBytesForUTF8[256] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 -}; - -/* - * Magic values subtracted from a buffer value during UTF8 conversion. - * This table contains as many values as there might be trailing bytes - * in a UTF-8 sequence. - */ -static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, - 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; - -/* - * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed - * into the first byte, depending on how many bytes follow. There are - * as many entries in this table as there are UTF-8 sequence types. - * (I.e., one byte sequence, two byte... six byte sequence.) - */ -static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - -/* --------------------------------------------------------------------- */ - -/* The interface converts a whole buffer to avoid function-call overhead. - * Constants have been gathered. Loops & conditionals have been removed as - * much as possible for efficiency, in favor of drop-through switches. - * (See "Note A" at the bottom of the file for equivalent code.) - * If your compiler supports it, the "isLegalUTF8" call can be turned - * into an inline function. - */ - -/* --------------------------------------------------------------------- */ - -ConversionResult ConvertUTF16toUTF8 ( - const UTF16** sourceStart, const UTF16* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { - ConversionResult result = conversionOK; - const UTF16* source = *sourceStart; - UTF8* target = *targetStart; - while (source < sourceEnd) { - UTF32 ch; - unsigned short bytesToWrite = 0; - const UTF32 byteMask = 0xBF; - const UTF32 byteMark = 0x80; - const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ - ch = *source++; - /* If we have a surrogate pair, convert to UTF32 first. */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END && source < sourceEnd) { - UTF32 ch2 = *source; - if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { - ch = ((ch - UNI_SUR_HIGH_START) << halfShift) - + (ch2 - UNI_SUR_LOW_START) + halfBase; - ++source; - } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ - --source; /* return to the illegal value itself */ - result = sourceIllegal; - break; - } - } else if ((flags == strictConversion) && (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END)) { - --source; /* return to the illegal value itself */ - result = sourceIllegal; - break; - } - /* Figure out how many bytes the result will require */ - if (ch < (UTF32)0x80) { bytesToWrite = 1; - } else if (ch < (UTF32)0x800) { bytesToWrite = 2; - } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; - } else if (ch < (UTF32)0x200000) { bytesToWrite = 4; - } else { bytesToWrite = 2; - ch = UNI_REPLACEMENT_CHAR; - } - // printf("bytes to write = %i\n", bytesToWrite); - target += bytesToWrite; - if (target > targetEnd) { - source = oldSource; /* Back up source pointer! */ - target -= bytesToWrite; result = targetExhausted; break; - } - switch (bytesToWrite) { /* note: everything falls through. */ - case 4: *--target = (ch | byteMark) & byteMask; ch >>= 6; - case 3: *--target = (ch | byteMark) & byteMask; ch >>= 6; - case 2: *--target = (ch | byteMark) & byteMask; ch >>= 6; - case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); - } - target += bytesToWrite; - } - *sourceStart = source; - *targetStart = target; - return result; -} - -/* --------------------------------------------------------------------- */ - -/* - * Utility routine to tell whether a sequence of bytes is legal UTF-8. - * This must be called with the length pre-determined by the first byte. - * If not calling this from ConvertUTF8to*, then the length can be set by: - * length = trailingBytesForUTF8[*source]+1; - * and the sequence is illegal right away if there aren't that many bytes - * available. - * If presented with a length > 4, this returns false. The Unicode - * definition of UTF-8 goes up to 4-byte sequences. - */ - -static Boolean isLegalUTF8(const UTF8 *source, int length) { - UTF8 a; - const UTF8 *srcptr = source+length; - switch (length) { - default: return false; - /* Everything else falls through when "true"... */ - case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; - case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; - case 2: if ((a = (*--srcptr)) > 0xBF) return false; - switch (*source) { - /* no fall-through in this inner switch */ - case 0xE0: if (a < 0xA0) return false; break; - case 0xF0: if (a < 0x90) return false; break; - case 0xF4: if (a > 0x8F) return false; break; - default: if (a < 0x80) return false; - } - case 1: if (*source >= 0x80 && *source < 0xC2) return false; - if (*source > 0xF4) return false; - } - return true; -} - -/* --------------------------------------------------------------------- */ - -/* - * Exported function to return whether a UTF-8 sequence is legal or not. - * This is not used here; it's just exported. - */ -Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { - int length = trailingBytesForUTF8[*source]+1; - if (source+length > sourceEnd) { - return false; - } - return isLegalUTF8(source, length); -} - -/* --------------------------------------------------------------------- */ - -ConversionResult ConvertUTF8toUTF16 ( - const UTF8** sourceStart, const UTF8* sourceEnd, - UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { - ConversionResult result = conversionOK; - const UTF8* source = *sourceStart; - UTF16* target = *targetStart; - while (source < sourceEnd) { - UTF32 ch = 0; - unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; - if (source + extraBytesToRead >= sourceEnd) { - result = sourceExhausted; break; - } - /* Do this check whether lenient or strict */ - if (! isLegalUTF8(source, extraBytesToRead+1)) { - result = sourceIllegal; - break; - } - /* - * The cases all fall through. See "Note A" below. - */ - switch (extraBytesToRead) { - case 3: ch += *source++; ch <<= 6; - case 2: ch += *source++; ch <<= 6; - case 1: ch += *source++; ch <<= 6; - case 0: ch += *source++; - } - ch -= offsetsFromUTF8[extraBytesToRead]; - - if (target >= targetEnd) { - source -= (extraBytesToRead+1); /* Back up source pointer! */ - result = targetExhausted; break; - } - if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ - if ((flags == strictConversion) && (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END)) { - source -= (extraBytesToRead+1); /* return to the illegal value itself */ - result = sourceIllegal; - break; - } else { - *target++ = (UTF16)ch; /* normal case */ - } - } else if (ch > UNI_MAX_UTF16) { - if (flags == strictConversion) { - result = sourceIllegal; - source -= (extraBytesToRead+1); /* return to the start */ - break; /* Bail out; shouldn't continue */ - } else { - *target++ = UNI_REPLACEMENT_CHAR; - } - } else { - /* target is a character in range 0xFFFF - 0x10FFFF. */ - if (target + 1 >= targetEnd) { - source -= (extraBytesToRead+1); /* Back up source pointer! */ - result = targetExhausted; break; - } - ch -= halfBase; - *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); - *target++ = (ch & halfMask) + UNI_SUR_LOW_START; - } - } - *sourceStart = source; - *targetStart = target; - return result; -} - -} - -/* --------------------------------------------------------------------- - - Note A. - The fall-through switches in UTF-8 reading code save a - temp variable, some decrements & conditionals. The switches - are equivalent to the following loop: - { - int tmpBytesToRead = extraBytesToRead+1; - do { - ch += *source++; - --tmpBytesToRead; - if (tmpBytesToRead) ch <<= 6; - } while (tmpBytesToRead > 0); - } - In UTF-8 writing code, the switches on "bytesToWrite" are - similarly unrolled loops. - - --------------------------------------------------------------------- */ - - diff --git a/src/taglib/taglib/toolkit/unicode.h b/src/taglib/taglib/toolkit/unicode.h deleted file mode 100644 index ebf1915..0000000 --- a/src/taglib/taglib/toolkit/unicode.h +++ /dev/null @@ -1,154 +0,0 @@ -#ifndef TAGLIB_UNICODE_H -#define TAGLIB_UNICODE_H - -/******************************************************************************* - * * - * THIS FILE IS INCLUDED IN TAGLIB, BUT IS NOT COPYRIGHTED BY THE TAGLIB * - * AUTHORS, NOT PART OF THE TAGLIB API AND COULD GO AWAY AT ANY POINT IN TIME. * - * AS SUCH IT SHOULD BE CONSIERED FOR INTERNAL USE ONLY. * - * * - *******************************************************************************/ - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -/* - * Copyright 2001 Unicode, Inc. - * - * Disclaimer - * - * This source code is provided as is by Unicode, Inc. No claims are - * made as to fitness for any particular purpose. No warranties of any - * kind are expressed or implied. The recipient agrees to determine - * applicability of information provided. If this file has been - * purchased on magnetic or optical media from Unicode, Inc., the - * sole remedy for any claim will be exchange of defective media - * within 90 days of receipt. - * - * Limitations on Rights to Redistribute This Code - * - * Unicode, Inc. hereby grants the right to freely use the information - * supplied in this file in the creation of products supporting the - * Unicode Standard, and to make copies of this file in any form - * for internal or external distribution as long as this notice - * remains attached. - */ - -/* - * This file has been modified by Scott Wheeler <wheeler@kde.org> to remove - * the UTF32 conversion functions and to place the appropriate functions - * in their own C++ namespace. - */ - -/* --------------------------------------------------------------------- - - Conversions between UTF32, UTF-16, and UTF-8. Header file. - - Several functions are included here, forming a complete set of - conversions between the three formats. UTF-7 is not included - here, but is handled in a separate source file. - - Each of these routines takes pointers to input buffers and output - buffers. The input buffers are const. - - Each routine converts the text between *sourceStart and sourceEnd, - putting the result into the buffer between *targetStart and - targetEnd. Note: the end pointers are *after* the last item: e.g. - *(sourceEnd - 1) is the last item. - - The return result indicates whether the conversion was successful, - and if not, whether the problem was in the source or target buffers. - (Only the first encountered problem is indicated.) - - After the conversion, *sourceStart and *targetStart are both - updated to point to the end of last text successfully converted in - the respective buffers. - - Input parameters: - sourceStart - pointer to a pointer to the source buffer. - The contents of this are modified on return so that - it points at the next thing to be converted. - targetStart - similarly, pointer to pointer to the target buffer. - sourceEnd, targetEnd - respectively pointers to the ends of the - two buffers, for overflow checking only. - - These conversion functions take a ConversionFlags argument. When this - flag is set to strict, both irregular sequences and isolated surrogates - will cause an error. When the flag is set to lenient, both irregular - sequences and isolated surrogates are converted. - - Whether the flag is strict or lenient, all illegal sequences will cause - an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>, - or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code - must check for illegal sequences. - - When the flag is set to lenient, characters over 0x10FFFF are converted - to the replacement character; otherwise (when the flag is set to strict) - they constitute an error. - - Output parameters: - The value "sourceIllegal" is returned from some routines if the input - sequence is malformed. When "sourceIllegal" is returned, the source - value will point to the illegal value that caused the problem. E.g., - in UTF-8 when a sequence is malformed, it points to the start of the - malformed sequence. - - Author: Mark E. Davis, 1994. - Rev History: Rick McGowan, fixes & updates May 2001. - Fixes & updates, Sept 2001. - ------------------------------------------------------------------------- */ - -/* --------------------------------------------------------------------- - The following 4 definitions are compiler-specific. - The C standard does not guarantee that wchar_t has at least - 16 bits, so wchar_t is no less portable than unsigned short! - All should be unsigned values to avoid sign extension during - bit mask & shift operations. ------------------------------------------------------------------------- */ - -// Workaround for when MSVC doesn't have wchar_t as a built-in type. -#if defined(_MSC_VER) && !defined(_WCHAR_T_DEFINED) -# include <wchar.h> -#endif - -/* Some fundamental constants */ -#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD -#define UNI_MAX_BMP (UTF32)0x0000FFFF -#define UNI_MAX_UTF16 (UTF32)0x0010FFFF -#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF - -namespace Unicode { - -typedef unsigned long UTF32; /* at least 32 bits */ -typedef wchar_t UTF16; /* TagLib assumes that wchar_t is sufficient for UTF-16. */ -typedef unsigned char UTF8; /* typically 8 bits */ -typedef unsigned char Boolean; /* 0 or 1 */ - -typedef enum { - conversionOK = 0, /* conversion successful */ - sourceExhausted = 1, /* partial character in source, but hit end */ - targetExhausted = 2, /* insuff. room in target for conversion */ - sourceIllegal = 3 /* source sequence is illegal/malformed */ -} ConversionResult; - -typedef enum { - strictConversion = 0, - lenientConversion -} ConversionFlags; - -ConversionResult ConvertUTF8toUTF16 ( - const UTF8** sourceStart, const UTF8* sourceEnd, - UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); - -ConversionResult ConvertUTF16toUTF8 ( - const UTF16** sourceStart, const UTF16* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); - -Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); - -} // namespace Unicode - -/* --------------------------------------------------------------------- */ - -#endif -#endif diff --git a/src/taglib/taglib/trueaudio/trueaudiofile.cpp b/src/taglib/taglib/trueaudio/trueaudiofile.cpp deleted file mode 100644 index f98d6ad..0000000 --- a/src/taglib/taglib/trueaudio/trueaudiofile.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include <tagunion.h> -#include <tstringlist.h> -#include <tpropertymap.h> - -#include "trueaudiofile.h" -#include "id3v1tag.h" -#include "id3v2tag.h" -#include "id3v2header.h" - -using namespace TagLib; - -namespace -{ - enum { TrueAudioID3v2Index = 0, TrueAudioID3v1Index = 1 }; -} - -class TrueAudio::File::FilePrivate -{ -public: - FilePrivate(const ID3v2::FrameFactory *frameFactory = ID3v2::FrameFactory::instance()) : - ID3v2FrameFactory(frameFactory), - ID3v2Location(-1), - ID3v2OriginalSize(0), - ID3v1Location(-1), - properties(0), - hasID3v1(false), - hasID3v2(false) {} - - ~FilePrivate() - { - delete properties; - } - - const ID3v2::FrameFactory *ID3v2FrameFactory; - long ID3v2Location; - uint ID3v2OriginalSize; - - long ID3v1Location; - - TagUnion tag; - - Properties *properties; - - // These indicate whether the file *on disk* has these tags, not if - // this data structure does. This is used in computing offsets. - - bool hasID3v1; - bool hasID3v2; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -TrueAudio::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -TrueAudio::File::File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle propertiesStyle) : - TagLib::File(file) -{ - d = new FilePrivate(frameFactory); - if(isOpen()) - read(readProperties, propertiesStyle); -} - -TrueAudio::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -TrueAudio::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle propertiesStyle) : - TagLib::File(stream) -{ - d = new FilePrivate(frameFactory); - if(isOpen()) - read(readProperties, propertiesStyle); -} - -TrueAudio::File::~File() -{ - delete d; -} - -TagLib::Tag *TrueAudio::File::tag() const -{ - return &d->tag; -} - -PropertyMap TrueAudio::File::properties() const -{ - // once Tag::properties() is virtual, this case distinction could actually be done - // within TagUnion. - if(d->hasID3v2) - return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, false)->properties(); - if(d->hasID3v1) - return d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, false)->properties(); - return PropertyMap(); -} - -void TrueAudio::File::removeUnsupportedProperties(const StringList &unsupported) -{ - if(d->hasID3v2) - d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, false)->removeUnsupportedProperties(unsupported); -} - -PropertyMap TrueAudio::File::setProperties(const PropertyMap &properties) -{ - if(d->hasID3v1) - d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, false)->setProperties(properties); - return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, true)->setProperties(properties); -} - -TrueAudio::Properties *TrueAudio::File::audioProperties() const -{ - return d->properties; -} - -void TrueAudio::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) -{ - d->ID3v2FrameFactory = factory; -} - -bool TrueAudio::File::save() -{ - if(readOnly()) { - debug("TrueAudio::File::save() -- File is read only."); - return false; - } - - // Update ID3v2 tag - - if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { - if(!d->hasID3v2) { - d->ID3v2Location = 0; - d->ID3v2OriginalSize = 0; - } - ByteVector data = ID3v2Tag()->render(); - insert(data, d->ID3v2Location, d->ID3v2OriginalSize); - d->ID3v1Location -= d->ID3v2OriginalSize - data.size(); - d->ID3v2OriginalSize = data.size(); - d->hasID3v2 = true; - } - else if(d->hasID3v2) { - removeBlock(d->ID3v2Location, d->ID3v2OriginalSize); - d->ID3v1Location -= d->ID3v2OriginalSize; - d->ID3v2Location = -1; - d->ID3v2OriginalSize = 0; - d->hasID3v2 = false; - } - - // Update ID3v1 tag - - if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { - if(!d->hasID3v1) { - seek(0, End); - d->ID3v1Location = tell(); - } - else - seek(d->ID3v1Location); - writeBlock(ID3v1Tag()->render()); - d->hasID3v1 = true; - } - else if(d->hasID3v1) { - removeBlock(d->ID3v1Location, 128); - d->ID3v1Location = -1; - d->hasID3v1 = false; - } - - return true; -} - -ID3v1::Tag *TrueAudio::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, create); -} - -ID3v2::Tag *TrueAudio::File::ID3v2Tag(bool create) -{ - return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, create); -} - -void TrueAudio::File::strip(int tags) -{ - if(tags & ID3v1) { - d->tag.set(TrueAudioID3v1Index, 0); - ID3v2Tag(true); - } - - if(tags & ID3v2) { - d->tag.set(TrueAudioID3v2Index, 0); - - if(!ID3v1Tag()) - ID3v2Tag(true); - } -} - -bool TrueAudio::File::hasID3v1Tag() const -{ - return d->hasID3v1; -} - -bool TrueAudio::File::hasID3v2Tag() const -{ - return d->hasID3v2; -} - - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void TrueAudio::File::read(bool readProperties, Properties::ReadStyle /* propertiesStyle */) -{ - // Look for an ID3v2 tag - - d->ID3v2Location = findID3v2(); - - if(d->ID3v2Location >= 0) { - - d->tag.set(TrueAudioID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); - - d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); - - if(ID3v2Tag()->header()->tagSize() <= 0) - d->tag.set(TrueAudioID3v2Index, 0); - else - d->hasID3v2 = true; - } - - // Look for an ID3v1 tag - - d->ID3v1Location = findID3v1(); - - if(d->ID3v1Location >= 0) { - d->tag.set(TrueAudioID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - d->hasID3v1 = true; - } - - if(!d->hasID3v1) - ID3v2Tag(true); - - // Look for TrueAudio metadata - - if(readProperties) { - if(d->ID3v2Location >= 0) { - seek(d->ID3v2Location + d->ID3v2OriginalSize); - d->properties = new Properties(readBlock(TrueAudio::HeaderSize), - length() - d->ID3v2OriginalSize); - } - else { - seek(0); - d->properties = new Properties(readBlock(TrueAudio::HeaderSize), - length()); - } - } -} - -long TrueAudio::File::findID3v1() -{ - if(!isValid()) - return -1; - - seek(-128, End); - long p = tell(); - - if(readBlock(3) == ID3v1::Tag::fileIdentifier()) - return p; - - return -1; -} - -long TrueAudio::File::findID3v2() -{ - if(!isValid()) - return -1; - - seek(0); - - if(readBlock(3) == ID3v2::Header::fileIdentifier()) - return 0; - - return -1; -} diff --git a/src/taglib/taglib/trueaudio/trueaudiofile.h b/src/taglib/taglib/trueaudio/trueaudiofile.h deleted file mode 100644 index dbaafcd..0000000 --- a/src/taglib/taglib/trueaudio/trueaudiofile.h +++ /dev/null @@ -1,252 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TRUEAUDIOFILE_H -#define TAGLIB_TRUEAUDIOFILE_H - -#include "tfile.h" -#include "trueaudioproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v2 { class Tag; class FrameFactory; } - namespace ID3v1 { class Tag; } - - //! An implementation of TrueAudio metadata - - /*! - * This is implementation of TrueAudio metadata. - * - * This supports ID3v1 and ID3v2 tags as well as reading stream - * properties from the file. - */ - - namespace TrueAudio { - - //! An implementation of TagLib::File with TrueAudio specific methods - - /*! - * This implements and provides an interface for TrueAudio files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to TrueAudio files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs a TrueAudio file from \a file. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a TrueAudio file from \a file. If \a readProperties is true - * the file's audio properties will also be read. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a TrueAudio file from \a stream. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs a TrueAudio file from \a stream. If \a readProperties is true - * the file's audio properties will also be read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - * - * \note In the current implementation, \a propertiesStyle is ignored. - */ - File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains both ID3v1 and v2 tags, only ID3v2 will be - * converted to the PropertyMap. - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Creates in ID3v2 tag if necessary. If an ID3v1 tag exists, it will - * be updated as well, within the limitations of ID3v1. - */ - PropertyMap setProperties(const PropertyMap &); - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Returns the TrueAudio::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Set the ID3v2::FrameFactory to something other than the default. - * - * \see ID3v2FrameFactory - */ - void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v2 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file - * on disk actually has an ID3v2 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v2Tag() - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an ID3v2 tag. - * - * \see ID3v2Tag() - */ - bool hasID3v2Tag() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findID3v1(); - long findID3v2(); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/trueaudio/trueaudioproperties.cpp b/src/taglib/taglib/trueaudio/trueaudioproperties.cpp deleted file mode 100644 index dedd74e..0000000 --- a/src/taglib/taglib/trueaudio/trueaudioproperties.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <bitset> - -#include "trueaudioproperties.h" -#include "trueaudiofile.h" - -using namespace TagLib; - -class TrueAudio::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(const ByteVector &d, long length, ReadStyle s) : - data(d), - streamLength(length), - style(s), - version(0), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - bitsPerSample(0), - sampleFrames(0) {} - - ByteVector data; - long streamLength; - ReadStyle style; - int version; - int length; - int bitrate; - int sampleRate; - int channels; - int bitsPerSample; - uint sampleFrames; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -TrueAudio::Properties::Properties(const ByteVector &data, long streamLength, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(data, streamLength, style); - read(); -} - -TrueAudio::Properties::~Properties() -{ - delete d; -} - -int TrueAudio::Properties::length() const -{ - return d->length; -} - -int TrueAudio::Properties::bitrate() const -{ - return d->bitrate; -} - -int TrueAudio::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int TrueAudio::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -int TrueAudio::Properties::channels() const -{ - return d->channels; -} - -TagLib::uint TrueAudio::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -int TrueAudio::Properties::ttaVersion() const -{ - return d->version; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void TrueAudio::Properties::read() -{ - if(!d->data.startsWith("TTA")) - return; - - int pos = 3; - - d->version = d->data[pos] - '0'; - pos += 1; - - // According to http://en.true-audio.com/TTA_Lossless_Audio_Codec_-_Format_Description - // TTA2 headers are in development, and have a different format - if(1 == d->version) { - // Skip the audio format - pos += 2; - - d->channels = d->data.toShort(pos, false); - pos += 2; - - d->bitsPerSample = d->data.toShort(pos, false); - pos += 2; - - d->sampleRate = d->data.toUInt(pos, false); - pos += 4; - - d->sampleFrames = d->data.toUInt(pos, false); - d->length = d->sampleRate > 0 ? d->sampleFrames / d->sampleRate : 0; - - d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0; - } -} diff --git a/src/taglib/taglib/trueaudio/trueaudioproperties.h b/src/taglib/taglib/trueaudio/trueaudioproperties.h deleted file mode 100644 index 126b678..0000000 --- a/src/taglib/taglib/trueaudio/trueaudioproperties.h +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TRUEAUDIOPROPERTIES_H -#define TAGLIB_TRUEAUDIOPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace TrueAudio { - - class File; - - static const uint HeaderSize = 18; - - //! An implementation of audio property reading for TrueAudio - - /*! - * This reads the data from an TrueAudio stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of TrueAudio::Properties with the data read from the - * ByteVector \a data. - */ - Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this TrueAudio::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns number of bits per sample. - */ - int bitsPerSample() const; - - /*! - * Returns the total number of sample frames - */ - uint sampleFrames() const; - - /*! - * Returns the major version number. - */ - int ttaVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/wavpack/wavpackfile.cpp b/src/taglib/taglib/wavpack/wavpackfile.cpp deleted file mode 100644 index 13b8c57..0000000 --- a/src/taglib/taglib/wavpack/wavpackfile.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include <tagunion.h> -#include <tpropertymap.h> - -#include "wavpackfile.h" -#include "id3v1tag.h" -#include "id3v2header.h" -#include "apetag.h" -#include "apefooter.h" - -using namespace TagLib; - -namespace -{ - enum { WavAPEIndex, WavID3v1Index }; -} - -class WavPack::File::FilePrivate -{ -public: - FilePrivate() : - APELocation(-1), - APESize(0), - ID3v1Location(-1), - properties(0), - hasAPE(false), - hasID3v1(false) {} - - ~FilePrivate() - { - delete properties; - } - - long APELocation; - uint APESize; - - long ID3v1Location; - - TagUnion tag; - - Properties *properties; - - // These indicate whether the file *on disk* has these tags, not if - // this data structure does. This is used in computing offsets. - - bool hasAPE; - bool hasID3v1; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -WavPack::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(file) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -WavPack::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : TagLib::File(stream) -{ - d = new FilePrivate; - if(isOpen()) - read(readProperties, propertiesStyle); -} - -WavPack::File::~File() -{ - delete d; -} - -TagLib::Tag *WavPack::File::tag() const -{ - return &d->tag; -} - -PropertyMap WavPack::File::properties() const -{ - if(d->hasAPE) - return d->tag.access<APE::Tag>(WavAPEIndex, false)->properties(); - if(d->hasID3v1) - return d->tag.access<ID3v1::Tag>(WavID3v1Index, false)->properties(); - return PropertyMap(); -} - - -void WavPack::File::removeUnsupportedProperties(const StringList &unsupported) -{ - if(d->hasAPE) - d->tag.access<APE::Tag>(WavAPEIndex, false)->removeUnsupportedProperties(unsupported); -} - - -PropertyMap WavPack::File::setProperties(const PropertyMap &properties) -{ - if(d->hasID3v1) - d->tag.access<ID3v1::Tag>(WavID3v1Index, false)->setProperties(properties); - return d->tag.access<APE::Tag>(WavAPEIndex, true)->setProperties(properties); -} - -WavPack::Properties *WavPack::File::audioProperties() const -{ - return d->properties; -} - -bool WavPack::File::save() -{ - if(readOnly()) { - debug("WavPack::File::save() -- File is read only."); - return false; - } - - // Update ID3v1 tag - - if(ID3v1Tag()) { - if(d->hasID3v1) { - seek(d->ID3v1Location); - writeBlock(ID3v1Tag()->render()); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - writeBlock(ID3v1Tag()->render()); - d->hasID3v1 = true; - } - } - else { - if(d->hasID3v1) { - removeBlock(d->ID3v1Location, 128); - d->hasID3v1 = false; - if(d->hasAPE) { - if(d->APELocation > d->ID3v1Location) - d->APELocation -= 128; - } - } - } - - // Update APE tag - - if(APETag()) { - if(d->hasAPE) - insert(APETag()->render(), d->APELocation, d->APESize); - else { - if(d->hasID3v1) { - insert(APETag()->render(), d->ID3v1Location, 0); - d->APESize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - d->APELocation = d->ID3v1Location; - d->ID3v1Location += d->APESize; - } - else { - seek(0, End); - d->APELocation = tell(); - writeBlock(APETag()->render()); - d->APESize = APETag()->footer()->completeTagSize(); - d->hasAPE = true; - } - } - } - else { - if(d->hasAPE) { - removeBlock(d->APELocation, d->APESize); - d->hasAPE = false; - if(d->hasID3v1) { - if(d->ID3v1Location > d->APELocation) { - d->ID3v1Location -= d->APESize; - } - } - } - } - - return true; -} - -ID3v1::Tag *WavPack::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(WavID3v1Index, create); -} - -APE::Tag *WavPack::File::APETag(bool create) -{ - return d->tag.access<APE::Tag>(WavAPEIndex, create); -} - -void WavPack::File::strip(int tags) -{ - if(tags & ID3v1) { - d->tag.set(WavID3v1Index, 0); - APETag(true); - } - - if(tags & APE) { - d->tag.set(WavAPEIndex, 0); - - if(!ID3v1Tag()) - APETag(true); - } -} - -bool WavPack::File::hasID3v1Tag() const -{ - return d->hasID3v1; -} - -bool WavPack::File::hasAPETag() const -{ - return d->hasAPE; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void WavPack::File::read(bool readProperties, Properties::ReadStyle /* propertiesStyle */) -{ - // Look for an ID3v1 tag - - d->ID3v1Location = findID3v1(); - - if(d->ID3v1Location >= 0) { - d->tag.set(WavID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - d->hasID3v1 = true; - } - - // Look for an APE tag - - d->APELocation = findAPE(); - - if(d->APELocation >= 0) { - d->tag.set(WavAPEIndex, new APE::Tag(this, d->APELocation)); - d->APESize = APETag()->footer()->completeTagSize(); - d->APELocation = d->APELocation + APETag()->footer()->size() - d->APESize; - d->hasAPE = true; - } - - if(!d->hasID3v1) - APETag(true); - - // Look for WavPack audio properties - - if(readProperties) { - seek(0); - d->properties = new Properties(this, length() - d->APESize); - } -} - -long WavPack::File::findAPE() -{ - if(!isValid()) - return -1; - - if(d->hasID3v1) - seek(-160, End); - else - seek(-32, End); - - long p = tell(); - - if(readBlock(8) == APE::Tag::fileIdentifier()) - return p; - - return -1; -} - -long WavPack::File::findID3v1() -{ - if(!isValid()) - return -1; - - seek(-128, End); - long p = tell(); - - if(readBlock(3) == ID3v1::Tag::fileIdentifier()) - return p; - - return -1; -} diff --git a/src/taglib/taglib/wavpack/wavpackfile.h b/src/taglib/taglib/wavpack/wavpackfile.h deleted file mode 100644 index c85c75f..0000000 --- a/src/taglib/taglib/wavpack/wavpackfile.h +++ /dev/null @@ -1,216 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_WVFILE_H -#define TAGLIB_WVFILE_H - -#include "tfile.h" -#include "taglib_export.h" -#include "wavpackproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of WavPack metadata - - /*! - * This is implementation of WavPack metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. - */ - - namespace WavPack { - - //! An implementation of TagLib::File with WavPack specific methods - - /*! - * This implements and provides an interface for WavPack files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to WavPack files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches APE tags. - APE = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Constructs a WavPack file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Constructs an WavPack file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * If the file contains both an APE and an ID3v1 tag, only APE - * will be converted to the PropertyMap. - */ - PropertyMap properties() const; - - void removeUnsupportedProperties(const StringList &properties); - - /*! - * Implements the unified property interface -- import function. - * Creates an APE tag if it does not exists and calls setProperties() on - * that. Any existing ID3v1 tag will be updated as well. - */ - PropertyMap setProperties(const PropertyMap&); - - /*! - * Returns the MPC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file - * on disk actually has an ID3v1 tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasID3v1Tag() - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this may return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist and returns a valid pointer. - * - * \note This may return a valid pointer regardless of whether or not the - * file on disk has an APE tag. Use hasAPETag() to check if the file - * on disk actually has an APE tag. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - * - * \see hasAPETag() - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - /*! - * Returns whether or not the file on disk actually has an ID3v1 tag. - * - * \see ID3v1Tag() - */ - bool hasID3v1Tag() const; - - /*! - * Returns whether or not the file on disk actually has an APE tag. - * - * \see APETag() - */ - bool hasAPETag() const; - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findID3v1(); - long findAPE(); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/wavpack/wavpackproperties.cpp b/src/taglib/taglib/wavpack/wavpackproperties.cpp deleted file mode 100644 index 085ddf8..0000000 --- a/src/taglib/taglib/wavpack/wavpackproperties.cpp +++ /dev/null @@ -1,203 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include "wavpackproperties.h" -#include "wavpackfile.h" - -using namespace TagLib; - -class WavPack::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate(const ByteVector &d, long length, ReadStyle s) : - data(d), - streamLength(length), - style(s), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - version(0), - bitsPerSample(0), - sampleFrames(0), - file(0) {} - - ByteVector data; - long streamLength; - ReadStyle style; - int length; - int bitrate; - int sampleRate; - int channels; - int version; - int bitsPerSample; - uint sampleFrames; - File *file; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -WavPack::Properties::Properties(const ByteVector &data, long streamLength, ReadStyle style) : AudioProperties(style) -{ - d = new PropertiesPrivate(data, streamLength, style); - read(); -} - -WavPack::Properties::Properties(File *file, long streamLength, ReadStyle style) : AudioProperties(style) -{ - ByteVector data = file->readBlock(32); - d = new PropertiesPrivate(data, streamLength, style); - d->file = file; - read(); -} - -WavPack::Properties::~Properties() -{ - delete d; -} - -int WavPack::Properties::length() const -{ - return d->length; -} - -int WavPack::Properties::bitrate() const -{ - return d->bitrate; -} - -int WavPack::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int WavPack::Properties::channels() const -{ - return d->channels; -} - -int WavPack::Properties::version() const -{ - return d->version; -} - -int WavPack::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -TagLib::uint WavPack::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -static const unsigned int sample_rates[] = { - 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000, - 32000, 44100, 48000, 64000, 88200, 96000, 192000, 0 }; - -#define BYTES_STORED 3 -#define MONO_FLAG 4 - -#define SHIFT_LSB 13 -#define SHIFT_MASK (0x1fL << SHIFT_LSB) - -#define SRATE_LSB 23 -#define SRATE_MASK (0xfL << SRATE_LSB) - -#define MIN_STREAM_VERS 0x402 -#define MAX_STREAM_VERS 0x410 - -#define FINAL_BLOCK 0x1000 - -void WavPack::Properties::read() -{ - if(!d->data.startsWith("wvpk")) - return; - - d->version = d->data.toShort(8, false); - if(d->version < MIN_STREAM_VERS || d->version > MAX_STREAM_VERS) - return; - - const unsigned int flags = d->data.toUInt(24, false); - d->bitsPerSample = ((flags & BYTES_STORED) + 1) * 8 - - ((flags & SHIFT_MASK) >> SHIFT_LSB); - d->sampleRate = sample_rates[(flags & SRATE_MASK) >> SRATE_LSB]; - d->channels = (flags & MONO_FLAG) ? 1 : 2; - - unsigned int samples = d->data.toUInt(12, false); - if(samples == ~0u) { - if(d->file && d->style != Fast) { - samples = seekFinalIndex(); - } - else { - samples = 0; - } - } - d->length = d->sampleRate > 0 ? (samples + (d->sampleRate / 2)) / d->sampleRate : 0; - d->sampleFrames = samples; - - d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0; -} - -unsigned int WavPack::Properties::seekFinalIndex() -{ - ByteVector blockID("wvpk", 4); - - long offset = d->streamLength; - while(offset > 0) { - offset = d->file->rfind(blockID, offset); - if(offset == -1) - return 0; - d->file->seek(offset); - ByteVector data = d->file->readBlock(32); - if(data.size() != 32) - return 0; - const int version = data.toShort(8, false); - if(version < MIN_STREAM_VERS || version > MAX_STREAM_VERS) - continue; - const unsigned int flags = data.toUInt(24, false); - if(!(flags & FINAL_BLOCK)) - return 0; - const unsigned int blockIndex = data.toUInt(16, false); - const unsigned int blockSamples = data.toUInt(20, false); - return blockIndex + blockSamples; - } - - return 0; -} - diff --git a/src/taglib/taglib/wavpack/wavpackproperties.h b/src/taglib/taglib/wavpack/wavpackproperties.h deleted file mode 100644 index c788fdd..0000000 --- a/src/taglib/taglib/wavpack/wavpackproperties.h +++ /dev/null @@ -1,110 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_WVPROPERTIES_H -#define TAGLIB_WVPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace WavPack { - - class File; - - static const uint HeaderSize = 32; - - //! An implementation of audio property reading for WavPack - - /*! - * This reads the data from an WavPack stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of WavPack::Properties with the data read from the - * ByteVector \a data. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); - - /*! - * Create an instance of WavPack::Properties. - */ - // BIC: merge with the above constructor - Properties(File *file, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this WavPack::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - - /*! - * Returns the sample rate in Hz. 0 means unknown or custom. - */ - virtual int sampleRate() const; - - virtual int channels() const; - - /*! - * Returns number of bits per sample. - */ - int bitsPerSample() const; - uint sampleFrames() const; - - /*! - * Returns WavPack version. - */ - int version() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - unsigned int seekFinalIndex(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/xm/xmfile.cpp b/src/taglib/taglib/xm/xmfile.cpp deleted file mode 100644 index d8373a7..0000000 --- a/src/taglib/taglib/xm/xmfile.cpp +++ /dev/null @@ -1,650 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "tstringlist.h" -#include "tdebug.h" -#include "xmfile.h" -#include "modfileprivate.h" -#include "tpropertymap.h" - -#include <string.h> -#include <algorithm> - -using namespace TagLib; -using namespace XM; -using TagLib::uint; -using TagLib::ushort; -using TagLib::ulong; - -/*! - * The Reader classes are helpers to make handling of the stripped XM - * format more easy. In the stripped XM format certain header sizes might - * be smaller than one would expect. The fields that are not included - * are then just some predefined valued (e.g. 0). - * - * Using these classes this code: - * - * if(headerSize >= 4) { - * if(!readU16L(value1)) ERROR(); - * if(headerSize >= 8) { - * if(!readU16L(value2)) ERROR(); - * if(headerSize >= 12) { - * if(!readString(value3, 22)) ERROR(); - * ... - * } - * } - * } - * - * Becomes: - * - * StructReader header; - * header.u16L(value1).u16L(value2).string(value3, 22). ...; - * if(header.read(*this, headerSize) < std::min(header.size(), headerSize)) - * ERROR(); - * - * Maybe if this is useful to other formats these classes can be moved to - * their own public files. - */ -class Reader -{ -public: - virtual ~Reader() - { - } - - /*! - * Reads associated values from \a file, but never reads more - * then \a limit bytes. - */ - virtual uint read(TagLib::File &file, uint limit) = 0; - - /*! - * Returns the number of bytes this reader would like to read. - */ - virtual uint size() const = 0; -}; - -class SkipReader : public Reader -{ -public: - SkipReader(uint size) : m_size(size) - { - } - - uint read(TagLib::File &file, uint limit) - { - uint count = std::min(m_size, limit); - file.seek(count, TagLib::File::Current); - return count; - } - - uint size() const - { - return m_size; - } - -private: - uint m_size; -}; - -template<typename T> -class ValueReader : public Reader -{ -public: - ValueReader(T &value) : value(value) - { - } - -protected: - T &value; -}; - -class StringReader : public ValueReader<String> -{ -public: - StringReader(String &string, uint size) : - ValueReader<String>(string), m_size(size) - { - } - - uint read(TagLib::File &file, uint limit) - { - ByteVector data = file.readBlock(std::min(m_size, limit)); - uint count = data.size(); - int index = data.find((char) 0); - if(index > -1) { - data.resize(index); - } - data.replace((char) 0xff, ' '); - value = data; - return count; - } - - uint size() const - { - return m_size; - } - -private: - uint m_size; -}; - -class ByteReader : public ValueReader<uchar> -{ -public: - ByteReader(uchar &byte) : ValueReader<uchar>(byte) {} - - uint read(TagLib::File &file, uint limit) - { - ByteVector data = file.readBlock(std::min(1U,limit)); - if(data.size() > 0) { - value = data[0]; - } - return data.size(); - } - - uint size() const - { - return 1; - } -}; - -template<typename T> -class NumberReader : public ValueReader<T> -{ -public: - NumberReader(T &value, bool bigEndian) : - ValueReader<T>(value), bigEndian(bigEndian) - { - } - -protected: - bool bigEndian; -}; - -class U16Reader : public NumberReader<ushort> -{ -public: - U16Reader(ushort &value, bool bigEndian) - : NumberReader<ushort>(value, bigEndian) {} - - uint read(TagLib::File &file, uint limit) - { - ByteVector data = file.readBlock(std::min(2U,limit)); - value = data.toUShort(bigEndian); - return data.size(); - } - - uint size() const - { - return 2; - } -}; - -class U32Reader : public NumberReader<ulong> -{ -public: - U32Reader(ulong &value, bool bigEndian = true) : - NumberReader<ulong>(value, bigEndian) - { - } - - uint read(TagLib::File &file, uint limit) - { - ByteVector data = file.readBlock(std::min(4U,limit)); - value = data.toUInt(bigEndian); - return data.size(); - } - - uint size() const - { - return 4; - } -}; - -class StructReader : public Reader -{ -public: - StructReader() - { - m_readers.setAutoDelete(true); - } - - /*! - * Add a nested reader. This reader takes ownership. - */ - StructReader &reader(Reader *reader) - { - m_readers.append(reader); - return *this; - } - - /*! - * Don't read anything but skip \a size bytes. - */ - StructReader &skip(uint size) - { - m_readers.append(new SkipReader(size)); - return *this; - } - - /*! - * Read a string of \a size characters (bytes) into \a string. - */ - StructReader &string(String &string, uint size) - { - m_readers.append(new StringReader(string, size)); - return *this; - } - - /*! - * Read a byte into \a byte. - */ - StructReader &byte(uchar &byte) - { - m_readers.append(new ByteReader(byte)); - return *this; - } - - /*! - * Read a unsigned 16 Bit integer into \a number. The byte order - * is controlled by \a bigEndian. - */ - StructReader &u16(ushort &number, bool bigEndian) - { - m_readers.append(new U16Reader(number, bigEndian)); - return *this; - } - - /*! - * Read a unsigned 16 Bit little endian integer into \a number. - */ - StructReader &u16L(ushort &number) - { - return u16(number, false); - } - - /*! - * Read a unsigned 16 Bit big endian integer into \a number. - */ - StructReader &u16B(ushort &number) - { - return u16(number, true); - } - - /*! - * Read a unsigned 32 Bit integer into \a number. The byte order - * is controlled by \a bigEndian. - */ - StructReader &u32(ulong &number, bool bigEndian) - { - m_readers.append(new U32Reader(number, bigEndian)); - return *this; - } - - /*! - * Read a unsigned 32 Bit little endian integer into \a number. - */ - StructReader &u32L(ulong &number) - { - return u32(number, false); - } - - /*! - * Read a unsigned 32 Bit big endian integer into \a number. - */ - StructReader &u32B(ulong &number) - { - return u32(number, true); - } - - uint size() const - { - uint size = 0; - for(List<Reader*>::ConstIterator i = m_readers.begin(); - i != m_readers.end(); ++ i) { - size += (*i)->size(); - } - return size; - } - - uint read(TagLib::File &file, uint limit) - { - uint sumcount = 0; - for(List<Reader*>::Iterator i = m_readers.begin(); - limit > 0 && i != m_readers.end(); ++ i) { - uint count = (*i)->read(file, limit); - limit -= count; - sumcount += count; - } - return sumcount; - } - -private: - List<Reader*> m_readers; -}; - -class XM::File::FilePrivate -{ -public: - FilePrivate(AudioProperties::ReadStyle propertiesStyle) - : tag(), properties(propertiesStyle) - { - } - - Mod::Tag tag; - XM::Properties properties; -}; - -XM::File::File(FileName file, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(file), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -XM::File::File(IOStream *stream, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(stream), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -XM::File::~File() -{ - delete d; -} - -Mod::Tag *XM::File::tag() const -{ - return &d->tag; -} - -PropertyMap XM::File::properties() const -{ - return d->tag.properties(); -} - -PropertyMap XM::File::setProperties(const PropertyMap &properties) -{ - return d->tag.setProperties(properties); -} - -XM::Properties *XM::File::audioProperties() const -{ - return &d->properties; -} - -bool XM::File::save() -{ - if(readOnly()) { - debug("XM::File::save() - Cannot save to a read only file."); - return false; - } - seek(17); - writeString(d->tag.title(), 20); - seek(1, Current); - writeString(d->tag.trackerName(), 20); - seek(2, Current); - ulong headerSize = 0; - if(!readU32L(headerSize)) - return false; - seek(2+2+2, Current); - - ushort patternCount = 0; - ushort instrumentCount = 0; - if(!readU16L(patternCount) || !readU16L(instrumentCount)) - return false; - - seek(60 + headerSize); - - // need to read patterns again in order to seek to the instruments: - for(ushort i = 0; i < patternCount; ++ i) { - ulong patternHeaderLength = 0; - if(!readU32L(patternHeaderLength) || patternHeaderLength < 4) - return false; - - ushort dataSize = 0; - StructReader pattern; - pattern.skip(3).u16L(dataSize); - - uint count = pattern.read(*this, patternHeaderLength - 4U); - if(count != std::min(patternHeaderLength - 4U, (ulong)pattern.size())) - return false; - - seek(patternHeaderLength - (4 + count) + dataSize, Current); - } - - StringList lines = d->tag.comment().split("\n"); - uint sampleNameIndex = instrumentCount; - for(ushort i = 0; i < instrumentCount; ++ i) { - ulong instrumentHeaderSize = 0; - if(!readU32L(instrumentHeaderSize) || instrumentHeaderSize < 4) - return false; - - uint len = std::min(22UL, instrumentHeaderSize - 4U); - if(i >= lines.size()) - writeString(String::null, len); - else - writeString(lines[i], len); - - long offset = 0; - if(instrumentHeaderSize >= 29U) { - ushort sampleCount = 0; - seek(1, Current); - if(!readU16L(sampleCount)) - return false; - - if(sampleCount > 0) { - ulong sampleHeaderSize = 0; - if(instrumentHeaderSize < 33U || !readU32L(sampleHeaderSize)) - return false; - // skip unhandeled header proportion: - seek(instrumentHeaderSize - 33, Current); - - for(ushort j = 0; j < sampleCount; ++ j) { - if(sampleHeaderSize > 4U) { - ulong sampleLength = 0; - if(!readU32L(sampleLength)) - return false; - offset += sampleLength; - - seek(std::min(sampleHeaderSize, 14UL), Current); - if(sampleHeaderSize > 18U) { - uint len = std::min(sampleHeaderSize - 18U, 22UL); - if(sampleNameIndex >= lines.size()) - writeString(String::null, len); - else - writeString(lines[sampleNameIndex ++], len); - seek(sampleHeaderSize - (18U + len), Current); - } - } - else { - seek(sampleHeaderSize, Current); - } - } - } - else { - offset = instrumentHeaderSize - 29; - } - } - else { - offset = instrumentHeaderSize - (4 + len); - } - seek(offset, Current); - } - - return true; -} - -void XM::File::read(bool) -{ - if(!isOpen()) - return; - - seek(0); - ByteVector magic = readBlock(17); - // it's all 0x00 for stripped XM files: - READ_ASSERT(magic == "Extended Module: " || magic == ByteVector(17, 0)); - - READ_STRING(d->tag.setTitle, 20); - READ_BYTE_AS(escape); - // in stripped XM files this is 0x00: - READ_ASSERT(escape == 0x1A || escape == 0x00); - - READ_STRING(d->tag.setTrackerName, 20); - READ_U16L(d->properties.setVersion); - - READ_U32L_AS(headerSize); - READ_ASSERT(headerSize >= 4); - - ushort length = 0; - ushort restartPosition = 0; - ushort channels = 0; - ushort patternCount = 0; - ushort instrumentCount = 0; - ushort flags = 0; - ushort tempo = 0; - ushort bpmSpeed = 0; - - StructReader header; - header.u16L(length) - .u16L(restartPosition) - .u16L(channels) - .u16L(patternCount) - .u16L(instrumentCount) - .u16L(flags) - .u16L(tempo) - .u16L(bpmSpeed); - - uint count = header.read(*this, headerSize - 4U); - uint size = std::min(headerSize - 4U, (ulong)header.size()); - - READ_ASSERT(count == size); - - d->properties.setLengthInPatterns(length); - d->properties.setRestartPosition(restartPosition); - d->properties.setChannels(channels); - d->properties.setPatternCount(patternCount); - d->properties.setInstrumentCount(instrumentCount); - d->properties.setFlags(flags); - d->properties.setTempo(tempo); - d->properties.setBpmSpeed(bpmSpeed); - - seek(60 + headerSize); - - // read patterns: - for(ushort i = 0; i < patternCount; ++ i) { - READ_U32L_AS(patternHeaderLength); - READ_ASSERT(patternHeaderLength >= 4); - - uchar packingType = 0; - ushort rowCount = 0; - ushort dataSize = 0; - StructReader pattern; - pattern.byte(packingType).u16L(rowCount).u16L(dataSize); - - uint count = pattern.read(*this, patternHeaderLength - 4U); - READ_ASSERT(count == std::min(patternHeaderLength - 4U, (ulong)pattern.size())); - - seek(patternHeaderLength - (4 + count) + dataSize, Current); - } - - StringList intrumentNames; - StringList sampleNames; - uint sumSampleCount = 0; - - // read instruments: - for(ushort i = 0; i < instrumentCount; ++ i) { - READ_U32L_AS(instrumentHeaderSize); - READ_ASSERT(instrumentHeaderSize >= 4); - - String instrumentName; - uchar instrumentType = 0; - ushort sampleCount = 0; - - StructReader instrument; - instrument.string(instrumentName, 22).byte(instrumentType).u16L(sampleCount); - - // 4 for instrumentHeaderSize - uint count = 4 + instrument.read(*this, instrumentHeaderSize - 4U); - READ_ASSERT(count == std::min(instrumentHeaderSize, (ulong)instrument.size() + 4)); - - ulong sampleHeaderSize = 0; - long offset = 0; - if(sampleCount > 0) { - sumSampleCount += sampleCount; - // wouldn't know which header size to assume otherwise: - READ_ASSERT(instrumentHeaderSize >= count + 4 && readU32L(sampleHeaderSize)); - // skip unhandeled header proportion: - seek(instrumentHeaderSize - count - 4, Current); - - for(ushort j = 0; j < sampleCount; ++ j) { - ulong sampleLength = 0; - ulong loopStart = 0; - ulong loopLength = 0; - uchar volume = 0; - uchar finetune = 0; - uchar sampleType = 0; - uchar panning = 0; - uchar noteNumber = 0; - uchar compression = 0; - String sampleName; - StructReader sample; - sample.u32L(sampleLength) - .u32L(loopStart) - .u32L(loopLength) - .byte(volume) - .byte(finetune) - .byte(sampleType) - .byte(panning) - .byte(noteNumber) - .byte(compression) - .string(sampleName, 22); - - uint count = sample.read(*this, sampleHeaderSize); - READ_ASSERT(count == std::min(sampleHeaderSize, (ulong)sample.size())); - // skip unhandeled header proportion: - seek(sampleHeaderSize - count, Current); - - offset += sampleLength; - sampleNames.append(sampleName); - } - } - else { - offset = instrumentHeaderSize - count; - } - intrumentNames.append(instrumentName); - seek(offset, Current); - } - - d->properties.setSampleCount(sumSampleCount); - String comment(intrumentNames.toString("\n")); - if(sampleNames.size() > 0) { - comment += "\n"; - comment += sampleNames.toString("\n"); - } - d->tag.setComment(comment); -} diff --git a/src/taglib/taglib/xm/xmfile.h b/src/taglib/taglib/xm/xmfile.h deleted file mode 100644 index ae48a51..0000000 --- a/src/taglib/taglib/xm/xmfile.h +++ /dev/null @@ -1,108 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_XMFILE_H -#define TAGLIB_XMFILE_H - -#include "tfile.h" -#include "audioproperties.h" -#include "taglib_export.h" -#include "modfilebase.h" -#include "modtag.h" -#include "xmproperties.h" - -namespace TagLib { - - namespace XM { - - class TAGLIB_EXPORT File : public Mod::FileBase { - public: - /*! - * Constructs an Extended Module file from \a file. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - */ - File(FileName file, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Constructs an Extended Module file from \a stream. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. The audio properties are always - * read. - * - * \note TagLib will *not* take ownership of the stream, the caller is - * responsible for deleting it after the File object. - */ - File(IOStream *stream, bool readProperties = true, - AudioProperties::ReadStyle propertiesStyle = - AudioProperties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - Mod::Tag *tag() const; - - /*! - * Implements the unified property interface -- export function. - * Forwards to Mod::Tag::properties(). - */ - PropertyMap properties() const; - - /*! - * Implements the unified property interface -- import function. - * Forwards to Mod::Tag::setProperties(). - */ - PropertyMap setProperties(const PropertyMap &); - - /*! - * Returns the XM::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - XM::Properties *audioProperties() const; - - /*! - * Save the file. - * This is the same as calling save(AllTags); - * - * \note Saving Extended Module tags is not supported. - */ - bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/taglib/xm/xmproperties.cpp b/src/taglib/taglib/xm/xmproperties.cpp deleted file mode 100644 index 45da02b..0000000 --- a/src/taglib/taglib/xm/xmproperties.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/*************************************************************************** - copyright :(C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include "xmproperties.h" - -using namespace TagLib; -using namespace XM; - -class XM::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - lengthInPatterns(0), - channels(0), - version(0), - restartPosition(0), - patternCount(0), - instrumentCount(0), - sampleCount(0), - flags(0), - tempo(0), - bpmSpeed(0) - { - } - - ushort lengthInPatterns; - int channels; - ushort version; - ushort restartPosition; - ushort patternCount; - ushort instrumentCount; - uint sampleCount; - ushort flags; - ushort tempo; - ushort bpmSpeed; -}; - -XM::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : - AudioProperties(propertiesStyle), - d(new PropertiesPrivate) -{ -} - -XM::Properties::~Properties() -{ - delete d; -} - -int XM::Properties::length() const -{ - return 0; -} - -int XM::Properties::bitrate() const -{ - return 0; -} - -int XM::Properties::sampleRate() const -{ - return 0; -} - -int XM::Properties::channels() const -{ - return d->channels; -} - -TagLib::ushort XM::Properties::lengthInPatterns() const -{ - return d->lengthInPatterns; -} - -TagLib::ushort XM::Properties::version() const -{ - return d->version; -} - -TagLib::ushort XM::Properties::restartPosition() const -{ - return d->restartPosition; -} - -TagLib::ushort XM::Properties::patternCount() const -{ - return d->patternCount; -} - -TagLib::ushort XM::Properties::instrumentCount() const -{ - return d->instrumentCount; -} - -TagLib::uint XM::Properties::sampleCount() const -{ - return d->sampleCount; -} - -TagLib::ushort XM::Properties::flags() const -{ - return d->flags; -} - -TagLib::ushort XM::Properties::tempo() const -{ - return d->tempo; -} - -TagLib::ushort XM::Properties::bpmSpeed() const -{ - return d->bpmSpeed; -} - -void XM::Properties::setLengthInPatterns(ushort lengthInPatterns) -{ - d->lengthInPatterns = lengthInPatterns; -} - -void XM::Properties::setChannels(int channels) -{ - d->channels = channels; -} - -void XM::Properties::setVersion(ushort version) -{ - d->version = version; -} - -void XM::Properties::setRestartPosition(ushort restartPosition) -{ - d->restartPosition = restartPosition; -} - -void XM::Properties::setPatternCount(ushort patternCount) -{ - d->patternCount = patternCount; -} - -void XM::Properties::setInstrumentCount(ushort instrumentCount) -{ - d->instrumentCount = instrumentCount; -} - -void XM::Properties::setSampleCount(uint sampleCount) -{ - d->sampleCount = sampleCount; -} - -void XM::Properties::setFlags(ushort flags) -{ - d->flags = flags; -} - -void XM::Properties::setTempo(ushort tempo) -{ - d->tempo = tempo; -} - -void XM::Properties::setBpmSpeed(ushort bpmSpeed) -{ - d->bpmSpeed = bpmSpeed; -} diff --git a/src/taglib/taglib/xm/xmproperties.h b/src/taglib/taglib/xm/xmproperties.h deleted file mode 100644 index 9b6624a..0000000 --- a/src/taglib/taglib/xm/xmproperties.h +++ /dev/null @@ -1,79 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_XMPROPERTIES_H -#define TAGLIB_XMPROPERTIES_H - -#include "taglib.h" -#include "tstring.h" -#include "audioproperties.h" - -namespace TagLib { - namespace XM { - class Properties : public AudioProperties { - friend class File; - public: - /*! Flag bits. */ - enum { - LinearFreqTable = 1 // otherwise its the amiga freq. table - }; - - Properties(AudioProperties::ReadStyle propertiesStyle); - virtual ~Properties(); - - int length() const; - int bitrate() const; - int sampleRate() const; - int channels() const; - - ushort lengthInPatterns() const; - ushort version() const; - ushort restartPosition() const; - ushort patternCount() const; - ushort instrumentCount() const; - uint sampleCount() const; - ushort flags() const; - ushort tempo() const; - ushort bpmSpeed() const; - - void setChannels(int channels); - - void setLengthInPatterns(ushort lengthInPatterns); - void setVersion(ushort version); - void setRestartPosition(ushort restartPosition); - void setPatternCount(ushort patternCount); - void setInstrumentCount(ushort instrumentCount); - void setSampleCount(uint sampleCount); - void setFlags(ushort flags); - void setTempo(ushort tempo); - void setBpmSpeed(ushort bpmSpeed); - - private: - Properties(const Properties&); - Properties &operator=(const Properties&); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/taglib/tests/CMakeLists.txt b/src/taglib/tests/CMakeLists.txt deleted file mode 100644 index 7a3d0bd..0000000 --- a/src/taglib/tests/CMakeLists.txt +++ /dev/null @@ -1,76 +0,0 @@ -INCLUDE_DIRECTORIES( - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/toolkit - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ape - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/asf - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v1 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2/frames - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpc - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mp4 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff/aiff - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff/wav - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/trueaudio - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/vorbis - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/flac - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/speex - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/opus - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/flac - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/wavpack - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mod - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/s3m - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/it - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/xm -) - -SET(test_runner_SRCS - main.cpp - test_list.cpp - test_map.cpp - test_mpeg.cpp - test_synchdata.cpp - test_trueaudio.cpp - test_bytevector.cpp - test_bytevectorlist.cpp - test_bytevectorstream.cpp - test_string.cpp - test_propertymap.cpp - test_fileref.cpp - test_id3v1.cpp - test_id3v2.cpp - test_xiphcomment.cpp - test_aiff.cpp - test_riff.cpp - test_ogg.cpp - test_oggflac.cpp - test_flac.cpp - test_flacpicture.cpp - test_flacunknownmetadatablock.cpp - test_ape.cpp - test_apetag.cpp - test_wav.cpp - test_info.cpp - test_wavpack.cpp - test_mp4.cpp - test_mp4item.cpp - test_mp4coverart.cpp - test_asf.cpp - test_mod.cpp - test_s3m.cpp - test_it.cpp - test_xm.cpp - test_mpc.cpp - test_opus.cpp -) - -INCLUDE_DIRECTORIES(${CPPUNIT_INCLUDE_DIR}) - -ADD_EXECUTABLE(test_runner ${test_runner_SRCS}) -TARGET_LINK_LIBRARIES(test_runner tag ${CPPUNIT_LIBRARIES}) - -ADD_TEST(test_runner test_runner) -ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND} -V - DEPENDS test_runner) diff --git a/src/taglib/tests/data/005411.id3 b/src/taglib/tests/data/005411.id3 deleted file mode 100644 index ab2e0997a0bcbf27aa169a09fd3f730d8319de9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38402 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 AdjJ3c diff --git a/src/taglib/tests/data/64bit.mp4 b/src/taglib/tests/data/64bit.mp4 deleted file mode 100644 index 0bd7f9f33dfa28317996eab962cce5cb2d2afc0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85 zcmZQzU|`J6&o5(u0AC=*SejCj2<6*?__?WYzAjW;F*B#Q1jv?5F38LQ(t;_8U^Sv3 Gc}4)(BMUG9 diff --git a/src/taglib/tests/data/broken-tenc.id3 b/src/taglib/tests/data/broken-tenc.id3 deleted file mode 100644 index 809040506f29b83c48e055251e164c807d3b2997..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmcJL!Ab)$5QhKNDhg73gj{+po36XAH`8gLrDn4%1ManlMT@WqrFWmnC-A*I)X6sX z4f=<ld^3LtldKlm2%?KI+lmAdmEg5)+t5P-F!?&PWwEbqMDorFzKgs5ZOi+<@{NN^ zgR+7m*y0Ft(*KYJ&}Cus2xN!o!H^jsH|1=Iw0=xaAal4d$E8?<S3DEA6Z7VyQ@&TO z1J_nd=UQykasxIm^H}SrG6y%bmO5UsXu@;D;bTa?6220b=?;hA?`PoV9_ugJfZNaT Q2S}!pD`4^ij1FheA4Fn><NyEw diff --git a/src/taglib/tests/data/changed.mod b/src/taglib/tests/data/changed.mod deleted file mode 100644 index 13dcea8bc98054152611f31515822de7c1254add..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3132 zcmYe!NX$!5O;ISxEXhe_fPj#U%wmO{%)C^E^30qZg``x4lA_W)pqv8`Ga_Vxs`9h- zAbMc3a2`6t0Vu$TE(qt3%EE&J$QTWc(a=B+0c18fZ7|j&3k?L@!r8-bAnYBrb2J1- TLtr!nMnhmU1V%$(U_$@^D@Pm& diff --git a/src/taglib/tests/data/changed.s3m b/src/taglib/tests/data/changed.s3m deleted file mode 100644 index 37bd49cdd47c365f265f3f56bf53f0cac67be090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmYe!NX$!5O;ISxEXhe_Km}3)3=B*RtPG4mVFh6(hG6F)UkA2Y1A#wC>NprVnYfs_ zS$J4^+4$J`|6>4720jL11_=gPBu%)O4Gp+tK;jNSyjlTBAc2sK%wh!~O3YKp%quP_ zD$PyJD^bWx%uQ89QiYxA02D?y&o@7%G$&OdEfYlK7v(0F6l2$nMHHKPiAkl!spw84 o(nzf46)WVH=9FaSWagzRB<JUXyj!e?#W7ffu$iZe8-Ps!07j!oy8r+H diff --git a/src/taglib/tests/data/changed.xm b/src/taglib/tests/data/changed.xm deleted file mode 100644 index bb5db3ddd45e3a5bda8b016e0ae867179f26b4fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5471 zcmeH}%WA_g5JktP^s&z>5YV!#en6q%O&5V?)%?IDR#Jf_6-$P0O7rLKjODm-Uu07V zcm`V!&sd<ty|V9LqIRV&)xwuerEk^x3Eh_F(Zotais=%!4`$WPy6!BSWB_!*CAB-c z&*61gGQ!yv@3{cTcM_u}a6!(PyAbQfY8RD5t3&699Im_3|8@l^mg3Q&s9qgio#(Cl zX`3AHZ>j&QEr5;*ctrbL=>d>0FQq!HwF=(qXg<jSFjmgsstI&T;hrfik&PNFR>6O# z!noGnvIK)N?hy32Rk(+8bBJUxE?Tt?9`%zMjcohDR2xHL-uT*L3~4b=-u)Pq;N-6% oNkStK1VVC%C_$7UN=O7m38Dm1LQg>KAa>}*ApZ$shZD8K2XpUN-T(jq diff --git a/src/taglib/tests/data/click.mpc b/src/taglib/tests/data/click.mpc deleted file mode 100644 index a41f14e9ea2175684ff2ab74d3682ddbd0785765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 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 diff --git a/src/taglib/tests/data/click.wv b/src/taglib/tests/data/click.wv deleted file mode 100644 index f8bd1a8513ca97bae632a2a144fa90c9582bcd48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3176 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 Gx%FRQMM#za diff --git a/src/taglib/tests/data/compressed_id3_frame.mp3 b/src/taglib/tests/data/compressed_id3_frame.mp3 deleted file mode 100644 index 60bc895633b1ce32894e54800f6aa65d4e2cb546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5000 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 D0Kmmp diff --git a/src/taglib/tests/data/correctness_gain_silent_output.opus b/src/taglib/tests/data/correctness_gain_silent_output.opus deleted file mode 100644 index 00972c42f64f285610c17ab548ac0bfa6960bdff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35506 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 diff --git a/src/taglib/tests/data/covr-junk.m4a b/src/taglib/tests/data/covr-junk.m4a deleted file mode 100644 index ac80cb29d2585e9d728a86b5027973690f51d174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5108 zcmeHK-)qxw5Wgf{e{Jnj?c7gBwr+EX>$Gmjbg*@+oe|w+6ciC=)}*ekX-1O`6_MhT zBErBui7@d&7>dvOAXFF#J}Wo};-i0nuM+Rl)U8DXVW1EBw8`D~^8Mc3_ru*cEdaD+ zj2lbp(ohT#B(u7v0@S@$Wy$#B0?1|OGm?}Rjz(ic02A;~aK&J%3&d5n6(U7PaY%3~ z!RZ303;u^L00>4@O<TdUJg2TK$aJWezMtB9dsY;InOlXr=Ka6`eRohbKy%G_d}rqG zG!~65SxwgIAzv&OJuqXMjiw3UGK_+>h~~@2qLmBtE0;<X%4Zj>&^7V@oR5oF<*bA* z1XZrtFT6+qd%I-2?^=*^g-R%0Th3Q>TXOHzY(9enURTSG><2w^+1?=+6naje6dRTc zIiaj`_jO}Fhx%3B&@Ix-cDR6VR7#Gpvn>{QGGKayV~SoTk3;gh(cnTE9&Z9@!yw-P z>gVgw!tUeUC>Y{f&<(@l8+975<02Fkf-T{-hH2a+gN-LB(HZ!h%i-W3)j&ViWEx`= zsAj1h4%?E7x5L)4w$mEw1hNY_^$h?g;_xGl)77<)eyrNZ9w7K4%d#P%Y*!VM7OHw5 z&x?Yzv_$P%0lSvX=?0FT4j@o=sETAA5NS<~(qtu?O)cjYYPxV<QWaWBmg$+<bEsa! zAIlUBlfev+*w}Lg13XJ>D|C#_*%5;j@!t9Aser%Dk7__XotQ;Q6tiBs|M>8T(mo(2 z;;HM8)3?^&mk^tDD*=Rj%*E$-w=KrSQ`3o;6IbqFm_gfp09S(f$@~iZnWUHmhG9U) z518992|l;S>v8+MUa#Nps}D9e1_Oa$N4P1}+}#<8bae_s@1fy=-h;7zL5PkG#*UAS zj*j*WOeEtclEWuQN5~1|_xpnl!S=?+_K`lJZ{)9GmLTNC{jwa>4Qz<vLX5cyO_(a> zz6%~ShxuA7&}7<H6<ltb9ICP6wm(Ay$6y#P1Y_`^_^Q?1!i9XLCTu5>jreQ|_4eI$ yky3O+h!>2kRcc)uhDNNn?w*p2$0zN7TJB4kf}&tz4jcv?1{?+)1{?<VfPtT=7Y1Aa diff --git a/src/taglib/tests/data/empty.aiff b/src/taglib/tests/data/empty.aiff deleted file mode 100644 index 849b762da5a8d2b1a366ea8f9d3daa87be7a194c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5936 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 diff --git a/src/taglib/tests/data/empty.ogg b/src/taglib/tests/data/empty.ogg deleted file mode 100644 index aa533104d6fde177772775137cb7660a3be11418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4328 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 diff --git a/src/taglib/tests/data/empty.spx b/src/taglib/tests/data/empty.spx deleted file mode 100644 index 70572b4587f26b1dfa1b93035b65a90f47ffe511..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24301 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 diff --git a/src/taglib/tests/data/empty.tta b/src/taglib/tests/data/empty.tta deleted file mode 100644 index 9cc00ba8156b8ef1b16401b0efe65b6d64a1b1de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79538 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 diff --git a/src/taglib/tests/data/empty.wav b/src/taglib/tests/data/empty.wav deleted file mode 100644 index 74b5a6de7b02e17ed293c677b873f446f77d84d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14744 zcmeIup$&sj07cOU#g`Gf2C@Q@S_J5yG^o}w2qQ2aW56DqtFJoaXBf6Fncq{t{MT2T zq)MIRk?hZ;Nt<t3%kO$bfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ gfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5V*6z34A#SivR!s diff --git a/src/taglib/tests/data/empty_alac.m4a b/src/taglib/tests/data/empty_alac.m4a deleted file mode 100644 index 8c678321847428247a7776afb210b362301c32c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5380 zcmeHL&1(}u6o1)T`#~t_he&F`p%l!;kk;J1L{RWj6;bdY>STA5Zo9L)-I)aHLE_1O zL%c}AqemeMLPh)|?4RJxLt%YyKiqAsB2-XeUNU)a-g`5@dB1&|F92X&wHs`-t}s9$ zErQm%BYi=0fO1v%{s0YE3^pzDd^}s)$MFH+)m1Q_w4ns_%;m@g-DC51o_U;Q02o^; z<l7j$ueM{%sT?!ijc^MRLyY148rL{2EQjM3OjyU)b@zP?u(D~nVFo4rzL(jVF1-<s z*Tq>yie#rWvT7y%nibj<C!sTz`=QGcyEK%l<Dz{}DjBnz_~ANtxrsJOUY7wCav<*{ zt9cH(EA`nq10wPR%zjF<m{dx}*+?tu3z$e#+;gstx`wz#9KxDR;_w<{kI~Mgjt2XO z2i6TusZ1X=$#ha{<vGB78^>pWg(1Kq!|@hi=@G!p<-Vmj>Px~V9m|m`j$IP+AfRiM z$QLB<rQ=G4)0I7s(|xjR@pv_{2et^*?!)xjRL#JlwexAl8Ok8320b32{voieL_ifR zjIV(Dp7JTeifGQAzGq9e)@-cfW37ep-bEDDHDU9(TTNdys0O={WMk|c9^6I^*F4k5 zKJBqvJmi8}rJin2Q5e`E`AXdEPzz5CI^hoaQC|E8%u)tJz&CE*-oSNR#pAPPDu3Jn zn0n9+?YPMJy!u5mpc&8%Xa+O`nt>BDFfr1ft|ul@Z=f0YI}A*g1%3}_0H<JadgkfZ vchL}k7Jav(XVK^&I@EE^PoXPxe`I%xzCZqx_Xqs9t2X@Ed))ca!T#YliGbjW diff --git a/src/taglib/tests/data/empty_flac.oga b/src/taglib/tests/data/empty_flac.oga deleted file mode 100644 index 444587fd0cf950ce092cc5540b81f973b52136d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9113 zcmeI&Pe_w-9LMqB<7R)X=Hpsx*{roTTWGc!ViMF+=unb}K}D3HHir-v=4Ay7v44~u zIut>N3=gqOk|2nUC`n|P{Q)8B5O$FcQ6nW*B<uO?vxd;6YxMnHp5N=?_j{i4zCAzI z6p4gXfy#|@6U`?uEsfefX*<sEYuwwQDP?MJY-up=x^<-+7mHGQ(X;xLDu@MV5A;p% z9~+2|mW6&sAI4rc;c@wa#~J&Tcl=CTt28U+a~bLiw}-pJoo!*)$&OaM!WF2ht_rxS z{r*~iU7!}*|9lR9W2(NtTeF*#vSQ8Rq33pFaszKR)~UhM!%s?n-^^colxy*3nM(mF zAO)m=6p#W^Knh3!DIf);fE17dQs7@NkUdPnIZSroXv8>*QSMf=N6#OLaN^0Wk&6_N z0#ZN<NC7Dz1*Cu!kOERb3P^$fuR!+u*&K}VZxZ-^E;J%^nrjApmcJW%CY^MsF{T^& z3~A%k_B&9)bIPtkrb()&8#2GA!ZlFgTk2~NTJnmTd<QLkLmeB0mi?f5k3-8BD4P!| zny0o6K`Z8{(FthfEY*AoTJ?cS&Ow%sRH_3i{z65ZkUm7cyaJUBQ%4pcYl3QtK&u~7 z->i`B0c8zAYvR<!a>(9KB@)ou`&2~|a$Ke6cR}l}Q*8&K(hJnlX=r^fHFXbi-lDe7 zKxH?m$2Xx3x2em;(8jxzeim}MsY7mPlb3pW7;;xq=_zP)1$Al!^6aLreTTetl(P>i T_fuYbCLMKbvFzDNznJ+2futKO diff --git a/src/taglib/tests/data/empty_vorbis.oga b/src/taglib/tests/data/empty_vorbis.oga deleted file mode 100644 index aa533104d6fde177772775137cb7660a3be11418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4328 zcmeHKeNa<Z7Qcaj0VBRZupy0Yf-jPnCQiW6B^Gy+lxT=X;6W@Ova5Uu@necac44>9 zMDnm{piDN#)TXHen52-3E3{ba&d$14sftBDD!O&MwWSM)PRCvUsI&j<p7(+u-G90> z?jN1b-nqFs_uO;Ox%YR@yZ79Jy1HT%gBHrk8-IL(CKr|8-p+c4^~;wVtE@Jf5tDa} z{zJ$<#A5zWu?py!4+}k$9{Favk>V-;_1&^4HmYek2$WhI>Q@ys)`@pnt2Q(G#rfha zl`31cTBWAdvErh_QvHjYSxAczZWGAYg>1_xOsFqRn-=Luciu_UZ{)R#vNl$XNNsLO zuuJc(knJCHTM#|rRb4Zma_Kk{O1iex<H%SGlv4vdE6v074;q7}9!7PX<<zt)hwJ!T z&V3PO(3E1pn-fz@^{4!fV;T^~vyFw0c+H%MI;)VmTF<FYEu+}kvX0iTRTn;WEY>^y zj{NNVLaI*Jyew)1*BRZ8c-;j7wN3{sh}WFrQzN=wAtl#vo~6X<npEUQsH;cj>X9X4 z!ofsz0U=CV#Q%7Y=;Cih7Y9U(IZMjo01U(dIio9R?EKp3!OJ{Srp~+;QH%^SHH(>U zM5wTcYuLkI#LTNfh|`th3YEG-^{!cGCx<$4EC$&TVuKm=i^aL?y?IwkEZ0u%zVTSC z@YSX<(*Z+l!n(aL-l>XBi)Z`*%dqoYs&n=SAln6|q@IL+%@={`uCgS*X+X0)U>s`k zyyf~(GaImtUYrSJjsn#aDC7D;ZZ>ePt1K}}Wel{8`Q<ck&*-hK0p2iBEBjmA{?~_q zitD#_`Zo*!W&E&(d}{;Ev(c)UX8!ywQ6Pox_Wt2R-&<qnfhrij_16IQP=t|VK!*Kl zu>-Gf`wPLDn5`GD<5dZ>Zt1?AQzZx;0sZ{=Tz$~Hh9f<+hcsnG0gpjij--uG8Xq)O zPRRj5<0ayqu2z%0ueYZoYeezhWu{qk=h%BmFK{!@VJ|+{e~v8Pojp~$^Bc{q-|_zD z@}2!dq=^W5$wUS}F<`HcPpfek(VDBA#5;k;M0sx%PBHBogbMy48s{y4RR1oz!jl#y zLsd>@Wlt6xEKRl7d`)E^?5numR{8C|&!OIL+E(hTE&EQ5ZXG^qF$8;bBgC-4c3Crr zd$9-G1c#yq{(2_f@(1w^6Zj_+ih_IUf|RvIe8Z&LGM-vl^po91&(}_7R~A2CY1zE{ zCExCflTA0?sJ-#+zAqlDm5Z1yCL^@Qvx4xX6Q1duPCQ>*e?gA4@$?tz`byS0o#Vmt zJyNTuuEp2;rvKKPN8}Mk1YxuYU0mU2S6{QMx4Co9>8XFy*W2fR?o#;9>EpM*uP$Z+ z97kv`zP=G(PvQm=2nJm{mqu6gQ6_F^RE$ihqk9}rSqp%^v^RQaEI0rm?!^=Qk#UhZ zS$dUJT8fodNyF7*%l8%Yq}rSUz$PF!3%RjkrE=Jx(2iG4?0C1UnoHgZ4H)HhLmynq zY!eLqT==TD2>VSRUhUFdRtCq2mHksC`Zj*>aJ4*@Od`Q~Z3y$TZZ?Rtg9@k&G6=cV zOU81So=`7c=;P*CMM13kO6)@aN&d7GYVEyTs0&KK(A`|#-8|kxUvVW?Jsz7|1gFOn zm;bbN0&L~+#&RFC1%`6R{}=mu;>G@7!H*pQ46eGH@Y^ck3kTDYGX*smlko%(`;%Cs zFV5@;|4GgA)aoX?tSa*(EN~dmO^RJ89|p$M&h$q^9vJAdVg`E<2I_?mzafygqL#QY z!{L=@R-2vadAxAKqgjtra54)T-~v~5b04lL$5qQh_URlS<OH45rOP0X@=09?Z7uW5 z;Glo9@?C?;$QgqgWMJ^)0mV(Qh+iB;zPPbmdzb~g0bv=vx)ZwMsy%i%_+wBJLh<JZ z6y_9zCusF&xbXbR+ycJUKihJ|diGu}z3rZQKV~RWn-7Pr5xL52NrimnCJnnIeC{jM zcHkHr>0^+{RaNGnX*rVN3itV=S`6cAbFn4g6K**I$&%F{jtnZy_j2hgs>EVxTVO{b z^I)ie57L&aO<&R)z+z<nG-GtK#B6D*6uZJ!e<Tt)zBsRd4>~KaHSM2$t;ZUPynA{T zW~S9ORhGrmD~#N}l%=(RrplLmEPBfA(}UbX%QYDH)grp57y;CiM35MFbRF!Fx1SiN z7BAIyOP-6d%Mdyv2=j|Csa8sYm~a@U`1+O7&;%I~2T77hrAkb4=}|AagRo#E(dSLn z%cX}%gs$(8g<o4?{RI;eFGY6MI{MPylpf?)k7_b_q$_haaL|-F18Gn`kp{Q<Y|zW3 zJfw-{X^0S$_jpMYWJ;S%gp?Z9WrVyFkRPQWRKlQr^ui2#g^q!nWFc;6H4Qf)<--|o z$^7A!`B4W%E<V8X5V(<sJ|e%C3VDIqVyPTdFj&r?R?)BlEK$%-ui8~XqgI=CvL8GG zm~FY%RQqS&e#P&P-}!71p}Xuws4M2_&Fgar;bMilMoQn8T7kn2DS0iXPn1wzk^^7G zW8t5Sj1cl215<QDHKnbC1}OVwru(QN>Cs2s|B6yVa>it6k2P`VpOzeS|7X`vtT~%M zUb+=L%CbYapAm!vHm;rsm2kiVdrQjO2lUR&Sv>e@`L6S}QJqY3XsSwa#FnHdi1VAP ziwKG&P0Ev{?WXRd9@5l*wX`F%FE~}+-alN`kx#t;X?c6*vK70`eM8rGygMMM-YHkU zFR1P~&-q2oE@k+$9ZQBeD=HMqtK~aY!-CH%+CwM(?U_Hl{~4*soZ5oWuN<)`ul4oS z$MCmPJL8`c4kjbOO^iX1K+Hf?1j!B!L`9OG(_I2QhLU(Y=;&eIKcoqG4CN;07bwg` zyiL!bpGZW=!Hi-iSt!U~cro<_y);GYVYlEYMot=p4439{y1{uSq79~nys%{=lx#|n zQpqGig!m?o1O|auVoK<yk|8*0>_LHv0Pl)&AUPK3GSV!|wjE7)>Y3=NQUf_pkC!Br zhSv0uASl?dF4b08?&@vilArXEqv9Fd=gg$M2TQVM_<F8>UevUah*usG=!XTt>x~<_ zZAow{>X6;;MktmYw;G+fiN3U9dt=z^pGJ0Z-gal+NBV~5!UT+0%+gl1>Q|wX(k;Qt zE!sC&tLDBs9xGu>I66gAmz^yNG<=lua`V|Go5l!vlNj_Ov;^IS1#Uq+-uUHhHTAn1 z_BOv_r<@&bI3S^<p;zGLD%IxYscnKZ;nSk!&pa!Zq_4o?7>~ZU#dgGIM>8t=1ZT6E f2Q~Z5ucPNV{h+3)?Z4Ys(arjy7nGRv!!G{@RvL-o diff --git a/src/taglib/tests/data/gnre.m4a b/src/taglib/tests/data/gnre.m4a deleted file mode 100644 index f925ea9eb5d1cfc12a1effb51e3208737a97aeb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5026 zcmeHL%Wl(95Iu1mS_G(8d9|erCuP9`Arblk4Np}<;-N}(frOmcX|39E@V%)73zR*Z zO0b7*C4PVfQg;0U7HnAa0qnyWKS&y(Zb9OXV$IC)&CK{{=H@y8mb&^?KklzLK@lCQ zBnE1qW8c%?Z6FHUUC-;dH*Yl8f!lcJ+D$yDWAngT#@f&rh6K|IW(v#{{0mdSJ$zm^ zZs6Q@oFx17qj-PUm(6|j^WL|kg}Dfo7YC?aK936IGm&Es;TeBpvhq)sMQ|xhd?h!X z;cz&IN8|CrcnsKDr`{gn=Xx)zrSiL$GK<tRC0Xj3{3q9AJFy>n4B^K9%=6;YU082M zMfm!zAEjj~l?-~NUFhmj9QL|&92Mt*iW^t`9AEX*K<<l3iDw6C<mPtut<vp?_Kwmj zBR$9QjK8c>oXF&{EI0zNJds<0%E_yeyaoZA`ohLVV1-G30B71YBG#gFimD=fyGrYf zZ`$I2;FqW*g*D>!o@KlippcK$42IL@G93J+9=OJy>@c^8^sJ1-^+HSYt`;_XyOYos z5!~g{FF<vZ?pN_U$9tb~vfk$mh|F&feC<&`jsww|G^S^t`$g*Y`!cS%JmG3|(;z4T zqYVRw0mFb{z%XDK_%9e}gpuOg6IOP5shk5A`7%|W9)L?kUdjpK#B&4}JuJf14|O7k knB^i24=KR?R_jjjcN*3XTTi!$U72366)5etQXMM&3nGA@LjV8( diff --git a/src/taglib/tests/data/has-tags.m4a b/src/taglib/tests/data/has-tags.m4a deleted file mode 100644 index f48a28b520399cdd2184f965f4b690c68f6702d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5108 zcmeHJ%WD&15TD(od9`_IYG0vjnzk0Psm2zG2HLbSHKMJQfF6Xp&2DVkY_?>#MMWft z2StQ};z5Lpx1xB~gAk!0cvi3$#G`+JS6OE^8=C|Xgn}OSm&eTf_S>2HW@o+x06KH( zwH0Y)Gztikc}120T3$;6uYR!t6!Hr>p3ibeBhgWSNqE3nqc9zU^g7!G;j*ciMKC+T zoC0$S{)Z_5@Ps8<Uc<AzAgwJ5bf{OppW1$VHk}4$ejQpm_5%a--bI6fbdx=?yYhD$ zi)3eB78JVZE0@c5nAJ3|rU6)0wZtzYeMw!`b76kvQj0?Q)Iks36#vipSbdU^=g|cx z2~GQj7fE1mRt)!{MWIltg;M0zVof)s<(-r-=FspdQq_@hp<k%-L7^nlbpoZ>wpuE1 zRo!w=Q5OoRUr|&=FM5@S3;2sl$q{z9#e$CrOpkC(RI0_ZVDb8pu%Zl1v;%ZwkZ%C3 z3oXd7`+PPO4Aq-cR8_Ax>SS-=O(-Y?TfxsmOyfEc2A-lsXW%qHW)1#P4-8>XW-&H_ zdX~oFupy~=gNBa1ot0515YOS#HvpD2njgu|HugUH(R&|ffZz<T3M!AXM-oZuXqbIG zFG~E%3XN+G?CpF(QPB!*sxk%d!au)sGdc%IB@$D{-(LuCCgw88_0%uOh>FT3N@`yB z@oX4@OM;Tf>xWEMmLe2TjN~(`MUe(KP~;^MB@i<+J9iG%rFxg#5d(X!;HDmB<uy7A z=Z%OS%H;0(nQ6DH+l8t-eL6XZk{%Q5pzj|a9#h%}(#b^T>XYn^jrSGA7JXF!{7&ZL z^E*5GQ%j$kNxq!Cd<(;j81CJ8CupCvui!hAN~eHf7!dFU+73*C(`I+rZBB>7;c_`! zJsn<;+wBPk+Wj4Uz2R`Em*WNwjSUYRj1F;JWPBugJQk0~`-dk}i4&=@lkpfiVO%bk zr_Iyj_4dRDxxv_9L#u$_f%|1GOdqg*#^PtREojG7Dfc?qkq-EpS)j$Vtp-?awAkOo v;<i6Sn}xwJ7C(%`{qn0WZ5zP0lq-pPPc%3&4YLAf1<VSV6)-EXCl&Y!Uf%vX diff --git a/src/taglib/tests/data/id3v22-tda.mp3 b/src/taglib/tests/data/id3v22-tda.mp3 deleted file mode 100644 index d89ae1c4473cfeec3d8c9a1ecf8c2fe0f4570506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/src/taglib/tests/data/ilst-is-last.m4a b/src/taglib/tests/data/ilst-is-last.m4a deleted file mode 100644 index c56c80498027ecb7113d0ec56042277233361ccd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 diff --git a/src/taglib/tests/data/mac-390-hdr.ape b/src/taglib/tests/data/mac-390-hdr.ape deleted file mode 100644 index c703e2e2fd595469973c4162cfbebcc0722ab829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeZubXKt8U%)TMz{KFPhJitc0Rp&yR9*@L!%cMt1`s>Q)6MOUpcX^8W0-4NZi#{b zP>d0(M_?lp0}F!yLrP*v;trsi8lap{9TP*cE-ORIPIiXhwp<L~F7Yr#X7e*VV;5q0 QIah=s$V;5zOy1sd0HO&R=>Px# diff --git a/src/taglib/tests/data/mac-396.ape b/src/taglib/tests/data/mac-396.ape deleted file mode 100644 index fa7ae4149460cc0a94174a1e3ce72fa4f1106138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104 zcmeZubXKU~zrZfWz{KFPhJitc0Rk9-)PX7{FbBjA@^o`kdCkcX?il8pmRq7A02E_{ h>Jiw;#K6KJz>tzylE?s569JSH7VO>34%f}V003n#561ui diff --git a/src/taglib/tests/data/mac-399.ape b/src/taglib/tests/data/mac-399.ape deleted file mode 100644 index ae895ba21cb8d6ca9561db087d4373d976503e3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeZubXJ(g&%j{9z`!5@#5_Q(1H>9Y3<JOCbl$m`R%)zJn7KqqYVpYn>_8a>Mur1c z3=GUbrT_yIgUcEQh87@uA`s65;vi2qH<j0%4B?Jpu4%a?3IaeeMyNW0jZ6$IKwT+` iC5a3`H9bi(y&xk&Du7H7qX)=jpYR>TWVi@qf*Alqb{*XS diff --git a/src/taglib/tests/data/mpeg2.mp3 b/src/taglib/tests/data/mpeg2.mp3 deleted file mode 100644 index 13e8d53df6f32dc924cf5b153eb62b92fc13e65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 AumAu6 diff --git a/src/taglib/tests/data/multiple-vc.flac b/src/taglib/tests/data/multiple-vc.flac deleted file mode 100644 index 93d9a8a14a2eb60b75cbb1be5c7975a095407b18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4754 zcmeI$%PWLY9LDi8jLQr&USo`5#&u@nGP#vYk!EC~rrc(MTpAkESO~c-l#s&SWrvl8 zVkZfOg(N#EJ3D28gq86=9=861bL#Z=>381Eclqo01!{#5IVNFJKSm)G{ki8^L`<J< z?z=zwALlpD?v<h~ebt0k2%GvuXw;jaUU!SXq19jQ9vK@P9m^{Ie_S#vlmh%Mk1QYy z$O5u}EFcTW0<wTCAPdL>vVbfg3&;Y01;U^0RuQ6<B}g+wEry|pAaxvsB73P^1=3DX z*UeDWFxBCNqNk|7V<={Zdb@&RTdDj?Nav@He2~72TDXPcIw;dN6yHd_KR||hDzFL} z-Bg<aO7K!QlaTVWPZ46^2}-nc_Ph?6lBvr`C<)6M^>mLz<{0X*9Qu7ITpq}x<IH>q zrKk%XoVi`d>YzG%pj0Pyl?SD{sMkHnmPZ9IAbSlpI}fE-P?i@cqnIiTL78RLK?any dOnrHw>=kOT6v|nkns&mUQ&xxeWQ}gC`vy%NpK<^I diff --git a/src/taglib/tests/data/no-extension b/src/taglib/tests/data/no-extension deleted file mode 100644 index 65f57c2ee985713476ac0b6e3483e6fe472e2176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 LcmZQz7})>-0RR92 diff --git a/src/taglib/tests/data/no-tags.3g2 b/src/taglib/tests/data/no-tags.3g2 deleted file mode 100644 index d31a6ce96d7cb701216e29bf17e15903e3fca5c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68335 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%0DOmT!Moqh7w1Y^2~HTN>C$n{#(z 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 AGXMYp diff --git a/src/taglib/tests/data/no-tags.flac b/src/taglib/tests/data/no-tags.flac deleted file mode 100644 index 41714416760792085717cb85fa1542e5a7e28981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4692 zcmeI$&nv@m9LMpGZGLQwubCN}`LSJ$g_Iwqw8?T<Ar7<rXtYTjoG=HqY$@FRxZ&iW zxJep?gO=Q++}xDINbF?x>Lq{0=Y9F~=<_~3kMFQA*eisnHwZ)aDHcM}-FQ+$wQ{w8 z>i!PD#`dnCm6iit_fk|SP1zMWvVbfg3&;YpfGi*j$O5u}EFcTW0<wTCAPf8#$fQTj zVvbZcpqzPXJp-viR3Zear>F)6(kxN;Ls0Gl6>va#5o$UC<*!noNvL3$YV3lvBh-Zt z(v4H`N2oAB84jVM0qW}o()UxrZK&8y`SnnVmwH%+6bm);29;W=)GlNwr|#5H8O|%& znOKC3`P6v_^tUKn9>}ESpYaK*$ev^{YsZk;PK`}Ml@2QDgsNQB#|dO{QlVSO+CxQS vP<1C|dWUSSRP!8E(@ve)pxRC9#|zbMQL}AOeViIR%A_M^yXJC-_V@h)*-@2S diff --git a/src/taglib/tests/data/no-tags.m4a b/src/taglib/tests/data/no-tags.m4a deleted file mode 100644 index ba4e92baef225c0204347186c4aaf42e0259112f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 zcmeHJJ#W)s5Psq~5L6^AKGYUEIFx|_Arblmn$m(QRYIyNu^?4WUWZ!sTL-^yD#1`? z?^3DV=~{_Dz<|icFJORynIF(SJZHO2S|L^#{3zDlJ+FOtKHZ%IV5V!|^>lBc2|{FK z5)IToX%*O?E)YlUZV+_*Cy$#8z!DC9w}}@GtR6VCm>-l%S%k6^$|)$P;D49`?(n)S zZZ7b;PLf^PvEJQMvfPKKE8mBwYhO^=JV0&w7Alb67#9rEm+Zyyoqy6Ck~2}Fj2wD{ z!Qd)hjz%{|Bfzyb4Yo<Yw%b`Ql{}Y~ALQ~VlFtM(@>2Z2=i_=>MFCy-T1~#M#Q3-j zXKz@zZ)~YJJqu-${?3_R$m&-e?R05)M(2)-g9j?-=TsWXxj<69-cMsc*Q@)+wqxpV zj5S%&a~`kwWtHRv<JWTF3BmLPPeYRzugc=xC*e}wUc3X`WsqOMRJ%sTx#?Y@s7Sqi zV{KM%>SBN3LlhFi8S*+}8t;WDa7;;OxK>_e4gOINJY-LH7+WAcE93B}kkY(!h0fmY zB-91M`@HotP+g_@P3+Fa-lw0e_c;R@>V0JcYHzz~7*5VS_e2`>dNQWxSc_uArHRIg nO(f_ncc?r}r@-@8>sj&l7xO2r^$l|OCU4jXjrCipjg0*b4AhjE diff --git a/src/taglib/tests/data/no_length.wv b/src/taglib/tests/data/no_length.wv deleted file mode 100644 index c06d1071d5ac76d9be9d6eff977a5f8cd4c82863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmXRfE6C1ZU|?WpVPN<V1VAQ(QWyh+qC^ABdZ+S_ief>YZf+_+IT^wo!(7vHOB4iv zDi|4<7+lscFbHg9VqjqqU`R<UNn`-3VPaqg@>$tHroccd6NuFXB>(^Kh$sizX9DDd z>~pAN0^5abA2t(k=>@rfT)k;bjAZNWh#+6@s&(Y+J;TDpu*(J#H}CIsO5qHv`jVgM K;oRm(yj}nfOJeE( diff --git a/src/taglib/tests/data/noise.aif b/src/taglib/tests/data/noise.aif deleted file mode 100644 index 310b995e3c64878ca14d096b8e219f59389e6ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4400 zcmZ?s5AtPT5L9>cbaQj|_XV;UgculsWGaJ%1K%1KAPWfGe0+i!82ArCc%$TK2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQQzsf#6_2V4t4R9Og=<u37ARma=Fp z{r|b*Yx0M`OLf`XqgZ_&au@QmO@GKX&0C_whUKRX@6{-2M_q2#X&izT3_(%<Y#7-8 zd|=+g|7&mNpR?0`w=Dh1eV93d|5x^<-`(w>v!*?M<o(ok%lnwaZ>Bu_cG%{JsSW!C zT}EbahC3BZKKwj0_&NXcGl(r^iH`c+{NdX@hCeqieQ&j4Ui^?<b_>7xLvG;;9x)r9 ztO_m#Z}I$guEn~%jO}di4~t7zaP9iQuHpT=j{nc^rECfh*#h{5PBQ$;KFoGim$AH^ zdD1j?&Zu8*TYf%S`b+Z?vr!b6l{aIl&5s+G{)O0l)|30SLhk33Ex&f@GBz${`}l!z z*N1P`6%3O6e^sV&>OSP+l@pvX?Z46`4woolcklnjx~%CBzp!O~dzSet@-T~~Cj$T^ C(vHsn diff --git a/src/taglib/tests/data/noise_odd.aif b/src/taglib/tests/data/noise_odd.aif deleted file mode 100644 index bccfd7283c4be54cb38d869161148a620cc0647b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4399 zcmZ?s5AtPT5L9>cbaQj|_XV;UgculsWGaJ%1K%1KAPWfGe0+i!82ArCc%$TK2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQQzsf#6_2V4t4R9Og=<u37ARma=Fp z{r|b*Yx0M`OLf`XqgZ_&au@QmO@GKX&0C_whUKRX@6{-2M_q2#X&izT3_(%<Y#7-8 zd|=+g|7&mNpR?0`w=Dh1eV93d|5x^<-`(w>v!*?M<o(ok%lnwaZ>Bu_cG%{JsSW!C zT}EbahC3BZKKwj0_&NXcGl(r^iH`c+{NdX@hCeqieQ&j4Ui^?<b_>7xLvG;;9x)r9 ztO_m#Z}I$guEn~%jO}di4~t7zaP9iQuHpT=j{nc^rECfh*#h{5PBQ$;KFoGim$AH^ zdD1j?&Zu8*TYf%S`b+Z?vr!b6l{aIl&5s+G{)O0l)|30SLhk33Ex&f@GBz${`}l!z z*N1P`6%3O6e^sV&>OSP+l@pvX?Z46`4woolcklnjx~%CBzp!O~dzSet@-T~~Cjgc7 Bj?Vx9 diff --git a/src/taglib/tests/data/rare_frames.mp3 b/src/taglib/tests/data/rare_frames.mp3 deleted file mode 100644 index e485337f9e489dea7fecc899c7418cadc923c4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8320 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 N691C_K>+}&{{TD^OUM8K diff --git a/src/taglib/tests/data/silence-1.wma b/src/taglib/tests/data/silence-1.wma deleted file mode 100644 index e06f9176648836ab73928f0e15af92abd5c82f8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35416 zcmeI*U2Icj7zgnG>1H=(g&i@v5Dd+t1e`W(kcGvMY<7&vhmhfvIB*UrvIw%Q8zV>} zOfZXlh+a4_MsZHvT2QiJNYDfmBXL`#V~Pm|k$@p;Oi*LyoEZJT=bQ#M>y;Pl#s75Y z^z=O+@7v$$#gnJcS!Ye}Y2LFYVZU<*F|0bdZqsBqQx=z&Z}yn2bKH%{fzNw1A%ZBH zyms^S=GpkJ`P~V7&v*DZ5L^~n>un1Ub^q}0lDikQ9y~m=aY5ec<uAA!_LhX&OaC}w zUGMF8I59cHtR5J+$7i17*O?{QAJCWM&WEl5A7mV_4Viu}y8V2e>+A-5@Qe5{(|*Zq z_v0Y9bXSD8oWFc!Vb9Ex`_7fE*b#Df=2`twJjEA*2%g4WXy&^CR_^>|`u2H0&3~hI zVq{uoRqvGK-qw%(!=Jui(^9$p$=I&)kwtx*lUw*~A>gP05AZAx<9<|mTP+wlKj(6K zZA3ku;By!o*ykE98?hdBTsN%`abAxGtYeGO1s0)*%cd{=dEfR;nAdsi)p-9avF{ru zu~Cx*Bp?9^NI(J-kbndvAOQ(TKmz|up#SYlH#MFp3O~2MyS~a_^XT&bI9v9})f~mO z>v85POwPjMBh-=1AOOL0u`{=9d2Pu@Gj>#ev+qJj{=d#!+Bq<ob#c&c{}~5*AM0A$ z>Ftq$sdxm7QGsR5BP?WwA;Qc-l-UH6M=;Y=6k--aoUbltqnO!;Vs4!>>gWe~bOfuN z*&KVbcZ@mOJ%c$56C<Ot89rp1ol#nK>iJs>2kf^xImV32q4%6tplnRL#daU^*mFI{ zxSAtv;fRBL7pCue<~V{VW7fs2Z{T_f`!3`$w{hK!JILhBDrQ5XxRdL1FxP3R#AfHU z$vhc@h;wWa^EVAVW7O#(?B!p4sIy+mI(zi!H94V1Z?vVa*AFkQN!VR~VQcM*@`9zG ze{%fAx`e&6huN?r7lPhybOo|GTlj3~*UUQ0hpiv-y-wqm&&g#r3~j(99J+&h#B<^~ z7I3n8_?g`mr|jLWc)Y#0qbGSP^Jy^ItKu=4weuU@zQ$(Bl36j!YUL1CI{4KV2f!)Y ze8fz8Yyyz=?C-Y+^Ya6jfBW<0y|(Rd8M*gJTd*}d$ip;AKmrnwfCMBU0SQQ8JO$iH zwwh5gBU$IWUMG@0&F@F^fXv)7{*CAO)VBmAAOQ(TKmrnwfCN$txRGp(*;q!hPHxtT zWDA%po}oxKwV7HaAOQ(TKmrnwfCSP(z>Q@8W;T|QtaHbW6UlC4X~A4YvgvSzGzJMs zKmrnwfCMBUfz$$Cbpc~oMzZFXYqw7JE7r<ZDw0iYrdA0^KmrnwfCMBUfpie?stXvy zGLkj_kjaf?3jzRdMs(|Bb;nmaTq%t~0uqpb1SB8<2}oeHfLC3>7?zPNi(|b=cH0fW z+GHd<`Ut&}fCMBU0SQPz0uqowItX~x1uTnYB+F&8x?m!(Ns(+iTp^7?0uqpb1SB8< z2}mHdfLC3>vRFp4Tqdgv_+v?JieyupsZ|0JkbndvAOQ(TARPp}>H_{$0wY=H2NT@? zU0?(I6v?K;719_aAOQ(TKmrnwfCN$tc+~|gi)AFs+q{z11vdg+$w*dre5JNis{|w< P0SQPz0uqqGcnbUjXqG|4 diff --git a/src/taglib/tests/data/silence-44-s.flac b/src/taglib/tests/data/silence-44-s.flac deleted file mode 100644 index 24e15deb8c85ef82baf22a231901d646397dd8c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50904 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 diff --git a/src/taglib/tests/data/stripped.xm b/src/taglib/tests/data/stripped.xm deleted file mode 100644 index 57055f5f192d5858341a8a9235d0f642481d7180..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 602 zcmZQzKm#S2B{``I`DqHp`FZJRa%fypAfFM4Ilv?%0~<pv0|O^Wkplw*Q^P12(IEf; DpT-63 diff --git a/src/taglib/tests/data/sv4_header.mpc b/src/taglib/tests/data/sv4_header.mpc deleted file mode 100644 index 214f7ac4eb710e8e21de093ee7959dab8fe86bca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmV-`0Du3%Cm;Z)0P+K!E+_X8&%*;!>;D5wsil<Pw|`SHW?4+jVwPoDmSr)-7(xuW zvBWGKXl@{?UfGo!nyhFu>6)pQDvY{}wzBH4T&wTPvrFTA(>cv{&D-_Dah=cBT5|n@ iE3UO<#~#&>*ohqgTB!C%gDl*OOm-ISqH9VS7Q>v%RY5rb diff --git a/src/taglib/tests/data/sv5_header.mpc b/src/taglib/tests/data/sv5_header.mpc deleted file mode 100644 index 6d17e65f0f865303397cdb08632cca5a2aa0365a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmV-`0Du3%FCYN&0{{RVcBcU78pg2y2S5XsQc5XpYAK~=`TMqG7PBld%R&|wvn-27 z)(~SG+b-oV^~l!Gc|2h@R~)T+MB#OHHdkBzU)gt`zIpg}+1_WT^O~=6<x2Zku3Wju i%9txZJ@=^oqLdzMqz%Mg>6~40@oh*DH|+sQguls;y*_RL diff --git a/src/taglib/tests/data/sv8_header.mpc b/src/taglib/tests/data/sv8_header.mpc deleted file mode 100644 index 3405545a29460883251a5ccd6135ae440bca5815..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmeYbaP|)N;Crv7*~rn-9LK;a8RX8x=vo_f28=z~0~zHQg8eyM7=XYrfJKH(ED#*R L#wc_k*p(Ro^T!wZ diff --git a/src/taglib/tests/data/test.it b/src/taglib/tests/data/test.it deleted file mode 100644 index 379444b91869139a9ca1b73d5b2b9bed98370e9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644 zcmebD4e%{VEiO?g&d*C%$V<#kWk3Qf0!%<2D+42gIFkqyCj%Qpg8^G@15|}y3da)# z3V{QK;Q#+GK-ai1GB8X5;wM0C0&+4CFf&}Yi&S_j#sH*WDj9Qv==Zx`3otNv`UV6; z)IdoG28WQ0%wh!~N>nIL%q_@C1qX#5iYhQ?wE{w{1!@yE^E~qua`RJ4fd-{zf{6U0 z+{BV%gkBhnSo4rv1$1OlszPE?X>n=_%osRLta*vW3b~~@C7C&yd8rD?`MJ5Nc_qaZ O_*Vh$0{jeY?gId>FJKJ- diff --git a/src/taglib/tests/data/test.mod b/src/taglib/tests/data/test.mod deleted file mode 100644 index 136b6119187bf574bcfdca2c4a4e9155880d553a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3132 zcmeH@u?hk)3_#mI$u2rO9=Pb@KU6O#1)D<C&i=Z&DA?il4km>V@)AN{jrEC;7vM|} z_lXN}EiEBcppcNiZRaMbd?*Ov));39KO{uyJ*Rb%A(FJZn56b8&rQxPaZS0TQ2C%U uO82|1CtRt{Z6%|<6|?aNHvFsq<cRusI$uZJwVP(Z4445kU<S;<SOae~S1CaN diff --git a/src/taglib/tests/data/test.ogg b/src/taglib/tests/data/test.ogg deleted file mode 100644 index 220f76f0cef41c7e50736c9134ffb20f0d297961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4408 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 diff --git a/src/taglib/tests/data/test.s3m b/src/taglib/tests/data/test.s3m deleted file mode 100644 index 668250bb7876f31762bb3c2d4a2cafb93cff2f9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmXR(EiO?g&d*C%$V<#kWk3N^0t^gH46F={Kv4x@CWc_=AYTWzS_6SUNXj@EIhnYa zxmkEvdD-~b`Tt`8P6j>(VFn2XStL!km<<iMWI*B$K)hN3NFafbjLc#MAWF<r$jmD) zDJsoP%_{->MGr|8cBTVR7~MSI{FKt1RE4xm5RqS$n^;neT{9L@Z002<l@_O>JB>&q lv6@$`kXxEll9`j4m#UDQp9}JCF=4NQU5m{;1+WZm0sx-yM0EfF diff --git a/src/taglib/tests/data/test.xm b/src/taglib/tests/data/test.xm deleted file mode 100644 index b09d91324bb3e6edcdae4f659965e1a87b5e1954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5471 zcmeH}Jx{|h5QZ-i;$vq*Lb?$N!4F`{(t)89`~lNA$f`do+mT>E^q<2yPHTn$T@XX= z68kLqJowT3+FrawX<OOi(zU&ocNkUF5?zPE*=NXcu~d5f`sl@KEj^BLRGn7<^usCj zTWZJfHZGWNI!jw`0O~ErtO=ZuGwyAOzBkfFw8F?R+M<T5arC#T0ZdXnIFRb`;Oe>_ z+)vv~@$sJXPkjS)Ou&OM8!dmY`%0`-C#=Ft6i<DiQ%mfaQbjdutO-hRMn+YH29R*A zoJkT4sBGa#C)B)g>ENbBR0uVLT6gen%LI)sshQ!z#7@z5**R}S47n&x-ds<8<4Q`? tkyd^iJV|I60z=3SVI{B<SP7W`D}j~3O4t)%JFp%0V&HcI+u{H0@Cp8IS;+tZ diff --git a/src/taglib/tests/data/unsupported-extension.xxx b/src/taglib/tests/data/unsupported-extension.xxx deleted file mode 100644 index 65f57c2ee985713476ac0b6e3483e6fe472e2176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 LcmZQz7})>-0RR92 diff --git a/src/taglib/tests/data/unsynch.id3 b/src/taglib/tests/data/unsynch.id3 deleted file mode 100644 index cfe6ee1a6f13da6901627a4543f7849dc2d99ed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeZtF=l3HU|?W02=NRtVqjn}1+xGBXJGJUsAN!JNMc9?;#43ji=mXEn4tv7N(PD* z0mX`e>@<daAX|YUmmxJIz||0_UlOX{k0FyG52#XsAsEQY1**#fs&Vvj0;&;(sxf3R z076xu8ZV&ADu$|%AZKr&JUdk0fWbJ#$JGxg!tVfal@Ws>gBe(t!T;YAco_IU9AokT z$}`9?cnSb1W(H0j5I2rd^#G9ij|`svU-M@HkGx&2`|172;{QKAZewCMWnwU>eR}Y_ dH>%vO**}Anyl%v>9odbd=d!cx(>YD)697C+bpQYW diff --git a/src/taglib/tests/data/w000.mp3 b/src/taglib/tests/data/w000.mp3 deleted file mode 100644 index f9c2261764526ff40aba618a1e9b9933acada5fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmdUqQA@)x6ore5`rwm4K<|s750-TE!M*9)BBSeCW@Pvz=}fz@G#PD5?Z5XFd=USE z2R@Q>a&K<3h^EILbb1qJX^PDTNK<)vV{1#9(F5I6-}nAu3@p6AwKcLxwXRV`=ae;M zOL9BaQmM2gtmDzvp%+~{RVXJveLl~}0Vg1sJn}GG{kYrd9gkNb+$H!mI5SISBwz3e z@(Yj{+bdJiyX|-yM@Y^9V-IXL<9QswT!UBHRLate&~^}pN}sr>8$pSbMi`#I%~5m? z*0v~=X*Y~9xGT@o-Cnf578>b(c#>bDK4>}q_ygkWFhSiB2>A1IyyefUko+%w1F}q5 ADgXcg diff --git a/src/taglib/tests/data/xing.mp3 b/src/taglib/tests/data/xing.mp3 deleted file mode 100644 index 0c880151b6b60b5f5ac4823a064320710b687449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8208 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 diff --git a/src/taglib/tests/data/zero-size-chunk.wav b/src/taglib/tests/data/zero-size-chunk.wav deleted file mode 100644 index 8517e797dc803bfbcea502588f70d68e643a6aad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmWIYbaUfiU|<M$40BD(Em05vvKbke7+lscFbHg9VqjqqU`R<UNdyXyg3%Bd4S``6 F0sw5+2R;A* diff --git a/src/taglib/tests/main.cpp b/src/taglib/tests/main.cpp deleted file mode 100644 index ab89dc3..0000000 --- a/src/taglib/tests/main.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include <stdlib.h> -#include <string.h> -#include <fstream> -#include <stdexcept> -#include <cppunit/TestResult.h> -#include <cppunit/TestResultCollector.h> -#include <cppunit/TestRunner.h> -#include <cppunit/extensions/TestFactoryRegistry.h> -#include <cppunit/BriefTestProgressListener.h> -#include <cppunit/CompilerOutputter.h> -#include <cppunit/XmlOutputter.h> - -int main(int argc, char* argv[]) -{ - std::string testPath = (argc > 1) ? std::string(argv[1]) : ""; - - // Create the event manager and test controller - CppUnit::TestResult controller; - - // Add a listener that colllects test result - CppUnit::TestResultCollector result; - controller.addListener(&result); - - // Add a listener that print dots as test run. - CppUnit::BriefTestProgressListener progress; - controller.addListener(&progress); - - // Add the top suite to the test runner - CppUnit::TestRunner runner; - runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); - - try { - std::cout << "Running " << testPath; - runner.run(controller, testPath); - - std::cerr << std::endl; - - // Print test in a compiler compatible format. - CppUnit::CompilerOutputter outputter(&result, std::cerr); - outputter.write(); - - char *xml = ::getenv("CPPUNIT_XML"); - if(xml && !::strcmp(xml, "1")) { - std::ofstream xmlfileout("cpptestresults.xml"); - CppUnit::XmlOutputter xmlout(&result, xmlfileout); - xmlout.write(); - } - } - catch(std::invalid_argument &e){ - std::cerr << std::endl - << "ERROR: " << e.what() - << std::endl; - return 0; - } - - return result.wasSuccessful() ? 0 : 1; -} diff --git a/src/taglib/tests/test_aiff.cpp b/src/taglib/tests/test_aiff.cpp deleted file mode 100644 index df1c5ac..0000000 --- a/src/taglib/tests/test_aiff.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include <cppunit/extensions/HelperMacros.h> -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tbytevectorlist.h> -#include <aifffile.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestAIFF : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestAIFF); - CPPUNIT_TEST(testReading); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testReading() - { - ScopedFileCopy copy("empty", ".aiff"); - string filename = copy.fileName(); - - RIFF::AIFF::File *f = new RIFF::AIFF::File(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(705, f->audioProperties()->bitrate()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestAIFF); diff --git a/src/taglib/tests/test_ape.cpp b/src/taglib/tests/test_ape.cpp deleted file mode 100644 index c95ff0c..0000000 --- a/src/taglib/tests/test_ape.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include <cppunit/extensions/HelperMacros.h> -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <apefile.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestAPE : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestAPE); - CPPUNIT_TEST(testProperties399); - CPPUNIT_TEST(testProperties396); - CPPUNIT_TEST(testProperties390); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testProperties399() - { - APE::File f(TEST_FILE_PATH_C("mac-399.ape")); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - - void testProperties396() - { - APE::File f(TEST_FILE_PATH_C("mac-396.ape")); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - - void testProperties390() - { - APE::File f(TEST_FILE_PATH_C("mac-390-hdr.ape")); - CPPUNIT_ASSERT_EQUAL(15, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestAPE); diff --git a/src/taglib/tests/test_apetag.cpp b/src/taglib/tests/test_apetag.cpp deleted file mode 100644 index 845828f..0000000 --- a/src/taglib/tests/test_apetag.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <apetag.h> -#include <tdebug.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestAPETag : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestAPETag); - CPPUNIT_TEST(testIsEmpty); - CPPUNIT_TEST(testIsEmpty2); - CPPUNIT_TEST(testPropertyInterface1); - CPPUNIT_TEST(testPropertyInterface2); - CPPUNIT_TEST(testInvalidKeys); - CPPUNIT_TEST(testTextBinary); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testIsEmpty() - { - APE::Tag tag; - CPPUNIT_ASSERT(tag.isEmpty()); - tag.addValue("COMPOSER", "Mike Oldfield"); - CPPUNIT_ASSERT(!tag.isEmpty()); - } - - void testIsEmpty2() - { - APE::Tag tag; - CPPUNIT_ASSERT(tag.isEmpty()); - tag.setArtist("Mike Oldfield"); - CPPUNIT_ASSERT(!tag.isEmpty()); - } - - void testPropertyInterface1() - { - APE::Tag tag; - PropertyMap dict = tag.properties(); - CPPUNIT_ASSERT(dict.isEmpty()); - dict["ARTIST"] = String("artist 1"); - dict["ARTIST"].append("artist 2"); - dict["TRACKNUMBER"].append("17"); - tag.setProperties(dict); - CPPUNIT_ASSERT_EQUAL(String("17"), tag.itemListMap()["TRACK"].values()[0]); - CPPUNIT_ASSERT_EQUAL(2u, tag.itemListMap()["ARTIST"].values().size()); - CPPUNIT_ASSERT_EQUAL(String("artist 1"), tag.artist()); - CPPUNIT_ASSERT_EQUAL(17u, tag.track()); - } - - void testPropertyInterface2() - { - APE::Tag tag; - APE::Item item1 = APE::Item("TRACK", "17"); - tag.setItem("TRACK", item1); - - APE::Item item2 = APE::Item(); - item2.setType(APE::Item::Binary); - tag.setItem("TESTBINARY", item2); - - PropertyMap properties = tag.properties(); - CPPUNIT_ASSERT_EQUAL(1u, properties.unsupportedData().size()); - CPPUNIT_ASSERT(properties.contains("TRACKNUMBER")); - CPPUNIT_ASSERT(!properties.contains("TRACK")); - CPPUNIT_ASSERT(tag.itemListMap().contains("TESTBINARY")); - - tag.removeUnsupportedProperties(properties.unsupportedData()); - CPPUNIT_ASSERT(!tag.itemListMap().contains("TESTBINARY")); - - APE::Item item3 = APE::Item("TRACKNUMBER", "29"); - tag.setItem("TRACKNUMBER", item3); - properties = tag.properties(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), properties["TRACKNUMBER"].size()); - CPPUNIT_ASSERT_EQUAL(String("17"), properties["TRACKNUMBER"][0]); - CPPUNIT_ASSERT_EQUAL(String("29"), properties["TRACKNUMBER"][1]); - - } - - void testInvalidKeys() - { - PropertyMap properties; - properties["A"] = String("invalid key: one character"); - properties["MP+"] = String("invalid key: forbidden string"); - properties["A B~C"] = String("valid key: space and tilde"); - properties["ARTIST"] = String("valid key: normal one"); - - APE::Tag tag; - PropertyMap unsuccessful = tag.setProperties(properties); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), unsuccessful.size()); - CPPUNIT_ASSERT(unsuccessful.contains("A")); - CPPUNIT_ASSERT(unsuccessful.contains("MP+")); - } - - void testTextBinary() - { - APE::Item item = APE::Item("DUMMY", "Test Text"); - CPPUNIT_ASSERT_EQUAL(String("Test Text"), item.toString()); - CPPUNIT_ASSERT_EQUAL(ByteVector::null, item.binaryData()); - - ByteVector data("Test Data"); - item.setBinaryData(data); - CPPUNIT_ASSERT(item.values().isEmpty()); - CPPUNIT_ASSERT_EQUAL(String::null, item.toString()); - CPPUNIT_ASSERT_EQUAL(data, item.binaryData()); - - item.setValue("Test Text 2"); - CPPUNIT_ASSERT_EQUAL(String("Test Text 2"), item.toString()); - CPPUNIT_ASSERT_EQUAL(ByteVector::null, item.binaryData()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestAPETag); - diff --git a/src/taglib/tests/test_asf.cpp b/src/taglib/tests/test_asf.cpp deleted file mode 100644 index 8610c24..0000000 --- a/src/taglib/tests/test_asf.cpp +++ /dev/null @@ -1,255 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <asffile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestASF : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestASF); - CPPUNIT_TEST(testAudioProperties); - CPPUNIT_TEST(testRead); - CPPUNIT_TEST(testSaveMultipleValues); - CPPUNIT_TEST(testSaveStream); - CPPUNIT_TEST(testSaveLanguage); - CPPUNIT_TEST(testDWordTrackNumber); - CPPUNIT_TEST(testSaveLargeValue); - CPPUNIT_TEST(testSavePicture); - CPPUNIT_TEST(testSaveMultiplePictures); - CPPUNIT_TEST(testProperties); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAudioProperties() - { - ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); - CPPUNIT_ASSERT_EQUAL(4, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->sampleRate()); - } - - void testRead() - { - ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); - CPPUNIT_ASSERT_EQUAL(String("test"), f.tag()->title()); - } - - void testSaveMultipleValues() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - ASF::File *f = new ASF::File(newname.c_str()); - ASF::AttributeList values; - values.append("Foo"); - values.append("Bar"); - f->tag()->attributeListMap()["WM/AlbumTitle"] = values; - f->save(); - delete f; - - f = new ASF::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(2, (int)f->tag()->attributeListMap()["WM/AlbumTitle"].size()); - delete f; - } - - void testDWordTrackNumber() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - ASF::File *f = new ASF::File(newname.c_str()); - CPPUNIT_ASSERT(!f->tag()->attributeListMap().contains("WM/TrackNumber")); - f->tag()->setAttribute("WM/TrackNumber", (unsigned int)(123)); - f->save(); - delete f; - - f = new ASF::File(newname.c_str()); - CPPUNIT_ASSERT(f->tag()->attributeListMap().contains("WM/TrackNumber")); - CPPUNIT_ASSERT_EQUAL(ASF::Attribute::DWordType, f->tag()->attributeListMap()["WM/TrackNumber"].front().type()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(123), f->tag()->track()); - f->tag()->setTrack(234); - f->save(); - delete f; - - f = new ASF::File(newname.c_str()); - CPPUNIT_ASSERT(f->tag()->attributeListMap().contains("WM/TrackNumber")); - CPPUNIT_ASSERT_EQUAL(ASF::Attribute::UnicodeType, f->tag()->attributeListMap()["WM/TrackNumber"].front().type()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(234), f->tag()->track()); - delete f; - } - - void testSaveStream() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - ASF::File *f = new ASF::File(newname.c_str()); - ASF::AttributeList values; - ASF::Attribute attr("Foo"); - attr.setStream(43); - values.append(attr); - f->tag()->attributeListMap()["WM/AlbumTitle"] = values; - f->save(); - delete f; - - f = new ASF::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(43, f->tag()->attributeListMap()["WM/AlbumTitle"][0].stream()); - delete f; - } - - void testSaveLanguage() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - ASF::File *f = new ASF::File(newname.c_str()); - ASF::AttributeList values; - ASF::Attribute attr("Foo"); - attr.setStream(32); - attr.setLanguage(56); - values.append(attr); - f->tag()->attributeListMap()["WM/AlbumTitle"] = values; - f->save(); - delete f; - - f = new ASF::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(32, f->tag()->attributeListMap()["WM/AlbumTitle"][0].stream()); - CPPUNIT_ASSERT_EQUAL(56, f->tag()->attributeListMap()["WM/AlbumTitle"][0].language()); - delete f; - } - - void testSaveLargeValue() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - ASF::File *f = new ASF::File(newname.c_str()); - ASF::AttributeList values; - ASF::Attribute attr(ByteVector(70000, 'x')); - values.append(attr); - f->tag()->attributeListMap()["WM/Blob"] = values; - f->save(); - delete f; - - f = new ASF::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(ByteVector(70000, 'x'), f->tag()->attributeListMap()["WM/Blob"][0].toByteVector()); - delete f; - } - - void testSavePicture() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - ASF::File *f = new ASF::File(newname.c_str()); - ASF::AttributeList values; - ASF::Picture picture; - picture.setMimeType("image/jpeg"); - picture.setType(ASF::Picture::FrontCover); - picture.setDescription("description"); - picture.setPicture("data"); - ASF::Attribute attr(picture); - values.append(attr); - f->tag()->attributeListMap()["WM/Picture"] = values; - f->save(); - delete f; - - f = new ASF::File(newname.c_str()); - ASF::AttributeList values2 = f->tag()->attributeListMap()["WM/Picture"]; - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), values2.size()); - ASF::Attribute attr2 = values2.front(); - ASF::Picture picture2 = attr2.toPicture(); - CPPUNIT_ASSERT(picture2.isValid()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), picture2.mimeType()); - CPPUNIT_ASSERT_EQUAL(ASF::Picture::FrontCover, picture2.type()); - CPPUNIT_ASSERT_EQUAL(String("description"), picture2.description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("data"), picture2.picture()); - delete f; - } - - void testSaveMultiplePictures() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - ASF::File *f = new ASF::File(newname.c_str()); - ASF::AttributeList values; - ASF::Picture picture; - picture.setMimeType("image/jpeg"); - picture.setType(ASF::Picture::FrontCover); - picture.setDescription("description"); - picture.setPicture("data"); - values.append(ASF::Attribute(picture)); - ASF::Picture picture2; - picture2.setMimeType("image/png"); - picture2.setType(ASF::Picture::BackCover); - picture2.setDescription("back cover"); - picture2.setPicture("PNG data"); - values.append(ASF::Attribute(picture2)); - f->tag()->attributeListMap()["WM/Picture"] = values; - f->save(); - delete f; - - f = new ASF::File(newname.c_str()); - ASF::AttributeList values2 = f->tag()->attributeListMap()["WM/Picture"]; - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), values2.size()); - ASF::Picture picture3 = values2[1].toPicture(); - CPPUNIT_ASSERT(picture3.isValid()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), picture3.mimeType()); - CPPUNIT_ASSERT_EQUAL(ASF::Picture::FrontCover, picture3.type()); - CPPUNIT_ASSERT_EQUAL(String("description"), picture3.description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("data"), picture3.picture()); - ASF::Picture picture4 = values2[0].toPicture(); - CPPUNIT_ASSERT(picture4.isValid()); - CPPUNIT_ASSERT_EQUAL(String("image/png"), picture4.mimeType()); - CPPUNIT_ASSERT_EQUAL(ASF::Picture::BackCover, picture4.type()); - CPPUNIT_ASSERT_EQUAL(String("back cover"), picture4.description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("PNG data"), picture4.picture()); - delete f; - } - - void testProperties() - { - ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); - - PropertyMap tags = f.properties(); - - tags["TRACKNUMBER"] = StringList("2"); - tags["DISCNUMBER"] = StringList("3"); - tags["BPM"] = StringList("123"); - tags["ARTIST"] = StringList("Foo Bar"); - f.setProperties(tags); - - tags = f.properties(); - - CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), tags["ARTIST"]); - - CPPUNIT_ASSERT(f.tag()->attributeListMap().contains("WM/BeatsPerMinute")); - CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/BeatsPerMinute"].size()); - CPPUNIT_ASSERT_EQUAL(String("123"), f.tag()->attributeListMap()["WM/BeatsPerMinute"].front().toString()); - CPPUNIT_ASSERT_EQUAL(StringList("123"), tags["BPM"]); - - CPPUNIT_ASSERT(f.tag()->attributeListMap().contains("WM/TrackNumber")); - CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/TrackNumber"].size()); - CPPUNIT_ASSERT_EQUAL(String("2"), f.tag()->attributeListMap()["WM/TrackNumber"].front().toString()); - CPPUNIT_ASSERT_EQUAL(StringList("2"), tags["TRACKNUMBER"]); - - CPPUNIT_ASSERT(f.tag()->attributeListMap().contains("WM/PartOfSet")); - CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/PartOfSet"].size()); - CPPUNIT_ASSERT_EQUAL(String("3"), f.tag()->attributeListMap()["WM/PartOfSet"].front().toString()); - CPPUNIT_ASSERT_EQUAL(StringList("3"), tags["DISCNUMBER"]); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestASF); diff --git a/src/taglib/tests/test_bytevector.cpp b/src/taglib/tests/test_bytevector.cpp deleted file mode 100644 index 9efd23a..0000000 --- a/src/taglib/tests/test_bytevector.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler <wheeler@kde.org> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <tbytevector.h> -#include <tbytevectorlist.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestByteVector : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestByteVector); - CPPUNIT_TEST(testByteVector); - CPPUNIT_TEST(testFind1); - CPPUNIT_TEST(testFind2); - CPPUNIT_TEST(testRfind1); - CPPUNIT_TEST(testRfind2); - CPPUNIT_TEST(testToHex); - CPPUNIT_TEST(testToUShort); - CPPUNIT_TEST(testReplace); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testConversion(unsigned int i, unsigned char a, unsigned char b, unsigned char c, unsigned char d) - { - ByteVector v(4, 0); - - v[3] = a; - v[2] = b; - v[1] = c; - v[0] = d; - CPPUNIT_ASSERT(v.toUInt(false) == i); - - v[0] = a; - v[1] = b; - v[2] = c; - v[3] = d; - CPPUNIT_ASSERT(v.toUInt() == i); - } - - void testByteVector() - { - ByteVector v("foobar"); - - CPPUNIT_ASSERT(v.find("ob") == 2); - CPPUNIT_ASSERT(v.find('b') == 3); - - ByteVector n(4, 0); - n[0] = 1; - CPPUNIT_ASSERT(n.toUInt(true) == 16777216); - CPPUNIT_ASSERT(n.toUInt(false) == 1); - CPPUNIT_ASSERT(ByteVector::fromUInt(16777216, true) == n); - CPPUNIT_ASSERT(ByteVector::fromUInt(1, false) == n); - - CPPUNIT_ASSERT(ByteVector::fromUInt(0xa0).toUInt() == 0xa0); - - testConversion(0x000000a0, 0x00, 0x00, 0x00, 0xa0); - testConversion(0xd50bf072, 0xd5, 0x0b, 0xf0, 0x72); - - ByteVector intVector(2, 0); - intVector[0] = char(0xfc); - intVector[1] = char(0x00); - CPPUNIT_ASSERT(intVector.toShort() == -1024); - intVector[0] = char(0x04); - intVector[1] = char(0x00); - CPPUNIT_ASSERT(intVector.toShort() == 1024); - - CPPUNIT_ASSERT(ByteVector::fromLongLong(1).toLongLong() == 1); - CPPUNIT_ASSERT(ByteVector::fromLongLong(0).toLongLong() == 0); - CPPUNIT_ASSERT(ByteVector::fromLongLong(0xffffffffffffffffLL).toLongLong() == -1); - CPPUNIT_ASSERT(ByteVector::fromLongLong(0xfffffffffffffffeLL).toLongLong() == -2); - CPPUNIT_ASSERT(ByteVector::fromLongLong(1024).toLongLong() == 1024); - - ByteVector a1("foo"); - a1.append("bar"); - CPPUNIT_ASSERT(a1 == "foobar"); - - ByteVector a2("foo"); - a2.append("b"); - CPPUNIT_ASSERT(a2 == "foob"); - - ByteVector a3; - a3.append("b"); - CPPUNIT_ASSERT(a3 == "b"); - - ByteVector s1("foo"); - CPPUNIT_ASSERT(ByteVectorList::split(s1, " ").size() == 1); - - ByteVector s2("f"); - CPPUNIT_ASSERT(ByteVectorList::split(s2, " ").size() == 1); - - CPPUNIT_ASSERT(ByteVector().size() == 0); - CPPUNIT_ASSERT(ByteVector("asdf").clear().size() == 0); - CPPUNIT_ASSERT(ByteVector("asdf").clear() == ByteVector()); - - ByteVector i("blah blah"); - ByteVector j("blah"); - CPPUNIT_ASSERT(i.containsAt(j, 5, 0)); - CPPUNIT_ASSERT(i.containsAt(j, 6, 1)); - CPPUNIT_ASSERT(i.containsAt(j, 6, 1, 3)); - } - - void testFind1() - { - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO")); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 0)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 1)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 2)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 3)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 4)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 5)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 6)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 7)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 8)); - } - - void testFind2() - { - CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01", 1).find("\x01")); - CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01\x02", 2).find("\x01\x02")); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01", 1).find("\x02")); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01\x02", 2).find("\x01\x03")); - } - - void testRfind1() - { - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 0)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 1)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 2)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 3)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 4)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 5)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 6)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 7)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 8)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS")); - } - - void testRfind2() - { - ByteVector r0("**************"); - ByteVector r1("OggS**********"); - ByteVector r2("**********OggS"); - ByteVector r3("OggS******OggS"); - ByteVector r4("OggS*OggS*OggS"); - - CPPUNIT_ASSERT_EQUAL(-1, r0.find("OggS")); - CPPUNIT_ASSERT_EQUAL(-1, r0.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(0, r1.find("OggS")); - CPPUNIT_ASSERT_EQUAL(0, r1.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r2.find("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r2.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(0, r3.find("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r3.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 0)); - CPPUNIT_ASSERT_EQUAL(5, r4.rfind("OggS", 7)); - CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 12)); - } - - void testToHex() - { - ByteVector v("\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f", 16); - - CPPUNIT_ASSERT_EQUAL(ByteVector("f0e1d2c3b4a5968778695a4b3c2d1e0f"), v.toHex()); - } - - void testToUShort() - { - CPPUNIT_ASSERT_EQUAL((unsigned short)0xFFFF, ByteVector("\xff\xff", 2).toUShort()); - CPPUNIT_ASSERT_EQUAL((unsigned short)0x0001, ByteVector("\x00\x01", 2).toUShort()); - CPPUNIT_ASSERT_EQUAL((unsigned short)0x0100, ByteVector("\x00\x01", 2).toUShort(false)); - CPPUNIT_ASSERT_EQUAL((unsigned short)0xFF01, ByteVector("\xFF\x01", 2).toUShort()); - CPPUNIT_ASSERT_EQUAL((unsigned short)0x01FF, ByteVector("\xFF\x01", 2).toUShort(false)); - } - - void testReplace() - { - { - ByteVector a("abcdabf"); - a.replace(ByteVector(""), ByteVector("<a>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("foobartoolong"), ByteVector("<a>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("xx"), ByteVector("yy")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("a"), ByteVector("x")); - CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("ab"), ByteVector("xy")); - CPPUNIT_ASSERT_EQUAL(ByteVector("xycdxyf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("a"), ByteVector("<a>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>bf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("ab"), ByteVector("x")); - CPPUNIT_ASSERT_EQUAL(ByteVector("xcdxf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("ab"), ByteVector()); - CPPUNIT_ASSERT_EQUAL(ByteVector("cdf"), a); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVector); diff --git a/src/taglib/tests/test_bytevectorlist.cpp b/src/taglib/tests/test_bytevectorlist.cpp deleted file mode 100644 index 7e4a9fd..0000000 --- a/src/taglib/tests/test_bytevectorlist.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include <tbytevector.h> -#include <tbytevectorlist.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestByteVectorList : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestByteVectorList); - CPPUNIT_TEST(testSplitSingleChar); - CPPUNIT_TEST(testSplitSingleChar_2); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testSplitSingleChar() - { - ByteVector v("a b"); - - ByteVectorList l = ByteVectorList::split(v, " "); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), l.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("a"), l[0]); - CPPUNIT_ASSERT_EQUAL(ByteVector("b"), l[1]); - } - - void testSplitSingleChar_2() - { - ByteVector v("a"); - - ByteVectorList l = ByteVectorList::split(v, " "); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), l.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("a"), l[0]); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVectorList); diff --git a/src/taglib/tests/test_bytevectorstream.cpp b/src/taglib/tests/test_bytevectorstream.cpp deleted file mode 100644 index b0fec90..0000000 --- a/src/taglib/tests/test_bytevectorstream.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include <tbytevectorstream.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestByteVectorStream : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestByteVectorStream); - CPPUNIT_TEST(testInitialData); - CPPUNIT_TEST(testWriteBlock); - CPPUNIT_TEST(testWriteBlockResize); - CPPUNIT_TEST(testReadBlock); - CPPUNIT_TEST(testRemoveBlock); - CPPUNIT_TEST(testInsert); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testInitialData() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), *stream.data()); - } - - void testWriteBlock() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - stream.seek(1); - stream.writeBlock(ByteVector("xx")); - CPPUNIT_ASSERT_EQUAL(ByteVector("axxd"), *stream.data()); - } - - void testWriteBlockResize() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - stream.seek(3); - stream.writeBlock(ByteVector("xx")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcxx"), *stream.data()); - stream.seek(5); - stream.writeBlock(ByteVector("yy")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcxxyy"), *stream.data()); - } - - void testReadBlock() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - CPPUNIT_ASSERT_EQUAL(ByteVector("a"), stream.readBlock(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("bc"), stream.readBlock(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("d"), stream.readBlock(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector::null, stream.readBlock(3)); - } - - void testRemoveBlock() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - stream.removeBlock(1, 1); - CPPUNIT_ASSERT_EQUAL(ByteVector("acd"), *stream.data()); - stream.removeBlock(0, 2); - CPPUNIT_ASSERT_EQUAL(ByteVector("d"), *stream.data()); - stream.removeBlock(0, 2); - CPPUNIT_ASSERT_EQUAL(ByteVector(""), *stream.data()); - } - - void testInsert() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - stream.insert(ByteVector("xx"), 1, 1); - CPPUNIT_ASSERT_EQUAL(ByteVector("axxcd"), *stream.data()); - stream.insert(ByteVector("yy"), 0, 2); - CPPUNIT_ASSERT_EQUAL(ByteVector("yyxcd"), *stream.data()); - stream.insert(ByteVector("foa"), 3, 2); - CPPUNIT_ASSERT_EQUAL(ByteVector("yyxfoa"), *stream.data()); - stream.insert(ByteVector("123"), 3, 0); - CPPUNIT_ASSERT_EQUAL(ByteVector("yyx123foa"), *stream.data()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVectorStream); diff --git a/src/taglib/tests/test_fileref.cpp b/src/taglib/tests/test_fileref.cpp deleted file mode 100644 index 197a921..0000000 --- a/src/taglib/tests/test_fileref.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <fileref.h> -#include <oggflacfile.h> -#include <vorbisfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestFileRef : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFileRef); - CPPUNIT_TEST(testASF); - CPPUNIT_TEST(testMusepack); - CPPUNIT_TEST(testVorbis); - CPPUNIT_TEST(testSpeex); - CPPUNIT_TEST(testFLAC); - CPPUNIT_TEST(testMP3); - CPPUNIT_TEST(testOGA_FLAC); - CPPUNIT_TEST(testOGA_Vorbis); - CPPUNIT_TEST(testMP4_1); - CPPUNIT_TEST(testMP4_2); - CPPUNIT_TEST(testMP4_3); - CPPUNIT_TEST(testTrueAudio); - CPPUNIT_TEST(testAPE); - CPPUNIT_TEST(testWav); - CPPUNIT_TEST(testUnsupported); - CPPUNIT_TEST_SUITE_END(); - -public: - - void fileRefSave(const string &filename, const string &ext) - { - ScopedFileCopy copy(filename, ext); - string newname = copy.fileName(); - - FileRef *f = new FileRef(newname.c_str()); - CPPUNIT_ASSERT(!f->isNull()); - f->tag()->setArtist("test artist"); - f->tag()->setTitle("test title"); - f->tag()->setGenre("Test!"); - f->tag()->setAlbum("albummmm"); - f->tag()->setTrack(5); - f->tag()->setYear(2020); - f->save(); - delete f; - - f = new FileRef(newname.c_str()); - CPPUNIT_ASSERT(!f->isNull()); - CPPUNIT_ASSERT_EQUAL(f->tag()->artist(), String("test artist")); - CPPUNIT_ASSERT_EQUAL(f->tag()->title(), String("test title")); - CPPUNIT_ASSERT_EQUAL(f->tag()->genre(), String("Test!")); - CPPUNIT_ASSERT_EQUAL(f->tag()->album(), String("albummmm")); - CPPUNIT_ASSERT_EQUAL(f->tag()->track(), TagLib::uint(5)); - CPPUNIT_ASSERT_EQUAL(f->tag()->year(), TagLib::uint(2020)); - f->tag()->setArtist("ttest artist"); - f->tag()->setTitle("ytest title"); - f->tag()->setGenre("uTest!"); - f->tag()->setAlbum("ialbummmm"); - f->tag()->setTrack(7); - f->tag()->setYear(2080); - f->save(); - delete f; - - f = new FileRef(newname.c_str()); - CPPUNIT_ASSERT(!f->isNull()); - CPPUNIT_ASSERT_EQUAL(f->tag()->artist(), String("ttest artist")); - CPPUNIT_ASSERT_EQUAL(f->tag()->title(), String("ytest title")); - CPPUNIT_ASSERT_EQUAL(f->tag()->genre(), String("uTest!")); - CPPUNIT_ASSERT_EQUAL(f->tag()->album(), String("ialbummmm")); - CPPUNIT_ASSERT_EQUAL(f->tag()->track(), TagLib::uint(7)); - CPPUNIT_ASSERT_EQUAL(f->tag()->year(), TagLib::uint(2080)); - delete f; - } - - void testMusepack() - { - fileRefSave("click", ".mpc"); - } - - void testASF() - { - fileRefSave("silence-1", ".wma"); - } - - void testVorbis() - { - fileRefSave("empty", ".ogg"); - } - - void testSpeex() - { - fileRefSave("empty", ".spx"); - } - - void testFLAC() - { - fileRefSave("no-tags", ".flac"); - } - - void testMP3() - { - fileRefSave("xing", ".mp3"); - } - - void testTrueAudio() - { - fileRefSave("empty", ".tta"); - } - - void testMP4_1() - { - fileRefSave("has-tags", ".m4a"); - } - - void testMP4_2() - { - fileRefSave("no-tags", ".m4a"); - } - - void testMP4_3() - { - fileRefSave("no-tags", ".3g2"); - } - - void testWav() - { - fileRefSave("empty", ".wav"); - } - - void testOGA_FLAC() - { - FileRef *f = new FileRef(TEST_FILE_PATH_C("empty_flac.oga")); - CPPUNIT_ASSERT(dynamic_cast<Ogg::Vorbis::File *>(f->file()) == NULL); - CPPUNIT_ASSERT(dynamic_cast<Ogg::FLAC::File *>(f->file()) != NULL); - } - - void testOGA_Vorbis() - { - FileRef *f = new FileRef(TEST_FILE_PATH_C("empty_vorbis.oga")); - CPPUNIT_ASSERT(dynamic_cast<Ogg::Vorbis::File *>(f->file()) != NULL); - CPPUNIT_ASSERT(dynamic_cast<Ogg::FLAC::File *>(f->file()) == NULL); - } - - void testAPE() - { - fileRefSave("mac-399", ".ape"); - } - - void testUnsupported() - { - FileRef f1(TEST_FILE_PATH_C("no-extension")); - CPPUNIT_ASSERT(f1.isNull()); - - FileRef f2(TEST_FILE_PATH_C("unsupported-extension.xxx")); - CPPUNIT_ASSERT(f2.isNull()); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFileRef); diff --git a/src/taglib/tests/test_flac.cpp b/src/taglib/tests/test_flac.cpp deleted file mode 100644 index caec715..0000000 --- a/src/taglib/tests/test_flac.cpp +++ /dev/null @@ -1,248 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <flacfile.h> -#include <xiphcomment.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestFLAC : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFLAC); - CPPUNIT_TEST(testSignature); - CPPUNIT_TEST(testMultipleCommentBlocks); - CPPUNIT_TEST(testReadPicture); - CPPUNIT_TEST(testAddPicture); - CPPUNIT_TEST(testReplacePicture); - CPPUNIT_TEST(testRemoveAllPictures); - CPPUNIT_TEST(testRepeatedSave); - CPPUNIT_TEST(testSaveMultipleValues); - CPPUNIT_TEST(testDict); - CPPUNIT_TEST(testInvalid); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testSignature() - { - FLAC::File f(TEST_FILE_PATH_C("no-tags.flac")); - CPPUNIT_ASSERT_EQUAL(ByteVector("a1b141f766e9849ac3db1030a20a3c77"), f.audioProperties()->signature().toHex()); - } - - void testMultipleCommentBlocks() - { - ScopedFileCopy copy("multiple-vc", ".flac"); - string newname = copy.fileName(); - - FLAC::File *f = new FLAC::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("Artist 1"), f->tag()->artist()); - f->tag()->setArtist("The Artist"); - f->save(); - delete f; - - f = new FLAC::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("The Artist"), f->tag()->artist()); - delete f; - } - - void testReadPicture() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - FLAC::File *f = new FLAC::File(newname.c_str()); - List<FLAC::Picture *> lst = f->pictureList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), lst.size()); - - FLAC::Picture *pic = lst.front(); - CPPUNIT_ASSERT_EQUAL(FLAC::Picture::FrontCover, pic->type()); - CPPUNIT_ASSERT_EQUAL(1, pic->width()); - CPPUNIT_ASSERT_EQUAL(1, pic->height()); - CPPUNIT_ASSERT_EQUAL(24, pic->colorDepth()); - CPPUNIT_ASSERT_EQUAL(0, pic->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/png"), pic->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic->description()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(150), pic->data().size()); - } - - void testAddPicture() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - FLAC::File *f = new FLAC::File(newname.c_str()); - List<FLAC::Picture *> lst = f->pictureList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), lst.size()); - - FLAC::Picture *newpic = new FLAC::Picture(); - newpic->setType(FLAC::Picture::BackCover); - newpic->setWidth(5); - newpic->setHeight(6); - newpic->setColorDepth(16); - newpic->setNumColors(7); - newpic->setMimeType("image/jpeg"); - newpic->setDescription("new image"); - newpic->setData("JPEG data"); - f->addPicture(newpic); - f->save(); - - f = new FLAC::File(newname.c_str()); - lst = f->pictureList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), lst.size()); - - FLAC::Picture *pic = lst[0]; - CPPUNIT_ASSERT_EQUAL(FLAC::Picture::FrontCover, pic->type()); - CPPUNIT_ASSERT_EQUAL(1, pic->width()); - CPPUNIT_ASSERT_EQUAL(1, pic->height()); - CPPUNIT_ASSERT_EQUAL(24, pic->colorDepth()); - CPPUNIT_ASSERT_EQUAL(0, pic->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/png"), pic->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic->description()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(150), pic->data().size()); - - pic = lst[1]; - CPPUNIT_ASSERT_EQUAL(FLAC::Picture::BackCover, pic->type()); - CPPUNIT_ASSERT_EQUAL(5, pic->width()); - CPPUNIT_ASSERT_EQUAL(6, pic->height()); - CPPUNIT_ASSERT_EQUAL(16, pic->colorDepth()); - CPPUNIT_ASSERT_EQUAL(7, pic->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), pic->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("new image"), pic->description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("JPEG data"), pic->data()); - } - - void testReplacePicture() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - FLAC::File *f = new FLAC::File(newname.c_str()); - List<FLAC::Picture *> lst = f->pictureList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), lst.size()); - - FLAC::Picture *newpic = new FLAC::Picture(); - newpic->setType(FLAC::Picture::BackCover); - newpic->setWidth(5); - newpic->setHeight(6); - newpic->setColorDepth(16); - newpic->setNumColors(7); - newpic->setMimeType("image/jpeg"); - newpic->setDescription("new image"); - newpic->setData("JPEG data"); - f->removePictures(); - f->addPicture(newpic); - f->save(); - - f = new FLAC::File(newname.c_str()); - lst = f->pictureList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), lst.size()); - - FLAC::Picture *pic = lst[0]; - CPPUNIT_ASSERT_EQUAL(FLAC::Picture::BackCover, pic->type()); - CPPUNIT_ASSERT_EQUAL(5, pic->width()); - CPPUNIT_ASSERT_EQUAL(6, pic->height()); - CPPUNIT_ASSERT_EQUAL(16, pic->colorDepth()); - CPPUNIT_ASSERT_EQUAL(7, pic->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), pic->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("new image"), pic->description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("JPEG data"), pic->data()); - } - - void testRemoveAllPictures() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - FLAC::File *f = new FLAC::File(newname.c_str()); - List<FLAC::Picture *> lst = f->pictureList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), lst.size()); - - f->removePictures(); - f->save(); - - f = new FLAC::File(newname.c_str()); - lst = f->pictureList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), lst.size()); - } - - void testRepeatedSave() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - FLAC::File *f = new FLAC::File(newname.c_str()); - Tag *tag = f->tag(); - CPPUNIT_ASSERT_EQUAL(String("Silence"), tag->title()); - tag->setTitle("NEW TITLE"); - f->save(); - CPPUNIT_ASSERT_EQUAL(String("NEW TITLE"), tag->title()); - tag->setTitle("NEW TITLE 2"); - f->save(); - CPPUNIT_ASSERT_EQUAL(String("NEW TITLE 2"), tag->title()); - - f = new FLAC::File(newname.c_str()); - tag = f->tag(); - CPPUNIT_ASSERT_EQUAL(String("NEW TITLE 2"), tag->title()); - } - - void testSaveMultipleValues() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - FLAC::File *f = new FLAC::File(newname.c_str()); - Ogg::XiphComment* c = f->xiphComment(true); - c->addField("ARTIST", "artist 1", true); - c->addField("ARTIST", "artist 2", false); - f->save(); - delete f; - - f = new FLAC::File(newname.c_str()); - c = f->xiphComment(true); - Ogg::FieldListMap m = c->fieldListMap(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), m["ARTIST"].size()); - CPPUNIT_ASSERT_EQUAL(String("artist 1"), m["ARTIST"][0]); - CPPUNIT_ASSERT_EQUAL(String("artist 2"), m["ARTIST"][1]); - } - - void testDict() - { - // test unicode & multiple values with dict interface - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - FLAC::File *f = new FLAC::File(newname.c_str()); - PropertyMap dict; - dict["ARTIST"].append("artøst 1"); - dict["ARTIST"].append("artöst 2"); - f->setProperties(dict); - f->save(); - delete f; - - f = new FLAC::File(newname.c_str()); - dict = f->properties(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), dict["ARTIST"].size()); - CPPUNIT_ASSERT_EQUAL(String("artøst 1"), dict["ARTIST"][0]); - CPPUNIT_ASSERT_EQUAL(String("artöst 2"), dict["ARTIST"][1]); - } - - void testInvalid() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - PropertyMap map; - map["HÄÖ"] = String("bla"); - FLAC::File f(copy.fileName().c_str()); - PropertyMap invalid = f.setProperties(map); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), invalid.size()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f.properties().size()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFLAC); diff --git a/src/taglib/tests/test_flacpicture.cpp b/src/taglib/tests/test_flacpicture.cpp deleted file mode 100644 index eefa930..0000000 --- a/src/taglib/tests/test_flacpicture.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <flacfile.h> -#include <flacmetadatablock.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestFLACPicture : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFLACPicture); - CPPUNIT_TEST(testParse); - CPPUNIT_TEST(testPassThrough); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testParse() - { - const unsigned char data[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x08, 0x41, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xD6, 0x0B, 0x1C, 0x0A, 0x36, 0x06, 0x08, 0x44, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x1D, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4D, 0x50, 0xEF, 0x64, 0x25, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x05, 0xFE, 0x02, 0xFE, 0xDC, 0xCC, 0x59, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; - const char *pdata = reinterpret_cast<const char*>(data); - - FLAC::Picture pic(ByteVector(pdata, 199)); - - CPPUNIT_ASSERT_EQUAL(3, int(pic.type())); - CPPUNIT_ASSERT_EQUAL(1, pic.width()); - CPPUNIT_ASSERT_EQUAL(1, pic.height()); - CPPUNIT_ASSERT_EQUAL(24, pic.colorDepth()); - CPPUNIT_ASSERT_EQUAL(0, pic.numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/png"), pic.mimeType()); - CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic.description()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(150), pic.data().size()); - } - - void testPassThrough() - { - const unsigned char data[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x08, 0x41, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xD6, 0x0B, 0x1C, 0x0A, 0x36, 0x06, 0x08, 0x44, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x1D, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4D, 0x50, 0xEF, 0x64, 0x25, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x05, 0xFE, 0x02, 0xFE, 0xDC, 0xCC, 0x59, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; - const char *pdata = reinterpret_cast<const char*>(data); - - FLAC::Picture pic(ByteVector(pdata, 199)); - CPPUNIT_ASSERT_EQUAL(ByteVector(pdata, 199), pic.render()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACPicture); - diff --git a/src/taglib/tests/test_flacunknownmetadatablock.cpp b/src/taglib/tests/test_flacunknownmetadatablock.cpp deleted file mode 100644 index 881078d..0000000 --- a/src/taglib/tests/test_flacunknownmetadatablock.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <flacunknownmetadatablock.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestFLACUnknownMetadataBlock : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFLACUnknownMetadataBlock); - CPPUNIT_TEST(testAccessors); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAccessors() - { - ByteVector data("abc\x01", 4); - FLAC::UnknownMetadataBlock block(42, data); - CPPUNIT_ASSERT_EQUAL(42, block.code()); - CPPUNIT_ASSERT_EQUAL(data, block.data()); - CPPUNIT_ASSERT_EQUAL(data, block.render()); - ByteVector data2("xxx", 3); - block.setCode(13); - block.setData(data2); - CPPUNIT_ASSERT_EQUAL(13, block.code()); - CPPUNIT_ASSERT_EQUAL(data2, block.data()); - CPPUNIT_ASSERT_EQUAL(data2, block.render()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACUnknownMetadataBlock); diff --git a/src/taglib/tests/test_id3v1.cpp b/src/taglib/tests/test_id3v1.cpp deleted file mode 100644 index 7db2dbb..0000000 --- a/src/taglib/tests/test_id3v1.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tstring.h> -#include <mpegfile.h> -#include <id3v1tag.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestID3v1 : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestID3v1); - CPPUNIT_TEST(testStripWhiteSpace); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testStripWhiteSpace() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - { - MPEG::File f(newname.c_str()); - f.ID3v1Tag(true)->setArtist("Artist "); - f.save(); - } - - { - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT(f.ID3v1Tag(false)); - CPPUNIT_ASSERT_EQUAL(String("Artist"), f.ID3v1Tag(false)->artist()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v1); diff --git a/src/taglib/tests/test_id3v2.cpp b/src/taglib/tests/test_id3v2.cpp deleted file mode 100644 index 9f5ffe0..0000000 --- a/src/taglib/tests/test_id3v2.cpp +++ /dev/null @@ -1,758 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string> -#include <stdio.h> -// so evil :( -#define protected public -#include <id3v2tag.h> -#include <mpegfile.h> -#include <id3v2frame.h> -#undef protected -#include <uniquefileidentifierframe.h> -#include <textidentificationframe.h> -#include <attachedpictureframe.h> -#include <unsynchronizedlyricsframe.h> -#include <generalencapsulatedobjectframe.h> -#include <relativevolumeframe.h> -#include <popularimeterframe.h> -#include <urllinkframe.h> -#include <ownershipframe.h> -#include <unknownframe.h> -#include <tdebug.h> -#include <tpropertymap.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class PublicFrame : public ID3v2::Frame -{ - public: - PublicFrame() : ID3v2::Frame(ByteVector("XXXX\0\0\0\0\0\0", 10)) {} - String readStringField(const ByteVector &data, String::Type encoding, - int *positon = 0) - { return ID3v2::Frame::readStringField(data, encoding, positon); } - virtual String toString() const { return String::null; } - virtual void parseFields(const ByteVector &) {} - virtual ByteVector renderFields() const { return ByteVector::null; } -}; - -class TestID3v2 : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestID3v2); - CPPUNIT_TEST(testUnsynchDecode); - CPPUNIT_TEST(testDowngradeUTF8ForID3v23); - CPPUNIT_TEST(testUTF16BEDelimiter); - CPPUNIT_TEST(testUTF16Delimiter); - CPPUNIT_TEST(testReadStringField); - CPPUNIT_TEST(testParseAPIC); - CPPUNIT_TEST(testParseAPIC_UTF16_BOM); - CPPUNIT_TEST(testParseAPICv22); - CPPUNIT_TEST(testDontRender22); - CPPUNIT_TEST(testParseGEOB); - CPPUNIT_TEST(testPOPMtoString); - CPPUNIT_TEST(testParsePOPM); - CPPUNIT_TEST(testParsePOPMWithoutCounter); - CPPUNIT_TEST(testRenderPOPM); - CPPUNIT_TEST(testPOPMFromFile); - CPPUNIT_TEST(testParseRelativeVolumeFrame); - CPPUNIT_TEST(testParseUniqueFileIdentifierFrame); - CPPUNIT_TEST(testParseEmptyUniqueFileIdentifierFrame); - CPPUNIT_TEST(testBrokenFrame1); - CPPUNIT_TEST(testItunes24FrameSize); - CPPUNIT_TEST(testParseUrlLinkFrame); - CPPUNIT_TEST(testRenderUrlLinkFrame); - CPPUNIT_TEST(testParseUserUrlLinkFrame); - CPPUNIT_TEST(testRenderUserUrlLinkFrame); - CPPUNIT_TEST(testParseOwnershipFrame); - CPPUNIT_TEST(testRenderOwnershipFrame); - CPPUNIT_TEST(testSaveUTF16Comment); - CPPUNIT_TEST(testUpdateGenre23_1); - CPPUNIT_TEST(testUpdateGenre23_2); - CPPUNIT_TEST(testUpdateGenre24); - CPPUNIT_TEST(testUpdateDate22); - CPPUNIT_TEST(testDowngradeTo23); - // CPPUNIT_TEST(testUpdateFullDate22); TODO TYE+TDA should be upgraded to TDRC together - CPPUNIT_TEST(testCompressedFrameWithBrokenLength); - CPPUNIT_TEST(testW000); - CPPUNIT_TEST(testPropertyInterface); - CPPUNIT_TEST(testPropertyInterface2); - CPPUNIT_TEST(testDeleteFrame); - CPPUNIT_TEST(testSaveAndStripID3v1ShouldNotAddFrameFromID3v1ToId3v2); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testUnsynchDecode() - { - MPEG::File f(TEST_FILE_PATH_C("unsynch.id3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT_EQUAL(String("My babe just cares for me"), f.tag()->title()); - } - - void testDowngradeUTF8ForID3v23() - { - ID3v2::TextIdentificationFrame f(ByteVector("TPE1"), String::UTF8); - StringList sl; - sl.append("Foo"); - f.setText(sl); - f.header()->setVersion(3); - ByteVector data = f.render(); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+6+2), data.size()); - ID3v2::TextIdentificationFrame f2(data); - CPPUNIT_ASSERT_EQUAL(sl, f2.fieldList()); - CPPUNIT_ASSERT_EQUAL(String::UTF16, f2.textEncoding()); - } - - void testUTF16BEDelimiter() - { - ID3v2::TextIdentificationFrame f(ByteVector("TPE1"), String::UTF16BE); - StringList sl; - sl.append("Foo"); - sl.append("Bar"); - f.setText(sl); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+6+2+6), f.render().size()); - } - - void testUTF16Delimiter() - { - ID3v2::TextIdentificationFrame f(ByteVector("TPE1"), String::UTF16); - StringList sl; - sl.append("Foo"); - sl.append("Bar"); - f.setText(sl); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+8+2+8), f.render().size()); - } - - void testBrokenFrame1() - { - MPEG::File f(TEST_FILE_PATH_C("broken-tenc.id3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT(!f.ID3v2Tag()->frameListMap().contains("TENC")); - } - - void testReadStringField() - { - PublicFrame f; - ByteVector data("abc\0", 4); - String str = f.readStringField(data, String::Latin1); - CPPUNIT_ASSERT_EQUAL(String("abc"), str); - } - - // http://bugs.kde.org/show_bug.cgi?id=151078 - void testParseAPIC() - { - ID3v2::AttachedPictureFrame f(ByteVector("APIC" - "\x00\x00\x00\x07" - "\x00\x00" - "\x00" - "m\x00" - "\x01" - "d\x00" - "\x00", 17)); - CPPUNIT_ASSERT_EQUAL(String("m"), f.mimeType()); - CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::FileIcon, f.type()); - CPPUNIT_ASSERT_EQUAL(String("d"), f.description()); - } - - void testParseAPIC_UTF16_BOM() - { - ID3v2::AttachedPictureFrame f(ByteVector( - "\x41\x50\x49\x43\x00\x02\x0c\x59\x00\x00\x01\x69\x6d\x61\x67\x65" - "\x2f\x6a\x70\x65\x67\x00\x00\xfe\xff\x00\x63\x00\x6f\x00\x76\x00" - "\x65\x00\x72\x00\x2e\x00\x6a\x00\x70\x00\x67\x00\x00\xff\xd8\xff", - 16 * 3)); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), f.mimeType()); - CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::Other, f.type()); - CPPUNIT_ASSERT_EQUAL(String("cover.jpg"), f.description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\xd8\xff", 3), f.picture()); - } - - void testParseAPICv22() - { - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("PIC" - "\x00\x00\x08" - "\x00" - "JPG" - "\x01" - "d\x00" - "\x00", 18); - ID3v2::AttachedPictureFrame *frame = - static_cast<TagLib::ID3v2::AttachedPictureFrame*>(factory->createFrame(data, TagLib::uint(2))); - - CPPUNIT_ASSERT(frame); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), frame->mimeType()); - CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::FileIcon, frame->type()); - CPPUNIT_ASSERT_EQUAL(String("d"), frame->description()); - } - - void testDontRender22() - { - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("FOO" - "\x00\x00\x08" - "\x00" - "JPG" - "\x01" - "d\x00" - "\x00", 18); - ID3v2::AttachedPictureFrame *frame = - static_cast<TagLib::ID3v2::AttachedPictureFrame*>(factory->createFrame(data, TagLib::uint(2))); - - CPPUNIT_ASSERT(frame); - - ID3v2::Tag tag; - tag.addFrame(frame); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1034), tag.render().size()); - } - - // http://bugs.kde.org/show_bug.cgi?id=151078 - void testParseGEOB() - { - ID3v2::GeneralEncapsulatedObjectFrame f(ByteVector("GEOB" - "\x00\x00\x00\x08" - "\x00\x00" - "\x00" - "m\x00" - "f\x00" - "d\x00" - "\x00", 18)); - CPPUNIT_ASSERT_EQUAL(String("m"), f.mimeType()); - CPPUNIT_ASSERT_EQUAL(String("f"), f.fileName()); - CPPUNIT_ASSERT_EQUAL(String("d"), f.description()); - } - - void testParsePOPM() - { - ID3v2::PopularimeterFrame f(ByteVector("POPM" - "\x00\x00\x00\x17" - "\x00\x00" - "email@example.com\x00" - "\x02" - "\x00\x00\x00\x03", 33)); - CPPUNIT_ASSERT_EQUAL(String("email@example.com"), f.email()); - CPPUNIT_ASSERT_EQUAL(2, f.rating()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), f.counter()); - } - - void testParsePOPMWithoutCounter() - { - ID3v2::PopularimeterFrame f(ByteVector("POPM" - "\x00\x00\x00\x13" - "\x00\x00" - "email@example.com\x00" - "\x02", 29)); - CPPUNIT_ASSERT_EQUAL(String("email@example.com"), f.email()); - CPPUNIT_ASSERT_EQUAL(2, f.rating()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f.counter()); - } - - void testRenderPOPM() - { - ID3v2::PopularimeterFrame f; - f.setEmail("email@example.com"); - f.setRating(2); - f.setCounter(3); - CPPUNIT_ASSERT_EQUAL( - ByteVector("POPM" - "\x00\x00\x00\x17" - "\x00\x00" - "email@example.com\x00" - "\x02" - "\x00\x00\x00\x03", 33), - f.render()); - } - - void testPOPMtoString() - { - ID3v2::PopularimeterFrame f; - f.setEmail("email@example.com"); - f.setRating(2); - f.setCounter(3); - CPPUNIT_ASSERT_EQUAL( - String("email@example.com rating=2 counter=3"), f.toString()); - } - - void testPOPMFromFile() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - ID3v2::PopularimeterFrame *f = new ID3v2::PopularimeterFrame(); - f->setEmail("email@example.com"); - f->setRating(200); - f->setCounter(3); - - MPEG::File foo(newname.c_str()); - foo.ID3v2Tag()->addFrame(f); - foo.save(); - - MPEG::File bar(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("email@example.com"), dynamic_cast<ID3v2::PopularimeterFrame *>(bar.ID3v2Tag()->frameList("POPM").front())->email()); - CPPUNIT_ASSERT_EQUAL(200, dynamic_cast<ID3v2::PopularimeterFrame *>(bar.ID3v2Tag()->frameList("POPM").front())->rating()); - } - - // http://bugs.kde.org/show_bug.cgi?id=150481 - void testParseRelativeVolumeFrame() - { - ID3v2::RelativeVolumeFrame f( - ByteVector("RVA2" // Frame ID - "\x00\x00\x00\x0B" // Frame size - "\x00\x00" // Frame flags - "ident\x00" // Identification - "\x02" // Type of channel - "\x00\x0F" // Volume adjustment - "\x08" // Bits representing peak - "\x45", 21)); // Peak volume - CPPUNIT_ASSERT_EQUAL(String("ident"), f.identification()); - CPPUNIT_ASSERT_EQUAL(15.0f / 512.0f, - f.volumeAdjustment(ID3v2::RelativeVolumeFrame::FrontRight)); - CPPUNIT_ASSERT_EQUAL((uchar)8, - f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).bitsRepresentingPeak); - CPPUNIT_ASSERT_EQUAL(ByteVector("\x45"), - f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).peakVolume); - } - - void testParseUniqueFileIdentifierFrame() - { - ID3v2::UniqueFileIdentifierFrame f( - ByteVector("UFID" // Frame ID - "\x00\x00\x00\x09" // Frame size - "\x00\x00" // Frame flags - "owner\x00" // Owner identifier - "\x00\x01\x02", 19)); // Identifier - CPPUNIT_ASSERT_EQUAL(String("owner"), - f.owner()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\x00\x01\x02", 3), - f.identifier()); - } - - void testParseEmptyUniqueFileIdentifierFrame() - { - ID3v2::UniqueFileIdentifierFrame f( - ByteVector("UFID" // Frame ID - "\x00\x00\x00\x01" // Frame size - "\x00\x00" // Frame flags - "\x00" // Owner identifier - "", 11)); // Identifier - CPPUNIT_ASSERT_EQUAL(String(), - f.owner()); - CPPUNIT_ASSERT_EQUAL(ByteVector(), - f.identifier()); - } - - void testParseUrlLinkFrame() - { - ID3v2::UrlLinkFrame f( - ByteVector("WOAF" // Frame ID - "\x00\x00\x00\x12" // Frame size - "\x00\x00" // Frame flags - "http://example.com", 28)); // URL - CPPUNIT_ASSERT_EQUAL(String("http://example.com"), f.url()); - } - - void testRenderUrlLinkFrame() - { - ID3v2::UrlLinkFrame f("WOAF"); - f.setUrl("http://example.com"); - CPPUNIT_ASSERT_EQUAL( - ByteVector("WOAF" // Frame ID - "\x00\x00\x00\x12" // Frame size - "\x00\x00" // Frame flags - "http://example.com", 28), // URL - f.render()); - } - - void testParseUserUrlLinkFrame() - { - ID3v2::UserUrlLinkFrame f( - ByteVector("WXXX" // Frame ID - "\x00\x00\x00\x17" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "foo\x00" // Description - "http://example.com", 33)); // URL - CPPUNIT_ASSERT_EQUAL(String("foo"), f.description()); - CPPUNIT_ASSERT_EQUAL(String("http://example.com"), f.url()); - } - - void testRenderUserUrlLinkFrame() - { - ID3v2::UserUrlLinkFrame f; - f.setDescription("foo"); - f.setUrl("http://example.com"); - CPPUNIT_ASSERT_EQUAL( - ByteVector("WXXX" // Frame ID - "\x00\x00\x00\x17" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "foo\x00" // Description - "http://example.com", 33), // URL - f.render()); - } - - void testParseOwnershipFrame() - { - ID3v2::OwnershipFrame f( - ByteVector("OWNE" // Frame ID - "\x00\x00\x00\x19" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "GBP1.99\x00" // Price paid - "20120905" // Date of purchase - "Beatport", 35)); // Seller - CPPUNIT_ASSERT_EQUAL(String("GBP1.99"), f.pricePaid()); - CPPUNIT_ASSERT_EQUAL(String("20120905"), f.datePurchased()); - CPPUNIT_ASSERT_EQUAL(String("Beatport"), f.seller()); - } - - void testRenderOwnershipFrame() - { - ID3v2::OwnershipFrame f; - f.setPricePaid("GBP1.99"); - f.setDatePurchased("20120905"); - f.setSeller("Beatport"); - CPPUNIT_ASSERT_EQUAL( - ByteVector("OWNE" // Frame ID - "\x00\x00\x00\x19" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "GBP1.99\x00" // Price paid - "20120905" // Date of purchase - "Beatport", 35), // URL - f.render()); - } - - void testItunes24FrameSize() - { - MPEG::File f(TEST_FILE_PATH_C("005411.id3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("TIT2")); - CPPUNIT_ASSERT_EQUAL(String("Sunshine Superman"), f.ID3v2Tag()->frameListMap()["TIT2"].front()->toString()); - } - - void testSaveUTF16Comment() - { - String::Type defaultEncoding = ID3v2::FrameFactory::instance()->defaultTextEncoding(); - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - ID3v2::FrameFactory::instance()->setDefaultTextEncoding(String::UTF16); - MPEG::File foo(newname.c_str()); - foo.strip(); - foo.tag()->setComment("Test comment!"); - foo.save(); - MPEG::File bar(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("Test comment!"), bar.tag()->comment()); - ID3v2::FrameFactory::instance()->setDefaultTextEncoding(defaultEncoding); - } - - void testUpdateGenre23_1() - { - // "Refinement" is the same as the ID3v1 genre - duplicate - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("TCON" // Frame ID - "\x00\x00\x00\x10" // Frame size - "\x00\x00" // Frame flags - "\x00" // Encoding - "(22)Death Metal", 26); // Text - ID3v2::TextIdentificationFrame *frame = - static_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, TagLib::uint(3))); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), frame->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("Death Metal"), frame->fieldList()[0]); - - ID3v2::Tag tag; - tag.addFrame(frame); - CPPUNIT_ASSERT_EQUAL(String("Death Metal"), tag.genre()); - } - - void testUpdateGenre23_2() - { - // "Refinement" is different from the ID3v1 genre - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("TCON" // Frame ID - "\x00\x00\x00\x13" // Frame size - "\x00\x00" // Frame flags - "\x00" // Encoding - "(4)Eurodisco", 23); // Text - ID3v2::TextIdentificationFrame *frame = - static_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, TagLib::uint(3))); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), frame->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("4"), frame->fieldList()[0]); - CPPUNIT_ASSERT_EQUAL(String("Eurodisco"), frame->fieldList()[1]); - - ID3v2::Tag tag; - tag.addFrame(frame); - CPPUNIT_ASSERT_EQUAL(String("Disco Eurodisco"), tag.genre()); - } - - void testUpdateGenre24() - { - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("TCON" // Frame ID - "\x00\x00\x00\x0D" // Frame size - "\x00\x00" // Frame flags - "\0" // Encoding - "14\0Eurodisco", 23); // Text - ID3v2::TextIdentificationFrame *frame = - static_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, TagLib::uint(4))); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), frame->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("14"), frame->fieldList()[0]); - CPPUNIT_ASSERT_EQUAL(String("Eurodisco"), frame->fieldList()[1]); - - ID3v2::Tag tag; - tag.addFrame(frame); - CPPUNIT_ASSERT_EQUAL(String("R&B Eurodisco"), tag.genre()); - } - - void testUpdateDate22() - { - MPEG::File f(TEST_FILE_PATH_C("id3v22-tda.mp3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2010), f.tag()->year()); - } - - void testUpdateFullDate22() - { - MPEG::File f(TEST_FILE_PATH_C("id3v22-tda.mp3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT_EQUAL(String("2010-04-03"), f.ID3v2Tag()->frameListMap()["TDRC"].front()->toString()); - } - - void testDowngradeTo23() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - ID3v2::TextIdentificationFrame *tf; - MPEG::File foo(newname.c_str()); - tf = new ID3v2::TextIdentificationFrame("TDOR", String::Latin1); - tf->setText("2011-03-16"); - foo.ID3v2Tag()->addFrame(tf); - tf = new ID3v2::TextIdentificationFrame("TDRC", String::Latin1); - tf->setText("2012-04-17T12:01"); - foo.ID3v2Tag()->addFrame(tf); - tf = new ID3v2::TextIdentificationFrame("TMCL", String::Latin1); - tf->setText(StringList().append("Guitar").append("Artist 1").append("Drums").append("Artist 2")); - foo.ID3v2Tag()->addFrame(tf); - tf = new ID3v2::TextIdentificationFrame("TIPL", String::Latin1); - tf->setText(StringList().append("Producer").append("Artist 3").append("Mastering").append("Artist 4")); - foo.ID3v2Tag()->addFrame(tf); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TDRL", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TDTG", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TMOO", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TPRO", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOA", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOT", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSST", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOP", String::Latin1)); - foo.save(MPEG::File::AllTags, true, 3); - - MPEG::File bar(newname.c_str()); - tf = static_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDOR").front()); - CPPUNIT_ASSERT(tf); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), tf->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("2011"), tf->fieldList().front()); - tf = static_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDRC").front()); - CPPUNIT_ASSERT(tf); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), tf->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("2012"), tf->fieldList().front()); - tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TIPL").front()); - CPPUNIT_ASSERT(tf); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(8), tf->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("Guitar"), tf->fieldList()[0]); - CPPUNIT_ASSERT_EQUAL(String("Artist 1"), tf->fieldList()[1]); - CPPUNIT_ASSERT_EQUAL(String("Drums"), tf->fieldList()[2]); - CPPUNIT_ASSERT_EQUAL(String("Artist 2"), tf->fieldList()[3]); - CPPUNIT_ASSERT_EQUAL(String("Producer"), tf->fieldList()[4]); - CPPUNIT_ASSERT_EQUAL(String("Artist 3"), tf->fieldList()[5]); - CPPUNIT_ASSERT_EQUAL(String("Mastering"), tf->fieldList()[6]); - CPPUNIT_ASSERT_EQUAL(String("Artist 4"), tf->fieldList()[7]); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TDRL")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TDTG")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TMOO")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TPRO")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOA")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOT")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSST")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOP")); - } - - void testCompressedFrameWithBrokenLength() - { - MPEG::File f(TEST_FILE_PATH_C("compressed_id3_frame.mp3"), false); - CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("APIC")); - -#ifdef HAVE_ZLIB - - ID3v2::AttachedPictureFrame *frame - = dynamic_cast<TagLib::ID3v2::AttachedPictureFrame*>(f.ID3v2Tag()->frameListMap()["APIC"].front()); - CPPUNIT_ASSERT(frame); - CPPUNIT_ASSERT_EQUAL(String("image/bmp"), frame->mimeType()); - CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::Other, frame->type()); - CPPUNIT_ASSERT_EQUAL(String(""), frame->description()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(86414), frame->picture().size()); - -#else - - // Skip the test if ZLIB is not installed. - // The message "Compressed frames are currently not supported." will be displayed. - - ID3v2::UnknownFrame *frame - = dynamic_cast<TagLib::ID3v2::UnknownFrame*>(f.ID3v2Tag()->frameListMap()["APIC"].front()); - CPPUNIT_ASSERT(frame); - -#endif - } - - void testW000() - { - MPEG::File f(TEST_FILE_PATH_C("w000.mp3"), false); - CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("W000")); - ID3v2::UrlLinkFrame *frame = - dynamic_cast<TagLib::ID3v2::UrlLinkFrame*>(f.ID3v2Tag()->frameListMap()["W000"].front()); - CPPUNIT_ASSERT(frame); - CPPUNIT_ASSERT_EQUAL(String("lukas.lalinsky@example.com____"), frame->url()); - } - - void testPropertyInterface() - { - ScopedFileCopy copy("rare_frames", ".mp3"); - string newname = copy.fileName(); - MPEG::File f(newname.c_str()); - PropertyMap dict = f.ID3v2Tag(false)->properties(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(6), dict.size()); - - CPPUNIT_ASSERT(dict.contains("USERTEXTDESCRIPTION1")); - CPPUNIT_ASSERT(dict.contains("QuodLibet::USERTEXTDESCRIPTION2")); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), dict["USERTEXTDESCRIPTION1"].size()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), dict["QuodLibet::USERTEXTDESCRIPTION2"].size()); - CPPUNIT_ASSERT_EQUAL(String("userTextData1"), dict["USERTEXTDESCRIPTION1"][0]); - CPPUNIT_ASSERT_EQUAL(String("userTextData2"), dict["USERTEXTDESCRIPTION1"][1]); - CPPUNIT_ASSERT_EQUAL(String("userTextData1"), dict["QuodLibet::USERTEXTDESCRIPTION2"][0]); - CPPUNIT_ASSERT_EQUAL(String("userTextData2"), dict["QuodLibet::USERTEXTDESCRIPTION2"][1]); - - CPPUNIT_ASSERT_EQUAL(String("Pop"), dict["GENRE"].front()); - - CPPUNIT_ASSERT_EQUAL(String("http://a.user.url"), dict["URL:USERURL"].front()); - - CPPUNIT_ASSERT_EQUAL(String("http://a.user.url/with/empty/description"), dict["URL"].front()); - CPPUNIT_ASSERT_EQUAL(String("A COMMENT"), dict["COMMENT"].front()); - - CPPUNIT_ASSERT_EQUAL(1u, dict.unsupportedData().size()); - CPPUNIT_ASSERT_EQUAL(String("UFID/supermihi@web.de"), dict.unsupportedData().front()); - } - - void testPropertyInterface2() - { - ID3v2::Tag tag; - ID3v2::UnsynchronizedLyricsFrame *frame1 = new ID3v2::UnsynchronizedLyricsFrame(); - frame1->setDescription("test"); - frame1->setText("la-la-la test"); - tag.addFrame(frame1); - - ID3v2::UnsynchronizedLyricsFrame *frame2 = new ID3v2::UnsynchronizedLyricsFrame(); - frame2->setDescription(""); - frame2->setText("la-la-la nodescription"); - tag.addFrame(frame2); - - ID3v2::AttachedPictureFrame *frame3 = new ID3v2::AttachedPictureFrame(); - frame3->setDescription("test picture"); - tag.addFrame(frame3); - - ID3v2::TextIdentificationFrame *frame4 = new ID3v2::TextIdentificationFrame("TIPL"); - frame4->setText("single value is invalid for TIPL"); - tag.addFrame(frame4); - - ID3v2::TextIdentificationFrame *frame5 = new ID3v2::TextIdentificationFrame("TMCL"); - StringList tmclData; - tmclData.append("VIOLIN"); - tmclData.append("a violinist"); - tmclData.append("PIANO"); - tmclData.append("a pianist"); - frame5->setText(tmclData); - tag.addFrame(frame5); - - ID3v2::UniqueFileIdentifierFrame *frame6 = new ID3v2::UniqueFileIdentifierFrame("http://musicbrainz.org", "152454b9-19ba-49f3-9fc9-8fc26545cf41"); - tag.addFrame(frame6); - - ID3v2::UniqueFileIdentifierFrame *frame7 = new ID3v2::UniqueFileIdentifierFrame("http://example.com", "123"); - tag.addFrame(frame7); - - ID3v2::UserTextIdentificationFrame *frame8 = new ID3v2::UserTextIdentificationFrame(); - frame8->setDescription("MusicBrainz Album Id"); - frame8->setText("95c454a5-d7e0-4d8f-9900-db04aca98ab3"); - tag.addFrame(frame8); - - PropertyMap properties = tag.properties(); - - CPPUNIT_ASSERT_EQUAL(3u, properties.unsupportedData().size()); - CPPUNIT_ASSERT(properties.unsupportedData().contains("TIPL")); - CPPUNIT_ASSERT(properties.unsupportedData().contains("APIC")); - CPPUNIT_ASSERT(properties.unsupportedData().contains("UFID/http://example.com")); - - CPPUNIT_ASSERT(properties.contains("PERFORMER:VIOLIN")); - CPPUNIT_ASSERT(properties.contains("PERFORMER:PIANO")); - CPPUNIT_ASSERT_EQUAL(String("a violinist"), properties["PERFORMER:VIOLIN"].front()); - CPPUNIT_ASSERT_EQUAL(String("a pianist"), properties["PERFORMER:PIANO"].front()); - - CPPUNIT_ASSERT(properties.contains("LYRICS")); - CPPUNIT_ASSERT(properties.contains("LYRICS:TEST")); - - CPPUNIT_ASSERT(properties.contains("MUSICBRAINZ_TRACKID")); - CPPUNIT_ASSERT_EQUAL(String("152454b9-19ba-49f3-9fc9-8fc26545cf41"), properties["MUSICBRAINZ_TRACKID"].front()); - - CPPUNIT_ASSERT(properties.contains("MUSICBRAINZ_ALBUMID")); - CPPUNIT_ASSERT_EQUAL(String("95c454a5-d7e0-4d8f-9900-db04aca98ab3"), properties["MUSICBRAINZ_ALBUMID"].front()); - - tag.removeUnsupportedProperties(properties.unsupportedData()); - CPPUNIT_ASSERT(tag.frameList("APIC").isEmpty()); - CPPUNIT_ASSERT(tag.frameList("TIPL").isEmpty()); - CPPUNIT_ASSERT_EQUAL((ID3v2::UniqueFileIdentifierFrame *)0, ID3v2::UniqueFileIdentifierFrame::findByOwner(&tag, "http://example.com")); - CPPUNIT_ASSERT_EQUAL(frame6, ID3v2::UniqueFileIdentifierFrame::findByOwner(&tag, "http://musicbrainz.org")); - } - - void testDeleteFrame() - { - ScopedFileCopy copy("rare_frames", ".mp3"); - string newname = copy.fileName(); - MPEG::File f(newname.c_str()); - ID3v2::Tag *t = f.ID3v2Tag(); - ID3v2::Frame *frame = t->frameList("TCON")[0]; - CPPUNIT_ASSERT_EQUAL(1u, t->frameList("TCON").size()); - t->removeFrame(frame, true); - f.save(MPEG::File::ID3v2); - - MPEG::File f2(newname.c_str()); - t = f2.ID3v2Tag(); - CPPUNIT_ASSERT(t->frameList("TCON").isEmpty()); - } - - void testSaveAndStripID3v1ShouldNotAddFrameFromID3v1ToId3v2() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - { - MPEG::File foo(newname.c_str()); - foo.tag()->setArtist("Artist"); - foo.save(MPEG::File::ID3v1 | MPEG::File::ID3v2); - } - - { - MPEG::File bar(newname.c_str()); - bar.ID3v2Tag()->removeFrames("TPE1"); - // Should strip ID3v1 here and not add old values to ID3v2 again - bar.save(MPEG::File::ID3v2, true); - } - - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT(!f.ID3v2Tag()->frameListMap().contains("TPE1")); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2); diff --git a/src/taglib/tests/test_info.cpp b/src/taglib/tests/test_info.cpp deleted file mode 100644 index 8e0d715..0000000 --- a/src/taglib/tests/test_info.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include <string> -#include <stdio.h> -#include <infotag.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestInfoTag : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestInfoTag); - CPPUNIT_TEST(testTitle); - CPPUNIT_TEST(testNumericFields); - CPPUNIT_TEST_SUITE_END(); - -public: - void testTitle() - { - RIFF::Info::Tag tag; - - CPPUNIT_ASSERT_EQUAL(String(""), tag.title()); - tag.setTitle("Test title 1"); - tag.setFieldText("TEST", "Dummy Text"); - - CPPUNIT_ASSERT_EQUAL(String("Test title 1"), tag.title()); - - RIFF::Info::FieldListMap map = tag.fieldListMap(); - CPPUNIT_ASSERT_EQUAL(String("Test title 1"), map["INAM"]); - CPPUNIT_ASSERT_EQUAL(String("Dummy Text"), map["TEST"]); - } - - void testNumericFields() - { - RIFF::Info::Tag tag; - - CPPUNIT_ASSERT_EQUAL((uint)0, tag.track()); - tag.setTrack(1234); - CPPUNIT_ASSERT_EQUAL((uint)1234, tag.track()); - CPPUNIT_ASSERT_EQUAL(String("1234"), tag.fieldText("IPRT")); - - CPPUNIT_ASSERT_EQUAL((uint)0, tag.year()); - tag.setYear(1234); - CPPUNIT_ASSERT_EQUAL((uint)1234, tag.year()); - CPPUNIT_ASSERT_EQUAL(String("1234"), tag.fieldText("ICRD")); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestInfoTag); diff --git a/src/taglib/tests/test_it.cpp b/src/taglib/tests/test_it.cpp deleted file mode 100644 index be5680e..0000000 --- a/src/taglib/tests/test_it.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include <itfile.h> -#include <tstringlist.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; -using TagLib::uint; - -static const String titleBefore("test song name"); -static const String titleAfter("changed title"); - -static const String commentBefore( - "This is a sample name.\n" - "In module file formats\n" - "sample names are abused\n" - "as multiline comments.\n" - " "); - -static const String newComment( - "This is a sample name!\n" - "In module file formats\n" - "sample names are abused\n" - "as multiline comments.\n" - "-----------------------------------\n" - "The previous line is truncated but starting with this line\n" - "the comment is not limeted in the line length but to 8000\n" - "additional characters (bytes).\n" - "\n" - "This is because it is saved in the 'message' proportion of\n" - "IT files."); - -static const String commentAfter( - "This is a sample name!\n" - "In module file formats\n" - "sample names are abused\n" - "as multiline comments.\n" - "-------------------------\n" - "The previous line is truncated but starting with this line\n" - "the comment is not limeted in the line length but to 8000\n" - "additional characters (bytes).\n" - "\n" - "This is because it is saved in the 'message' proportion of\n" - "IT files."); - -class TestIT : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestIT); - CPPUNIT_TEST(testReadTags); - CPPUNIT_TEST(testWriteTags); - CPPUNIT_TEST_SUITE_END(); - -public: - void testReadTags() - { - testRead(TEST_FILE_PATH_C("test.it"), titleBefore, commentBefore); - } - - void testWriteTags() - { - ScopedFileCopy copy("test", ".it"); - { - IT::File file(copy.fileName().c_str()); - CPPUNIT_ASSERT(file.tag() != 0); - file.tag()->setTitle(titleAfter); - file.tag()->setComment(newComment); - file.tag()->setTrackerName("won't be saved"); - CPPUNIT_ASSERT(file.save()); - } - testRead(copy.fileName().c_str(), titleAfter, commentAfter); - } - -private: - void testRead(FileName fileName, const String &title, const String &comment) - { - IT::File file(fileName); - - CPPUNIT_ASSERT(file.isValid()); - - IT::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL( 0, p->length()); - CPPUNIT_ASSERT_EQUAL( 0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL( 0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(64, p->channels()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 0, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL(true, p->stereo()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 0, p->instrumentCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 5, p->sampleCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 1, p->patternCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort)535, p->version()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort)532, p->compatibleVersion()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 9, p->flags()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar)128, p->globalVolume()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar) 48, p->mixVolume()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar)125, p->tempo()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar) 6, p->bpmSpeed()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar)128, p->panningSeparation()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar) 0, p->pitchWheelDepth()); - CPPUNIT_ASSERT_EQUAL(title, t->title()); - CPPUNIT_ASSERT_EQUAL(String::null, t->artist()); - CPPUNIT_ASSERT_EQUAL(String::null, t->album()); - CPPUNIT_ASSERT_EQUAL(comment, t->comment()); - CPPUNIT_ASSERT_EQUAL(String::null, t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(String("Impulse Tracker"), t->trackerName()); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestIT); diff --git a/src/taglib/tests/test_list.cpp b/src/taglib/tests/test_list.cpp deleted file mode 100644 index 39cbaf0..0000000 --- a/src/taglib/tests/test_list.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler <wheeler@kde.org> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <cppunit/extensions/HelperMacros.h> -#include <tlist.h> - -using namespace std; -using namespace TagLib; - -class TestList : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestList); - CPPUNIT_TEST(testList); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testList() - { - List<int> l1; - List<int> l2; - List<int> l3; - l1.append(2); - l2.append(3); - l2.append(4); - l1.append(l2); - l1.prepend(1); - l3.append(1); - l3.append(2); - l3.append(3); - l3.append(4); - CPPUNIT_ASSERT(l1 == l3); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestList); diff --git a/src/taglib/tests/test_map.cpp b/src/taglib/tests/test_map.cpp deleted file mode 100644 index b6f77aa..0000000 --- a/src/taglib/tests/test_map.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include <cppunit/extensions/HelperMacros.h> -#include <tstring.h> -#include <tmap.h> - -using namespace std; -using namespace TagLib; - -class TestMap : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMap); - CPPUNIT_TEST(testInsert); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testInsert() - { - Map<String, int> m; - m.insert("foo", 3); - CPPUNIT_ASSERT_EQUAL(3, m["foo"]); - m.insert("foo", 7); - CPPUNIT_ASSERT_EQUAL(7, m["foo"]); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMap); diff --git a/src/taglib/tests/test_mod.cpp b/src/taglib/tests/test_mod.cpp deleted file mode 100644 index 0a233c9..0000000 --- a/src/taglib/tests/test_mod.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include <modfile.h> -#include <tpropertymap.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -static const String titleBefore("title of song"); -static const String titleAfter("changed title"); - -static const String commentBefore( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "-+-+-+-+-+-+-+-+-+-+-+\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - -static const String newComment( - "This line will be truncated because it is too long for a mod instrument name.\n" - "This line is ok."); - -static const String commentAfter( - "This line will be trun\n" - "This line is ok.\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - -class TestMod : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMod); - CPPUNIT_TEST(testReadTags); - CPPUNIT_TEST(testWriteTags); - CPPUNIT_TEST(testPropertyInterface); - CPPUNIT_TEST_SUITE_END(); - -public: - void testReadTags() - { - testRead(TEST_FILE_PATH_C("test.mod"), titleBefore, commentBefore); - } - - void testWriteTags() - { - ScopedFileCopy copy("test", ".mod"); - { - Mod::File file(copy.fileName().c_str()); - CPPUNIT_ASSERT(file.tag() != 0); - file.tag()->setTitle(titleAfter); - file.tag()->setComment(newComment); - CPPUNIT_ASSERT(file.save()); - } - testRead(copy.fileName().c_str(), titleAfter, commentAfter); - CPPUNIT_ASSERT(fileEqual( - copy.fileName(), - TEST_FILE_PATH_C("changed.mod"))); - } - - void testPropertyInterface() - { - Mod::Tag t; - PropertyMap properties; - properties["BLA"] = String("bla"); - properties["ARTIST"] = String("artist1"); - properties["ARTIST"].append("artist2"); - properties["TITLE"] = String("title"); - - PropertyMap unsupported = t.setProperties(properties); - CPPUNIT_ASSERT(unsupported.contains("BLA")); - CPPUNIT_ASSERT(unsupported.contains("ARTIST")); - CPPUNIT_ASSERT_EQUAL(properties["ARTIST"], unsupported["ARTIST"]); - CPPUNIT_ASSERT(!unsupported.contains("TITLE")); - } - -private: - void testRead(FileName fileName, const String &title, const String &comment) - { - Mod::File file(fileName); - - CPPUNIT_ASSERT(file.isValid()); - - Mod::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL(0, p->length()); - CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(8, p->channels()); - CPPUNIT_ASSERT_EQUAL(31U, p->instrumentCount()); - CPPUNIT_ASSERT_EQUAL((uchar)1, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL(title, t->title()); - CPPUNIT_ASSERT_EQUAL(String::null, t->artist()); - CPPUNIT_ASSERT_EQUAL(String::null, t->album()); - CPPUNIT_ASSERT_EQUAL(comment, t->comment()); - CPPUNIT_ASSERT_EQUAL(String::null, t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(String("StarTrekker"), t->trackerName()); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMod); diff --git a/src/taglib/tests/test_mp4.cpp b/src/taglib/tests/test_mp4.cpp deleted file mode 100644 index 56b6052..0000000 --- a/src/taglib/tests/test_mp4.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <mp4tag.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <mp4atom.h> -#include <mp4file.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMP4 : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMP4); - CPPUNIT_TEST(testPropertiesAAC); - CPPUNIT_TEST(testPropertiesALAC); - CPPUNIT_TEST(testFreeForm); - CPPUNIT_TEST(testCheckValid); - CPPUNIT_TEST(testUpdateStco); - CPPUNIT_TEST(testSaveExisingWhenIlstIsLast); - CPPUNIT_TEST(test64BitAtom); - CPPUNIT_TEST(testGnre); - CPPUNIT_TEST(testCovrRead); - CPPUNIT_TEST(testCovrWrite); - CPPUNIT_TEST(testCovrRead2); - CPPUNIT_TEST(testProperties); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testPropertiesAAC() - { - MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, ((MP4::Properties *)f.audioProperties())->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, ((MP4::Properties *)f.audioProperties())->codec()); - } - - void testPropertiesALAC() - { - MP4::File f(TEST_FILE_PATH_C("empty_alac.m4a")); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, ((MP4::Properties *)f.audioProperties())->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(MP4::Properties::ALAC, ((MP4::Properties *)f.audioProperties())->codec()); - } - - void testCheckValid() - { - MP4::File f(TEST_FILE_PATH_C("empty.aiff")); - CPPUNIT_ASSERT(!f.isValid()); - MP4::File f2(TEST_FILE_PATH_C("has-tags.m4a")); - CPPUNIT_ASSERT(f2.isValid()); - } - - void testUpdateStco() - { - ScopedFileCopy copy("no-tags", ".3g2"); - string filename = copy.fileName(); - - MP4::File *f = new MP4::File(filename.c_str()); - f->tag()->setArtist(ByteVector(3000, 'x')); - - ByteVectorList data1; - { - MP4::Atoms a(f); - MP4::Atom *stco = a.find("moov")->findall("stco", true)[0]; - f->seek(stco->offset + 12); - ByteVector data = f->readBlock(stco->length - 12); - unsigned int count = data.mid(0, 4).toUInt(); - int pos = 4; - while (count--) { - unsigned int offset = data.mid(pos, 4).toUInt(); - f->seek(offset); - data1.append(f->readBlock(20)); - pos += 4; - } - } - - f->save(); - delete f; - f = new MP4::File(filename.c_str()); - - { - MP4::Atoms a(f); - MP4::Atom *stco = a.find("moov")->findall("stco", true)[0]; - f->seek(stco->offset + 12); - ByteVector data = f->readBlock(stco->length - 12); - unsigned int count = data.mid(0, 4).toUInt(); - int pos = 4, i = 0; - while (count--) { - unsigned int offset = data.mid(pos, 4).toUInt(); - f->seek(offset); - CPPUNIT_ASSERT_EQUAL(data1[i], f->readBlock(20)); - pos += 4; - i++; - } - } - - delete f; - } - - void testFreeForm() - { - ScopedFileCopy copy("has-tags", ".m4a"); - string filename = copy.fileName(); - - MP4::File *f = new MP4::File(filename.c_str()); - CPPUNIT_ASSERT(f->tag()->itemListMap().contains("----:com.apple.iTunes:iTunNORM")); - f->tag()->itemListMap()["----:org.kde.TagLib:Foo"] = StringList("Bar"); - f->save(); - delete f; - - f = new MP4::File(filename.c_str()); - CPPUNIT_ASSERT(f->tag()->itemListMap().contains("----:org.kde.TagLib:Foo")); - CPPUNIT_ASSERT_EQUAL(String("Bar"), f->tag()->itemListMap()["----:org.kde.TagLib:Foo"].toStringList()[0]); - f->save(); - delete f; - } - - void testSaveExisingWhenIlstIsLast() - { - ScopedFileCopy copy("ilst-is-last", ".m4a"); - string filename = copy.fileName(); - - MP4::File *f = new MP4::File(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(String("82,164"), f->tag()->itemListMap()["----:com.apple.iTunes:replaygain_track_minmax"].toStringList()[0]); - CPPUNIT_ASSERT_EQUAL(String("Pearl Jam"), f->tag()->artist()); - f->tag()->setComment("foo"); - f->save(); - delete f; - - f = new MP4::File(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(String("82,164"), f->tag()->itemListMap()["----:com.apple.iTunes:replaygain_track_minmax"].toStringList()[0]); - CPPUNIT_ASSERT_EQUAL(String("Pearl Jam"), f->tag()->artist()); - CPPUNIT_ASSERT_EQUAL(String("foo"), f->tag()->comment()); - } - - void test64BitAtom() - { - ScopedFileCopy copy("64bit", ".mp4"); - string filename = copy.fileName(); - - MP4::File *f = new MP4::File(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(true, f->tag()->itemListMap()["cpil"].toBool()); - - MP4::Atoms *atoms = new MP4::Atoms(f); - MP4::Atom *moov = atoms->atoms[0]; - CPPUNIT_ASSERT_EQUAL(long(77), moov->length); - - f->tag()->itemListMap()["pgap"] = true; - f->save(); - - f = new MP4::File(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(true, f->tag()->itemListMap()["cpil"].toBool()); - CPPUNIT_ASSERT_EQUAL(true, f->tag()->itemListMap()["pgap"].toBool()); - - atoms = new MP4::Atoms(f); - moov = atoms->atoms[0]; - // original size + 'pgap' size + padding - CPPUNIT_ASSERT_EQUAL(long(77 + 25 + 974), moov->length); - } - - void testGnre() - { - MP4::File *f = new MP4::File(TEST_FILE_PATH_C("gnre.m4a")); - CPPUNIT_ASSERT_EQUAL(TagLib::String("Ska"), f->tag()->genre()); - delete f; - } - - void testCovrRead() - { - MP4::File *f = new MP4::File(TEST_FILE_PATH_C("has-tags.m4a")); - CPPUNIT_ASSERT(f->tag()->itemListMap().contains("covr")); - MP4::CoverArtList l = f->tag()->itemListMap()["covr"].toCoverArtList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), l.size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(79), l[0].data().size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(287), l[1].data().size()); - delete f; - } - - void testCovrWrite() - { - ScopedFileCopy copy("has-tags", ".m4a"); - string filename = copy.fileName(); - - MP4::File *f = new MP4::File(filename.c_str()); - CPPUNIT_ASSERT(f->tag()->itemListMap().contains("covr")); - MP4::CoverArtList l = f->tag()->itemListMap()["covr"].toCoverArtList(); - l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); - f->tag()->itemListMap()["covr"] = l; - f->save(); - delete f; - - f = new MP4::File(filename.c_str()); - CPPUNIT_ASSERT(f->tag()->itemListMap().contains("covr")); - l = f->tag()->itemListMap()["covr"].toCoverArtList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), l.size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(79), l[0].data().size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(287), l[1].data().size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[2].format()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), l[2].data().size()); - delete f; - } - - void testCovrRead2() - { - MP4::File *f = new MP4::File(TEST_FILE_PATH_C("covr-junk.m4a")); - CPPUNIT_ASSERT(f->tag()->itemListMap().contains("covr")); - MP4::CoverArtList l = f->tag()->itemListMap()["covr"].toCoverArtList(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), l.size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(79), l[0].data().size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(287), l[1].data().size()); - delete f; - } - - void testProperties() - { - MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); - - PropertyMap tags = f.properties(); - - CPPUNIT_ASSERT_EQUAL(StringList("Test Artist"), tags["ARTIST"]); - - tags["TRACKNUMBER"] = StringList("2/4"); - tags["DISCNUMBER"] = StringList("3/5"); - tags["BPM"] = StringList("123"); - tags["ARTIST"] = StringList("Foo Bar"); - tags["COMPILATION"] = StringList("1"); - f.setProperties(tags); - - tags = f.properties(); - - CPPUNIT_ASSERT(f.tag()->itemListMap().contains("trkn")); - CPPUNIT_ASSERT_EQUAL(2, f.tag()->itemListMap()["trkn"].toIntPair().first); - CPPUNIT_ASSERT_EQUAL(4, f.tag()->itemListMap()["trkn"].toIntPair().second); - CPPUNIT_ASSERT_EQUAL(StringList("2/4"), tags["TRACKNUMBER"]); - - CPPUNIT_ASSERT(f.tag()->itemListMap().contains("disk")); - CPPUNIT_ASSERT_EQUAL(3, f.tag()->itemListMap()["disk"].toIntPair().first); - CPPUNIT_ASSERT_EQUAL(5, f.tag()->itemListMap()["disk"].toIntPair().second); - CPPUNIT_ASSERT_EQUAL(StringList("3/5"), tags["DISCNUMBER"]); - - CPPUNIT_ASSERT(f.tag()->itemListMap().contains("tmpo")); - CPPUNIT_ASSERT_EQUAL(123, f.tag()->itemListMap()["tmpo"].toInt()); - CPPUNIT_ASSERT_EQUAL(StringList("123"), tags["BPM"]); - - CPPUNIT_ASSERT(f.tag()->itemListMap().contains("\251ART")); - CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), f.tag()->itemListMap()["\251ART"].toStringList()); - CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), tags["ARTIST"]); - - CPPUNIT_ASSERT(f.tag()->itemListMap().contains("cpil")); - CPPUNIT_ASSERT_EQUAL(true, f.tag()->itemListMap()["cpil"].toBool()); - CPPUNIT_ASSERT_EQUAL(StringList("1"), tags["COMPILATION"]); - - tags["COMPILATION"] = StringList("0"); - f.setProperties(tags); - - tags = f.properties(); - - CPPUNIT_ASSERT(f.tag()->itemListMap().contains("cpil")); - CPPUNIT_ASSERT_EQUAL(false, f.tag()->itemListMap()["cpil"].toBool()); - CPPUNIT_ASSERT_EQUAL(StringList("0"), tags["COMPILATION"]); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4); diff --git a/src/taglib/tests/test_mp4coverart.cpp b/src/taglib/tests/test_mp4coverart.cpp deleted file mode 100644 index 812a2e5..0000000 --- a/src/taglib/tests/test_mp4coverart.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <mp4coverart.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMP4CoverArt : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMP4CoverArt); - CPPUNIT_TEST(testSimple); - CPPUNIT_TEST(testList); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testSimple() - { - MP4::CoverArt c(MP4::CoverArt::PNG, "foo"); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c.format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c.data()); - - MP4::CoverArt c2(c); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c2.format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c2.data()); - - MP4::CoverArt c3 = c; - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c3.format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c3.data()); - } - - void testList() - { - MP4::CoverArtList l; - l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); - l.append(MP4::CoverArt(MP4::CoverArt::JPEG, "bar")); - - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), l[0].data()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("bar"), l[1].data()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4CoverArt); diff --git a/src/taglib/tests/test_mp4item.cpp b/src/taglib/tests/test_mp4item.cpp deleted file mode 100644 index 37d3f71..0000000 --- a/src/taglib/tests/test_mp4item.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <mp4coverart.h> -#include <mp4item.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMP4Item : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMP4Item); - CPPUNIT_TEST(testCoverArtList); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testCoverArtList() - { - MP4::CoverArtList l; - l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); - l.append(MP4::CoverArt(MP4::CoverArt::JPEG, "bar")); - - MP4::Item i(l); - MP4::CoverArtList l2 = i.toCoverArtList(); - - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), l[0].data()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("bar"), l[1].data()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4Item); diff --git a/src/taglib/tests/test_mpc.cpp b/src/taglib/tests/test_mpc.cpp deleted file mode 100644 index 12da6ed..0000000 --- a/src/taglib/tests/test_mpc.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include <cppunit/extensions/HelperMacros.h> -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <mpcfile.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMPC : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMPC); - CPPUNIT_TEST(testPropertiesSV8); - CPPUNIT_TEST(testPropertiesSV7); - CPPUNIT_TEST(testPropertiesSV5); - CPPUNIT_TEST(testPropertiesSV4); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testPropertiesSV8() - { - MPC::File f(TEST_FILE_PATH_C("sv8_header.mpc")); - CPPUNIT_ASSERT_EQUAL(8, f.audioProperties()->mpcVersion()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - - void testPropertiesSV7() - { - MPC::File f(TEST_FILE_PATH_C("click.mpc")); - CPPUNIT_ASSERT_EQUAL(7, f.audioProperties()->mpcVersion()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - - void testPropertiesSV5() - { - MPC::File f(TEST_FILE_PATH_C("sv5_header.mpc")); - CPPUNIT_ASSERT_EQUAL(5, f.audioProperties()->mpcVersion()); - CPPUNIT_ASSERT_EQUAL(26, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - - void testPropertiesSV4() - { - MPC::File f(TEST_FILE_PATH_C("sv4_header.mpc")); - CPPUNIT_ASSERT_EQUAL(4, f.audioProperties()->mpcVersion()); - CPPUNIT_ASSERT_EQUAL(26, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMPC); diff --git a/src/taglib/tests/test_mpeg.cpp b/src/taglib/tests/test_mpeg.cpp deleted file mode 100644 index ad6acc4..0000000 --- a/src/taglib/tests/test_mpeg.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tstring.h> -#include <mpegfile.h> -#include <id3v2tag.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMPEG : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMPEG); - CPPUNIT_TEST(testVersion2DurationWithXingHeader); - CPPUNIT_TEST(testSaveID3v24); - CPPUNIT_TEST(testSaveID3v24WrongParam); - CPPUNIT_TEST(testSaveID3v23); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testVersion2DurationWithXingHeader() - { - MPEG::File f(TEST_FILE_PATH_C("mpeg2.mp3")); - CPPUNIT_ASSERT_EQUAL(5387, f.audioProperties()->length()); - } - - void testSaveID3v24() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - String xxx = ByteVector(254, 'X'); - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); - - f.tag()->setTitle(xxx); - f.tag()->setArtist("Artist A"); - f.save(MPEG::File::AllTags, true, 4); - CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); - - MPEG::File f2(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4), f2.ID3v2Tag()->header()->majorVersion()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); - } - - void testSaveID3v24WrongParam() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - String xxx = ByteVector(254, 'X'); - MPEG::File f(newname.c_str()); - f.tag()->setTitle(xxx); - f.tag()->setArtist("Artist A"); - f.save(MPEG::File::AllTags, true, 8); - - MPEG::File f2(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4), f2.ID3v2Tag()->header()->majorVersion()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); - } - - void testSaveID3v23() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - String xxx = ByteVector(254, 'X'); - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); - - f.tag()->setTitle(xxx); - f.tag()->setArtist("Artist A"); - f.save(MPEG::File::AllTags, true, 3); - CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); - - MPEG::File f2(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), f2.ID3v2Tag()->header()->majorVersion()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMPEG); diff --git a/src/taglib/tests/test_ogg.cpp b/src/taglib/tests/test_ogg.cpp deleted file mode 100644 index c89586a..0000000 --- a/src/taglib/tests/test_ogg.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <oggfile.h> -#include <vorbisfile.h> -#include <oggpageheader.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestOGG : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestOGG); - CPPUNIT_TEST(testSimple); - CPPUNIT_TEST(testSplitPackets); - CPPUNIT_TEST(testDictInterface1); - CPPUNIT_TEST(testDictInterface2); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testSimple() - { - ScopedFileCopy copy("empty", ".ogg"); - string newname = copy.fileName(); - - Vorbis::File *f = new Vorbis::File(newname.c_str()); - f->tag()->setArtist("The Artist"); - f->save(); - delete f; - - f = new Vorbis::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("The Artist"), f->tag()->artist()); - delete f; - } - - void testSplitPackets() - { - ScopedFileCopy copy("empty", ".ogg"); - string newname = copy.fileName(); - - Vorbis::File *f = new Vorbis::File(newname.c_str()); - f->tag()->addField("test", ByteVector(128 * 1024, 'x') + ByteVector(1, '\0')); - f->save(); - delete f; - - f = new Vorbis::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(19, f->lastPageHeader()->pageSequenceNumber()); - delete f; - } - - void testDictInterface1() - { - ScopedFileCopy copy("empty", ".ogg"); - string newname = copy.fileName(); - - Vorbis::File *f = new Vorbis::File(newname.c_str()); - - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f->tag()->properties().size()); - - PropertyMap newTags; - StringList values("value 1"); - values.append("value 2"); - newTags["ARTIST"] = values; - f->tag()->setProperties(newTags); - - PropertyMap map = f->tag()->properties(); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), map.size()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), map["ARTIST"].size()); - CPPUNIT_ASSERT_EQUAL(String("value 1"), map["ARTIST"][0]); - delete f; - - } - - void testDictInterface2() - { - ScopedFileCopy copy("test", ".ogg"); - string newname = copy.fileName(); - - Vorbis::File *f = new Vorbis::File(newname.c_str()); - PropertyMap tags = f->tag()->properties(); - - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), tags["UNUSUALTAG"].size()); - CPPUNIT_ASSERT_EQUAL(String("usual value"), tags["UNUSUALTAG"][0]); - CPPUNIT_ASSERT_EQUAL(String("another value"), tags["UNUSUALTAG"][1]); - CPPUNIT_ASSERT_EQUAL(String("öäüoΣø", String::UTF8), tags["UNICODETAG"][0]); - - tags["UNICODETAG"][0] = String("νεω ναλυε", String::UTF8); - tags.erase("UNUSUALTAG"); - f->tag()->setProperties(tags); - CPPUNIT_ASSERT_EQUAL(String("νεω ναλυε", String::UTF8), f->tag()->properties()["UNICODETAG"][0]); - CPPUNIT_ASSERT_EQUAL(false, f->tag()->properties().contains("UNUSUALTAG")); - - delete f; - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestOGG); diff --git a/src/taglib/tests/test_oggflac.cpp b/src/taglib/tests/test_oggflac.cpp deleted file mode 100644 index 1cdb24b..0000000 --- a/src/taglib/tests/test_oggflac.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <oggfile.h> -#include <oggflacfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestOggFLAC : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestOggFLAC); - CPPUNIT_TEST(testFramingBit); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testFramingBit() - { - ScopedFileCopy copy("empty_flac", ".oga"); - string newname = copy.fileName(); - - Ogg::FLAC::File *f = new Ogg::FLAC::File(newname.c_str()); - f->tag()->setArtist("The Artist"); - f->save(); - delete f; - - f = new Ogg::FLAC::File(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("The Artist"), f->tag()->artist()); - - f->seek(0, File::End); - int size = f->tell(); - CPPUNIT_ASSERT_EQUAL(9134, size); - - delete f; - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestOggFLAC); diff --git a/src/taglib/tests/test_opus.cpp b/src/taglib/tests/test_opus.cpp deleted file mode 100644 index 769d398..0000000 --- a/src/taglib/tests/test_opus.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tbytevectorlist.h> -#include <opusfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestOpus : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestOpus); - CPPUNIT_TEST(testProperties); - CPPUNIT_TEST(testReadComments); - CPPUNIT_TEST(testWriteComments); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testProperties() - { - Ogg::Opus::File f(TEST_FILE_PATH_C("correctness_gain_silent_output.opus")); - CPPUNIT_ASSERT_EQUAL(7, f.audioProperties()->length()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(48000, ((Ogg::Opus::Properties *)f.audioProperties())->inputSampleRate()); - } - - void testReadComments() - { - Ogg::Opus::File f(TEST_FILE_PATH_C("correctness_gain_silent_output.opus")); - CPPUNIT_ASSERT_EQUAL(StringList("Xiph.Org Opus testvectormaker"), f.tag()->fieldListMap()["ENCODER"]); - CPPUNIT_ASSERT(f.tag()->fieldListMap().contains("TESTDESCRIPTION")); - CPPUNIT_ASSERT(!f.tag()->fieldListMap().contains("ARTIST")); - CPPUNIT_ASSERT_EQUAL(String("libopus 0.9.11-66-g64c2dd7"), f.tag()->vendorID()); - } - - void testWriteComments() - { - ScopedFileCopy copy("correctness_gain_silent_output", ".opus"); - string filename = copy.fileName(); - - Ogg::Opus::File *f = new Ogg::Opus::File(filename.c_str()); - f->tag()->setArtist("Your Tester"); - f->save(); - delete f; - - f = new Ogg::Opus::File(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(StringList("Xiph.Org Opus testvectormaker"), f->tag()->fieldListMap()["ENCODER"]); - CPPUNIT_ASSERT(f->tag()->fieldListMap().contains("TESTDESCRIPTION")); - CPPUNIT_ASSERT_EQUAL(StringList("Your Tester"), f->tag()->fieldListMap()["ARTIST"]); - CPPUNIT_ASSERT_EQUAL(String("libopus 0.9.11-66-g64c2dd7"), f->tag()->vendorID()); - delete f; - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestOpus); diff --git a/src/taglib/tests/test_propertymap.cpp b/src/taglib/tests/test_propertymap.cpp deleted file mode 100644 index d0b2fbb..0000000 --- a/src/taglib/tests/test_propertymap.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include <cppunit/extensions/HelperMacros.h> -#include <tpropertymap.h> -class TestPropertyMap : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestPropertyMap); - CPPUNIT_TEST(testInvalidKeys); - CPPUNIT_TEST_SUITE_END(); - -public: - void testInvalidKeys() - { - TagLib::PropertyMap map1; - CPPUNIT_ASSERT(map1.isEmpty()); - map1["ÄÖÜ"].append("test"); - CPPUNIT_ASSERT_EQUAL(map1.size(), 1u); - - TagLib::PropertyMap map2; - map2["ÄÖÜ"].append("test"); - CPPUNIT_ASSERT(map1 == map2); - CPPUNIT_ASSERT(map1.contains(map2)); - - map2["ARTIST"] = TagLib::String("Test Artist"); - CPPUNIT_ASSERT(map1 != map2); - CPPUNIT_ASSERT(map2.contains(map1)); - - map2["ÄÖÜ"].append("test 2"); - CPPUNIT_ASSERT(!map2.contains(map1)); - - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestPropertyMap); diff --git a/src/taglib/tests/test_riff.cpp b/src/taglib/tests/test_riff.cpp deleted file mode 100644 index 8e120d0..0000000 --- a/src/taglib/tests/test_riff.cpp +++ /dev/null @@ -1,198 +0,0 @@ -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tbytevectorlist.h> -#include <rifffile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class PublicRIFF : public RIFF::File -{ -public: - PublicRIFF(FileName file) : RIFF::File(file, BigEndian) {}; - TagLib::uint riffSize() { return RIFF::File::riffSize(); }; - TagLib::uint chunkCount() { return RIFF::File::chunkCount(); }; - TagLib::uint chunkOffset(TagLib::uint i) { return RIFF::File::chunkOffset(i); }; - TagLib::uint chunkPadding(TagLib::uint i) { return RIFF::File::chunkPadding(i); }; - TagLib::uint chunkDataSize(TagLib::uint i) { return RIFF::File::chunkDataSize(i); }; - ByteVector chunkName(TagLib::uint i) { return RIFF::File::chunkName(i); }; - ByteVector chunkData(TagLib::uint i) { return RIFF::File::chunkData(i); }; - void setChunkData(const ByteVector &name, const ByteVector &data) { - RIFF::File::setChunkData(name, data); - }; - virtual TagLib::Tag* tag() const { return 0; }; - virtual TagLib::AudioProperties* audioProperties() const { return 0;}; - virtual bool save() { return false; }; -}; - -class TestRIFF : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestRIFF); - CPPUNIT_TEST(testPadding); - CPPUNIT_TEST(testLastChunkAtEvenPosition); - CPPUNIT_TEST(testLastChunkAtEvenPosition2); - CPPUNIT_TEST(testLastChunkAtEvenPosition3); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testPadding() - { - ScopedFileCopy copy("empty", ".aiff"); - string filename = copy.fileName(); - - PublicRIFF *f = new PublicRIFF(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0x1728 + 8), f->chunkOffset(2)); - - f->setChunkData("TEST", "foo"); - delete f; - - f = new PublicRIFF(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f->chunkData(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0x1728 + 8), f->chunkOffset(2)); - - f->setChunkData("SSND", "abcd"); - - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f->chunkData(1)); - - f->seek(f->chunkOffset(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f->readBlock(4)); - - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f->chunkData(2)); - - f->seek(f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f->readBlock(3)); - - delete f; - - f = new PublicRIFF(filename.c_str()); - - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f->chunkData(1)); - - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f->chunkData(2)); - } - - void testLastChunkAtEvenPosition() - { - ScopedFileCopy copy("noise", ".aif"); - string filename = copy.fileName(); - - PublicRIFF *f = new PublicRIFF(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0xff0 + 8), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(long(4400), f->length()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4399 - 8), f->riffSize()); - f->setChunkData("TEST", "abcd"); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4088), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4408), f->chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4), f->chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f->chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4412 - 8), f->riffSize()); - delete f; - - f = new PublicRIFF(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4088), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4408), f->chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4), f->chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f->chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(long(4412), f->length()); - delete f; - } - - void testLastChunkAtEvenPosition2() - { - ScopedFileCopy copy("noise_odd", ".aif"); - string filename = copy.fileName(); - - PublicRIFF *f = new PublicRIFF(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0xff0 + 8), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(long(4399), f->length()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4399 - 8), f->riffSize()); - f->setChunkData("TEST", "abcd"); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4088), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4408), f->chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4), f->chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f->chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4412 - 8), f->riffSize()); - delete f; - - f = new PublicRIFF(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4088), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4408), f->chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4), f->chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f->chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(long(4412), f->length()); - delete f; - } - - void testLastChunkAtEvenPosition3() - { - ScopedFileCopy copy("noise_odd", ".aif"); - string filename = copy.fileName(); - - PublicRIFF *f = new PublicRIFF(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0xff0 + 8), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(long(4399), f->length()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4399 - 8), f->riffSize()); - f->setChunkData("TEST", "abc"); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4088), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4408), f->chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), f->chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4411 - 8), f->riffSize()); - delete f; - - f = new PublicRIFF(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4088), f->chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(311), f->chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(4408), f->chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), f->chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(3)); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), f->chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(long(4412), f->length()); - delete f; - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestRIFF); diff --git a/src/taglib/tests/test_s3m.cpp b/src/taglib/tests/test_s3m.cpp deleted file mode 100644 index 24a4c6e..0000000 --- a/src/taglib/tests/test_s3m.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include <s3mfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -static const String titleBefore("test song name"); -static const String titleAfter("changed title"); - -static const String commentBefore( - "This is an instrument name.\n" - "Module file formats\n" - "abuse instrument names\n" - "as multiline comments.\n" - " "); - -static const String newComment( - "This is an instrument name!\n" - "Module file formats\n" - "abuse instrument names\n" - "as multiline comments.\n" - "-----------------------------------\n" - "This line will be dropped and the previous is truncated."); - -static const String commentAfter( - "This is an instrument name!\n" - "Module file formats\n" - "abuse instrument names\n" - "as multiline comments.\n" - "---------------------------"); - -class TestS3M : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestS3M); - CPPUNIT_TEST(testReadTags); - CPPUNIT_TEST(testWriteTags); - CPPUNIT_TEST_SUITE_END(); - -public: - void testReadTags() - { - testRead(TEST_FILE_PATH_C("test.s3m"), titleBefore, commentBefore); - } - - void testWriteTags() - { - ScopedFileCopy copy("test", ".s3m"); - { - S3M::File file(copy.fileName().c_str()); - CPPUNIT_ASSERT(file.tag() != 0); - file.tag()->setTitle(titleAfter); - file.tag()->setComment(newComment); - file.tag()->setTrackerName("won't be saved"); - CPPUNIT_ASSERT(file.save()); - } - testRead(copy.fileName().c_str(), titleAfter, commentAfter); - CPPUNIT_ASSERT(fileEqual( - copy.fileName(), - TEST_FILE_PATH_C("changed.s3m"))); - } - -private: - void testRead(FileName fileName, const String &title, const String &comment) - { - S3M::File file(fileName); - - CPPUNIT_ASSERT(file.isValid()); - - S3M::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL( 0, p->length()); - CPPUNIT_ASSERT_EQUAL( 0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL( 0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, p->channels()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 0, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL(false, p->stereo()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 5, p->sampleCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 1, p->patternCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 0, p->flags()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort)4896, p->trackerVersion()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 2, p->fileFormatVersion()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar) 64, p->globalVolume()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar) 48, p->masterVolume()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar)125, p->tempo()); - CPPUNIT_ASSERT_EQUAL((TagLib::uchar) 6, p->bpmSpeed()); - CPPUNIT_ASSERT_EQUAL(title, t->title()); - CPPUNIT_ASSERT_EQUAL(String::null, t->artist()); - CPPUNIT_ASSERT_EQUAL(String::null, t->album()); - CPPUNIT_ASSERT_EQUAL(comment, t->comment()); - CPPUNIT_ASSERT_EQUAL(String::null, t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(String("ScreamTracker III"), t->trackerName()); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestS3M); diff --git a/src/taglib/tests/test_string.cpp b/src/taglib/tests/test_string.cpp deleted file mode 100644 index a815a0b..0000000 --- a/src/taglib/tests/test_string.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler <wheeler@kde.org> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <tstring.h> -#include <string.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestString : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestString); - CPPUNIT_TEST(testString); - CPPUNIT_TEST(testRfind); - CPPUNIT_TEST(testUTF16Encode); - CPPUNIT_TEST(testUTF16Decode); - CPPUNIT_TEST(testUTF16DecodeInvalidBOM); - CPPUNIT_TEST(testUTF16DecodeEmptyWithBOM); - CPPUNIT_TEST(testAppendCharDetach); - CPPUNIT_TEST(testAppendStringDetach); - CPPUNIT_TEST(testToInt); - CPPUNIT_TEST(testSubstr); - CPPUNIT_TEST(testNewline); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testString() - { - String s = "taglib string"; - ByteVector v = "taglib string"; - CPPUNIT_ASSERT(v == s.data(String::Latin1)); - - char str[] = "taglib string"; - CPPUNIT_ASSERT(strcmp(s.toCString(), str) == 0); - - String unicode("José Carlos", String::UTF8); - CPPUNIT_ASSERT(strcmp(unicode.toCString(), "Jos\xe9 Carlos") == 0); - - String latin = "Jos\xe9 Carlos"; - CPPUNIT_ASSERT(strcmp(latin.toCString(true), "José Carlos") == 0); - - String c; - c = "1"; - CPPUNIT_ASSERT(c == L"1"); - - c = L'\u4E00'; - CPPUNIT_ASSERT(c == L"\u4E00"); - - String unicode2(unicode.to8Bit(true), String::UTF8); - CPPUNIT_ASSERT(unicode == unicode2); - - String unicode3(L"\u65E5\u672C\u8A9E"); - CPPUNIT_ASSERT(*(unicode3.toCWString() + 1) == L'\u672C'); - - CPPUNIT_ASSERT(strcmp(String::number(0).toCString(), "0") == 0); - CPPUNIT_ASSERT(strcmp(String::number(12345678).toCString(), "12345678") == 0); - CPPUNIT_ASSERT(strcmp(String::number(-12345678).toCString(), "-12345678") == 0); - - String n = "123"; - CPPUNIT_ASSERT(n.toInt() == 123); - - n = "-123"; - CPPUNIT_ASSERT(n.toInt() == -123); - - CPPUNIT_ASSERT(String("0").toInt() == 0); - CPPUNIT_ASSERT(String("1").toInt() == 1); - - CPPUNIT_ASSERT(String(" foo ").stripWhiteSpace() == String("foo")); - CPPUNIT_ASSERT(String("foo ").stripWhiteSpace() == String("foo")); - CPPUNIT_ASSERT(String(" foo").stripWhiteSpace() == String("foo")); - - CPPUNIT_ASSERT(memcmp(String("foo").data(String::Latin1).data(), "foo", 3) == 0); - CPPUNIT_ASSERT(memcmp(String("f").data(String::Latin1).data(), "f", 1) == 0); - - ByteVector utf16 = unicode.data(String::UTF16); - - // Check to make sure that the BOM is there and that the data size is correct - - CPPUNIT_ASSERT(utf16.size() == 2 + (unicode.size() * 2)); - - CPPUNIT_ASSERT(unicode == String(utf16, String::UTF16)); - } - - void testUTF16Encode() - { - String a("foo"); - ByteVector b("\0f\0o\0o", 6); - ByteVector c("f\0o\0o\0", 6); - ByteVector d("\377\376f\0o\0o\0", 8); - CPPUNIT_ASSERT(a.data(String::UTF16BE) != a.data(String::UTF16LE)); - CPPUNIT_ASSERT(b == a.data(String::UTF16BE)); - CPPUNIT_ASSERT(c == a.data(String::UTF16LE)); - CPPUNIT_ASSERT_EQUAL(d, a.data(String::UTF16)); - } - - void testUTF16Decode() - { - String a("foo"); - ByteVector b("\0f\0o\0o", 6); - ByteVector c("f\0o\0o\0", 6); - ByteVector d("\377\376f\0o\0o\0", 8); - CPPUNIT_ASSERT_EQUAL(a, String(b, String::UTF16BE)); - CPPUNIT_ASSERT_EQUAL(a, String(c, String::UTF16LE)); - CPPUNIT_ASSERT_EQUAL(a, String(d, String::UTF16)); - } - - // this test is expected to print "TagLib: String::prepare() - - // Invalid UTF16 string." on the console 3 times - void testUTF16DecodeInvalidBOM() - { - ByteVector b(" ", 1); - ByteVector c(" ", 2); - ByteVector d(" \0f\0o\0o", 8); - CPPUNIT_ASSERT_EQUAL(String(), String(b, String::UTF16)); - CPPUNIT_ASSERT_EQUAL(String(), String(c, String::UTF16)); - CPPUNIT_ASSERT_EQUAL(String(), String(d, String::UTF16)); - } - - void testUTF16DecodeEmptyWithBOM() - { - ByteVector a("\377\376", 2); - ByteVector b("\376\377", 2); - CPPUNIT_ASSERT_EQUAL(String(), String(a, String::UTF16)); - CPPUNIT_ASSERT_EQUAL(String(), String(b, String::UTF16)); - } - - void testAppendStringDetach() - { - String a("a"); - String b = a; - a += "b"; - CPPUNIT_ASSERT_EQUAL(String("ab"), a); - CPPUNIT_ASSERT_EQUAL(String("a"), b); - } - - void testAppendCharDetach() - { - String a("a"); - String b = a; - a += 'b'; - CPPUNIT_ASSERT_EQUAL(String("ab"), a); - CPPUNIT_ASSERT_EQUAL(String("a"), b); - } - - void testRfind() - { - CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 0)); - CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 1)); - CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 2)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 3)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 4)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 5)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 6)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 7)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".")); - } - - void testToInt() - { - bool ok; - CPPUNIT_ASSERT_EQUAL(String("123").toInt(&ok), 123); - CPPUNIT_ASSERT_EQUAL(ok, true); - - CPPUNIT_ASSERT_EQUAL(String("-123").toInt(&ok), -123); - CPPUNIT_ASSERT_EQUAL(ok, true); - - CPPUNIT_ASSERT_EQUAL(String("abc").toInt(&ok), 0); - CPPUNIT_ASSERT_EQUAL(ok, false); - - CPPUNIT_ASSERT_EQUAL(String("1x").toInt(&ok), 1); - CPPUNIT_ASSERT_EQUAL(ok, false); - - CPPUNIT_ASSERT_EQUAL(String("").toInt(&ok), 0); - CPPUNIT_ASSERT_EQUAL(ok, false); - - CPPUNIT_ASSERT_EQUAL(String("-").toInt(&ok), 0); - CPPUNIT_ASSERT_EQUAL(ok, false); - - CPPUNIT_ASSERT_EQUAL(String("123").toInt(), 123); - CPPUNIT_ASSERT_EQUAL(String("-123").toInt(), -123); - CPPUNIT_ASSERT_EQUAL(String("123aa").toInt(), 123); - CPPUNIT_ASSERT_EQUAL(String("-123aa").toInt(), -123); - } - - void testSubstr() - { - CPPUNIT_ASSERT_EQUAL(String("01"), String("0123456").substr(0, 2)); - CPPUNIT_ASSERT_EQUAL(String("12"), String("0123456").substr(1, 2)); - CPPUNIT_ASSERT_EQUAL(String("123456"), String("0123456").substr(1, 200)); - } - - void testNewline() - { - ByteVector cr("abc\x0dxyz", 7); - ByteVector lf("abc\x0axyz", 7); - ByteVector crlf("abc\x0d\x0axyz", 8); - - CPPUNIT_ASSERT_EQUAL(uint(7), String(cr).size()); - CPPUNIT_ASSERT_EQUAL(uint(7), String(lf).size()); - CPPUNIT_ASSERT_EQUAL(uint(8), String(crlf).size()); - - CPPUNIT_ASSERT_EQUAL(L'\x0d', String(cr)[3]); - CPPUNIT_ASSERT_EQUAL(L'\x0a', String(lf)[3]); - CPPUNIT_ASSERT_EQUAL(L'\x0d', String(crlf)[3]); - CPPUNIT_ASSERT_EQUAL(L'\x0a', String(crlf)[4]); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestString); diff --git a/src/taglib/tests/test_synchdata.cpp b/src/taglib/tests/test_synchdata.cpp deleted file mode 100644 index 2e3021e..0000000 --- a/src/taglib/tests/test_synchdata.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler <wheeler@kde.org> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include <id3v2synchdata.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestID3v2SynchData : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestID3v2SynchData); - CPPUNIT_TEST(test1); - CPPUNIT_TEST(test2); - CPPUNIT_TEST(test3); - CPPUNIT_TEST(testToUIntBroken); - CPPUNIT_TEST(testToUIntBrokenAndTooLarge); - CPPUNIT_TEST(testDecode1); - CPPUNIT_TEST(testDecode2); - CPPUNIT_TEST_SUITE_END(); - -public: - - void test1() - { - char data[] = { 0, 0, 0, 127 }; - ByteVector v(data, 4); - - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), TagLib::uint(127)); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(127), v); - } - - void test2() - { - char data[] = { 0, 0, 1, 0 }; - ByteVector v(data, 4); - - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), TagLib::uint(128)); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(128), v); - } - - void test3() - { - char data[] = { 0, 0, 1, 1 }; - ByteVector v(data, 4); - - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), TagLib::uint(129)); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(129), v); - } - - void testToUIntBroken() - { - char data[] = { 0, 0, 0, -1 }; - char data2[] = { 0, 0, -1, -1 }; - - CPPUNIT_ASSERT_EQUAL(TagLib::uint(255), ID3v2::SynchData::toUInt(ByteVector(data, 4))); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(65535), ID3v2::SynchData::toUInt(ByteVector(data2, 4))); - } - - void testToUIntBrokenAndTooLarge() - { - char data[] = { 0, 0, 0, -1, 0 }; - ByteVector v(data, 5); - - CPPUNIT_ASSERT_EQUAL(TagLib::uint(255), ID3v2::SynchData::toUInt(v)); - } - - void testDecode1() - { - ByteVector a("\xff\x00\x00", 3); - a = ID3v2::SynchData::decode(a); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, a.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\x00", 2), a); - } - - void testDecode2() - { - ByteVector a("\xff\x44", 2); - a = ID3v2::SynchData::decode(a); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, a.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\x44", 2), a); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2SynchData); diff --git a/src/taglib/tests/test_trueaudio.cpp b/src/taglib/tests/test_trueaudio.cpp deleted file mode 100644 index 5ff114c..0000000 --- a/src/taglib/tests/test_trueaudio.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include <cppunit/extensions/HelperMacros.h> -#include <string> -#include <stdio.h> -#include <trueaudiofile.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestTrueAudio : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestTrueAudio); - CPPUNIT_TEST(testReadPropertiesWithoutID3v2); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testReadPropertiesWithoutID3v2() - { - TrueAudio::File f(TEST_FILE_PATH_C("empty.tta")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->length()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestTrueAudio); diff --git a/src/taglib/tests/test_wav.cpp b/src/taglib/tests/test_wav.cpp deleted file mode 100644 index d17ce2c..0000000 --- a/src/taglib/tests/test_wav.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include <cppunit/extensions/HelperMacros.h> -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tbytevectorlist.h> -#include <wavfile.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestWAV : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestWAV); - CPPUNIT_TEST(testLength); - CPPUNIT_TEST(testZeroSizeDataChunk); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testLength() - { - RIFF::WAV::File f(TEST_FILE_PATH_C("empty.wav")); - CPPUNIT_ASSERT_EQUAL(true, f.isValid()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->length()); - } - - void testZeroSizeDataChunk() - { - RIFF::WAV::File f(TEST_FILE_PATH_C("zero-size-chunk.wav")); - CPPUNIT_ASSERT_EQUAL(false, f.isValid()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestWAV); diff --git a/src/taglib/tests/test_wavpack.cpp b/src/taglib/tests/test_wavpack.cpp deleted file mode 100644 index 085fa2d..0000000 --- a/src/taglib/tests/test_wavpack.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include <cppunit/extensions/HelperMacros.h> -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tbytevectorlist.h> -#include <wavpackfile.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestWavPack : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestWavPack); - CPPUNIT_TEST(testBasic); - CPPUNIT_TEST(testLengthScan); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testBasic() - { - WavPack::File f(TEST_FILE_PATH_C("no_length.wv")); - WavPack::Properties *props = f.audioProperties(); - CPPUNIT_ASSERT_EQUAL(44100, props->sampleRate()); - CPPUNIT_ASSERT_EQUAL(2, props->channels()); - CPPUNIT_ASSERT_EQUAL(1, props->bitrate()); - CPPUNIT_ASSERT_EQUAL(0x407, props->version()); - } - - void testLengthScan() - { - WavPack::File f(TEST_FILE_PATH_C("no_length.wv")); - WavPack::Properties *props = f.audioProperties(); - CPPUNIT_ASSERT_EQUAL(4, props->length()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestWavPack); diff --git a/src/taglib/tests/test_xiphcomment.cpp b/src/taglib/tests/test_xiphcomment.cpp deleted file mode 100644 index 6526229..0000000 --- a/src/taglib/tests/test_xiphcomment.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include <string> -#include <stdio.h> -#include <xiphcomment.h> -#include <tpropertymap.h> -#include <tdebug.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestXiphComment : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestXiphComment); - CPPUNIT_TEST(testYear); - CPPUNIT_TEST(testSetYear); - CPPUNIT_TEST(testTrack); - CPPUNIT_TEST(testSetTrack); - CPPUNIT_TEST(testInvalidKeys); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testYear() - { - Ogg::XiphComment cmt; - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), cmt.year()); - cmt.addField("YEAR", "2009"); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2009), cmt.year()); - cmt.addField("DATE", "2008"); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(2008), cmt.year()); - } - - void testSetYear() - { - Ogg::XiphComment cmt; - cmt.addField("YEAR", "2009"); - cmt.addField("DATE", "2008"); - cmt.setYear(1995); - CPPUNIT_ASSERT(cmt.fieldListMap()["YEAR"].isEmpty()); - CPPUNIT_ASSERT_EQUAL(String("1995"), cmt.fieldListMap()["DATE"].front()); - } - - void testTrack() - { - Ogg::XiphComment cmt; - CPPUNIT_ASSERT_EQUAL(TagLib::uint(0), cmt.track()); - cmt.addField("TRACKNUM", "7"); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(7), cmt.track()); - cmt.addField("TRACKNUMBER", "8"); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(8), cmt.track()); - } - - void testSetTrack() - { - Ogg::XiphComment cmt; - cmt.addField("TRACKNUM", "7"); - cmt.addField("TRACKNUMBER", "8"); - cmt.setTrack(3); - CPPUNIT_ASSERT(cmt.fieldListMap()["TRACKNUM"].isEmpty()); - CPPUNIT_ASSERT_EQUAL(String("3"), cmt.fieldListMap()["TRACKNUMBER"].front()); - } - - void testInvalidKeys() - { - PropertyMap map; - map[""] = String("invalid key: empty string"); - map["A=B"] = String("invalid key: contains '='"); - map["A~B"] = String("invalid key: contains '~'"); - - Ogg::XiphComment cmt; - PropertyMap unsuccessful = cmt.setProperties(map); - CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), unsuccessful.size()); - CPPUNIT_ASSERT(cmt.properties().isEmpty()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestXiphComment); diff --git a/src/taglib/tests/test_xm.cpp b/src/taglib/tests/test_xm.cpp deleted file mode 100644 index 2808653..0000000 --- a/src/taglib/tests/test_xm.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#include <xmfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -static const String titleBefore("title of song"); -static const String titleAfter("changed title"); - -static const String trackerNameBefore("MilkyTracker "); -static const String trackerNameAfter("TagLib"); - -static const String commentBefore( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "-+-+-+-+-+-+-+-+-+-+-+\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n" - "Sample\n" - "names\n" - "are sometimes\n" - "also abused as\n" - "comments."); - -static const String newCommentShort( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "======================\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n" - "Sample names\n" - "are sometimes\n" - "also abused as\n" - "comments."); - -static const String newCommentLong( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "======================\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n" - "Sample names\n" - "are sometimes\n" - "also abused as\n" - "comments.\n" - "\n\n\n\n\n\n\n" - "TEST"); - -static const String commentAfter( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "======================\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n" - "Sample names\n" - "are sometimes\n" - "also abused as\n" - "comments.\n"); - -class TestXM : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestXM); - CPPUNIT_TEST(testReadTags); - CPPUNIT_TEST(testReadStrippedTags); - CPPUNIT_TEST(testWriteTagsShort); - CPPUNIT_TEST(testWriteTagsLong); - CPPUNIT_TEST_SUITE_END(); - -public: - void testReadTags() - { - testRead(TEST_FILE_PATH_C("test.xm"), titleBefore, - commentBefore, trackerNameBefore); - } - - void testReadStrippedTags() - { - XM::File file(TEST_FILE_PATH_C("stripped.xm")); - CPPUNIT_ASSERT(file.isValid()); - - XM::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL(0, p->length()); - CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(8, p->channels()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 1, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 0, p->version()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 0 , p->restartPosition()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 1, p->patternCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 0, p->instrumentCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 1, p->flags()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 6, p->tempo()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort)125, p->bpmSpeed()); - CPPUNIT_ASSERT_EQUAL(titleBefore, t->title()); - CPPUNIT_ASSERT_EQUAL(String::null, t->artist()); - CPPUNIT_ASSERT_EQUAL(String::null, t->album()); - CPPUNIT_ASSERT_EQUAL(String::null, t->comment()); - CPPUNIT_ASSERT_EQUAL(String::null, t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(String::null, t->trackerName()); - } - - void testWriteTagsShort() - { - testWriteTags(newCommentShort); - } - - void testWriteTagsLong() - { - testWriteTags(newCommentLong); - } - -private: - void testRead(FileName fileName, const String &title, - const String &comment, const String &trackerName) - { - XM::File file(fileName); - - CPPUNIT_ASSERT(file.isValid()); - - XM::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL(0, p->length()); - CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(8, p->channels()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 1, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort)260, p->version()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 0, p->restartPosition()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 1, p->patternCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort)128, p->instrumentCount()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 1, p->flags()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort) 6, p->tempo()); - CPPUNIT_ASSERT_EQUAL((TagLib::ushort)125, p->bpmSpeed()); - CPPUNIT_ASSERT_EQUAL(title, t->title()); - CPPUNIT_ASSERT_EQUAL(String::null, t->artist()); - CPPUNIT_ASSERT_EQUAL(String::null, t->album()); - CPPUNIT_ASSERT_EQUAL(comment, t->comment()); - CPPUNIT_ASSERT_EQUAL(String::null, t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(trackerName, t->trackerName()); - } - - void testWriteTags(const String &comment) - { - ScopedFileCopy copy("test", ".xm"); - { - XM::File file(copy.fileName().c_str()); - CPPUNIT_ASSERT(file.tag() != 0); - file.tag()->setTitle(titleAfter); - file.tag()->setComment(comment); - file.tag()->setTrackerName(trackerNameAfter); - CPPUNIT_ASSERT(file.save()); - } - testRead(copy.fileName().c_str(), titleAfter, - commentAfter, trackerNameAfter); - CPPUNIT_ASSERT(fileEqual( - copy.fileName(), - TEST_FILE_PATH_C("changed.xm"))); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestXM); diff --git a/src/taglib/tests/utils.h b/src/taglib/tests/utils.h deleted file mode 100644 index 00cef62..0000000 --- a/src/taglib/tests/utils.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifdef _WIN32 -#include <windows.h> -#else -#include <unistd.h> -#include <fcntl.h> -#include <sys/fcntl.h> -#include <sys/stat.h> -#endif -#include <stdio.h> -#include <string.h> -#include <string> -#include <fstream> - -using namespace std; - -inline string testFilePath(const string &filename) -{ - return string(TESTS_DIR "data/") + filename; -} - -#define TEST_FILE_PATH_C(f) testFilePath(f).c_str() - -inline string copyFile(const string &filename, const string &ext) -{ - string newname = string(tempnam(NULL, NULL)) + ext; - string oldname = testFilePath(filename) + ext; -#ifdef _WIN32 - CopyFile(oldname.c_str(), newname.c_str(), FALSE); - SetFileAttributes(newname.c_str(), GetFileAttributes(newname.c_str()) & ~FILE_ATTRIBUTE_READONLY); -#else - char buffer[4096]; - int bytes; - int inf = open(oldname.c_str(), O_RDONLY); - int outf = open(newname.c_str(), O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); - while((bytes = read(inf, buffer, sizeof(buffer))) > 0) - write(outf, buffer, bytes); - close(outf); - close(inf); -#endif - return newname; -} - -inline void deleteFile(const string &filename) -{ - remove(filename.c_str()); -} - -inline bool fileEqual(const string &filename1, const string &filename2) -{ - char buf1[BUFSIZ]; - char buf2[BUFSIZ]; - - ifstream stream1(filename1.c_str(), ios_base::in | ios_base::binary); - ifstream stream2(filename2.c_str(), ios_base::in | ios_base::binary); - - if(!stream1 && !stream2) return true; - if(!stream1 || !stream2) return false; - - for(;;) - { - stream1.read(buf1, BUFSIZ); - stream2.read(buf2, BUFSIZ); - - streamsize n1 = stream1.gcount(); - streamsize n2 = stream2.gcount(); - - if(n1 != n2) return false; - - if(n1 == 0) break; - - if(memcmp(buf1, buf2, n1) != 0) return false; - } - - return stream1.good() == stream2.good(); -} - -class ScopedFileCopy -{ -public: - ScopedFileCopy(const string &filename, const string &ext, bool deleteFile=true) - { - m_deleteFile = deleteFile; - m_filename = copyFile(filename, ext); - } - - ~ScopedFileCopy() - { - if(m_deleteFile) - deleteFile(m_filename); - } - - string fileName() - { - return m_filename; - } - -private: - bool m_deleteFile; - string m_filename; -}; From 38fe720b6cda6fac1114f23ba4ef6325387f98df Mon Sep 17 00:00:00 2001 From: olf <Olf0@users.noreply.github.com> Date: Tue, 5 Dec 2023 19:24:12 +0100 Subject: [PATCH 2/3] Delete src/mytaglib directory Obsoleted by PR #19 by @dcaliste --- src/mytaglib/aifffile.h | 102 ---- src/mytaglib/aiffproperties.h | 82 --- src/mytaglib/apefile.h | 171 ------- src/mytaglib/apefooter.h | 173 ------- src/mytaglib/apeitem.h | 204 -------- src/mytaglib/apeproperties.h | 98 ---- src/mytaglib/apetag.h | 170 ------ src/mytaglib/asfattribute.h | 203 -------- src/mytaglib/asffile.h | 120 ----- src/mytaglib/asfpicture.h | 217 -------- src/mytaglib/asfproperties.h | 74 --- src/mytaglib/asftag.h | 186 ------- src/mytaglib/attachedpictureframe.h | 230 --------- src/mytaglib/audioproperties.h | 110 ---- src/mytaglib/commentsframe.h | 168 ------ src/mytaglib/fileref.h | 263 ---------- src/mytaglib/flacfile.h | 222 -------- src/mytaglib/flacmetadatablock.h | 75 --- src/mytaglib/flacpicture.h | 208 -------- src/mytaglib/flacproperties.h | 98 ---- src/mytaglib/generalencapsulatedobjectframe.h | 178 ------- src/mytaglib/id3v1genres.h | 66 --- src/mytaglib/id3v1tag.h | 181 ------- src/mytaglib/id3v2extendedheader.h | 93 ---- src/mytaglib/id3v2footer.h | 82 --- src/mytaglib/id3v2frame.h | 414 --------------- src/mytaglib/id3v2framefactory.h | 167 ------ src/mytaglib/id3v2header.h | 175 ------- src/mytaglib/id3v2synchdata.h | 70 --- src/mytaglib/id3v2tag.h | 300 ----------- src/mytaglib/mp4atom.h | 77 --- src/mytaglib/mp4coverart.h | 71 --- src/mytaglib/mp4file.h | 103 ---- src/mytaglib/mp4item.h | 72 --- src/mytaglib/mp4properties.h | 61 --- src/mytaglib/mp4tag.h | 104 ---- src/mytaglib/mpcfile.h | 175 ------- src/mytaglib/mpcproperties.h | 85 --- src/mytaglib/mpegfile.h | 277 ---------- src/mytaglib/mpegheader.h | 166 ------ src/mytaglib/mpegproperties.h | 118 ----- src/mytaglib/oggfile.h | 112 ---- src/mytaglib/oggflacfile.h | 118 ----- src/mytaglib/oggpage.h | 211 -------- src/mytaglib/oggpageheader.h | 232 --------- src/mytaglib/popularimeterframe.h | 132 ----- src/mytaglib/privateframe.h | 111 ---- src/mytaglib/relativevolumeframe.h | 274 ---------- src/mytaglib/rifffile.h | 121 ----- src/mytaglib/speexfile.h | 99 ---- src/mytaglib/speexproperties.h | 89 ---- src/mytaglib/tag.h | 173 ------- src/mytaglib/taglib.h | 186 ------- src/mytaglib/taglib_export.h | 47 -- src/mytaglib/tagunion.h | 95 ---- src/mytaglib/tbytevector.h | 425 --------------- src/mytaglib/tbytevectorlist.h | 91 ---- src/mytaglib/tdebug.h | 71 --- src/mytaglib/textidentificationframe.h | 258 ---------- src/mytaglib/tfile.h | 270 ---------- src/mytaglib/tlist.h | 252 --------- src/mytaglib/tlist.tcc | 316 ------------ src/mytaglib/tmap.h | 200 -------- src/mytaglib/tmap.tcc | 196 ------- src/mytaglib/trueaudiofile.h | 180 ------- src/mytaglib/trueaudioproperties.h | 93 ---- src/mytaglib/tstring.h | 483 ------------------ src/mytaglib/tstringlist.h | 115 ----- src/mytaglib/unicode.h | 149 ------ src/mytaglib/uniquefileidentifierframe.h | 113 ---- src/mytaglib/unknownframe.h | 79 --- src/mytaglib/unsynchronizedlyricsframe.h | 157 ------ src/mytaglib/urllinkframe.h | 172 ------- src/mytaglib/vorbisfile.h | 118 ----- src/mytaglib/vorbisproperties.h | 125 ----- src/mytaglib/wavfile.h | 102 ---- src/mytaglib/wavpackfile.h | 164 ------ src/mytaglib/wavpackproperties.h | 104 ---- src/mytaglib/wavproperties.h | 91 ---- src/mytaglib/xingheader.h | 100 ---- src/mytaglib/xiphcomment.h | 202 -------- 81 files changed, 12835 deletions(-) delete mode 100644 src/mytaglib/aifffile.h delete mode 100644 src/mytaglib/aiffproperties.h delete mode 100644 src/mytaglib/apefile.h delete mode 100644 src/mytaglib/apefooter.h delete mode 100644 src/mytaglib/apeitem.h delete mode 100644 src/mytaglib/apeproperties.h delete mode 100644 src/mytaglib/apetag.h delete mode 100644 src/mytaglib/asfattribute.h delete mode 100644 src/mytaglib/asffile.h delete mode 100644 src/mytaglib/asfpicture.h delete mode 100644 src/mytaglib/asfproperties.h delete mode 100644 src/mytaglib/asftag.h delete mode 100644 src/mytaglib/attachedpictureframe.h delete mode 100644 src/mytaglib/audioproperties.h delete mode 100644 src/mytaglib/commentsframe.h delete mode 100644 src/mytaglib/fileref.h delete mode 100644 src/mytaglib/flacfile.h delete mode 100644 src/mytaglib/flacmetadatablock.h delete mode 100644 src/mytaglib/flacpicture.h delete mode 100644 src/mytaglib/flacproperties.h delete mode 100644 src/mytaglib/generalencapsulatedobjectframe.h delete mode 100644 src/mytaglib/id3v1genres.h delete mode 100644 src/mytaglib/id3v1tag.h delete mode 100644 src/mytaglib/id3v2extendedheader.h delete mode 100644 src/mytaglib/id3v2footer.h delete mode 100644 src/mytaglib/id3v2frame.h delete mode 100644 src/mytaglib/id3v2framefactory.h delete mode 100644 src/mytaglib/id3v2header.h delete mode 100644 src/mytaglib/id3v2synchdata.h delete mode 100644 src/mytaglib/id3v2tag.h delete mode 100644 src/mytaglib/mp4atom.h delete mode 100644 src/mytaglib/mp4coverart.h delete mode 100644 src/mytaglib/mp4file.h delete mode 100644 src/mytaglib/mp4item.h delete mode 100644 src/mytaglib/mp4properties.h delete mode 100644 src/mytaglib/mp4tag.h delete mode 100644 src/mytaglib/mpcfile.h delete mode 100644 src/mytaglib/mpcproperties.h delete mode 100644 src/mytaglib/mpegfile.h delete mode 100644 src/mytaglib/mpegheader.h delete mode 100644 src/mytaglib/mpegproperties.h delete mode 100644 src/mytaglib/oggfile.h delete mode 100644 src/mytaglib/oggflacfile.h delete mode 100644 src/mytaglib/oggpage.h delete mode 100644 src/mytaglib/oggpageheader.h delete mode 100644 src/mytaglib/popularimeterframe.h delete mode 100644 src/mytaglib/privateframe.h delete mode 100644 src/mytaglib/relativevolumeframe.h delete mode 100644 src/mytaglib/rifffile.h delete mode 100644 src/mytaglib/speexfile.h delete mode 100644 src/mytaglib/speexproperties.h delete mode 100644 src/mytaglib/tag.h delete mode 100644 src/mytaglib/taglib.h delete mode 100644 src/mytaglib/taglib_export.h delete mode 100644 src/mytaglib/tagunion.h delete mode 100644 src/mytaglib/tbytevector.h delete mode 100644 src/mytaglib/tbytevectorlist.h delete mode 100644 src/mytaglib/tdebug.h delete mode 100644 src/mytaglib/textidentificationframe.h delete mode 100644 src/mytaglib/tfile.h delete mode 100644 src/mytaglib/tlist.h delete mode 100644 src/mytaglib/tlist.tcc delete mode 100644 src/mytaglib/tmap.h delete mode 100644 src/mytaglib/tmap.tcc delete mode 100644 src/mytaglib/trueaudiofile.h delete mode 100644 src/mytaglib/trueaudioproperties.h delete mode 100644 src/mytaglib/tstring.h delete mode 100644 src/mytaglib/tstringlist.h delete mode 100644 src/mytaglib/unicode.h delete mode 100644 src/mytaglib/uniquefileidentifierframe.h delete mode 100644 src/mytaglib/unknownframe.h delete mode 100644 src/mytaglib/unsynchronizedlyricsframe.h delete mode 100644 src/mytaglib/urllinkframe.h delete mode 100644 src/mytaglib/vorbisfile.h delete mode 100644 src/mytaglib/vorbisproperties.h delete mode 100644 src/mytaglib/wavfile.h delete mode 100644 src/mytaglib/wavpackfile.h delete mode 100644 src/mytaglib/wavpackproperties.h delete mode 100644 src/mytaglib/wavproperties.h delete mode 100644 src/mytaglib/xingheader.h delete mode 100644 src/mytaglib/xiphcomment.h diff --git a/src/mytaglib/aifffile.h b/src/mytaglib/aifffile.h deleted file mode 100644 index b9b0809..0000000 --- a/src/mytaglib/aifffile.h +++ /dev/null @@ -1,102 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_AIFFFILE_H -#define TAGLIB_AIFFFILE_H - -#include "rifffile.h" -#include "id3v2tag.h" -#include "aiffproperties.h" - -namespace TagLib { - - namespace RIFF { - - //! An implementation of AIFF metadata - - /*! - * This is implementation of AIFF metadata. - * - * This supports an ID3v2 tag as well as reading stream from the ID3 RIFF - * chunk as well as properties from the file. - */ - - namespace AIFF { - - //! An implementation of TagLib::File with AIFF specific methods - - /*! - * This implements and provides an interface for AIFF files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to AIFF files. - */ - - class TAGLIB_EXPORT File : public TagLib::RIFF::File - { - public: - /*! - * Contructs an AIFF file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. - */ - virtual ID3v2::Tag *tag() const; - - /*! - * Returns the AIFF::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - class FilePrivate; - FilePrivate *d; - }; - } - } -} - -#endif diff --git a/src/mytaglib/aiffproperties.h b/src/mytaglib/aiffproperties.h deleted file mode 100644 index 4c578dc..0000000 --- a/src/mytaglib/aiffproperties.h +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_AIFFPROPERTIES_H -#define TAGLIB_AIFFPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace RIFF { - - namespace AIFF { - - class File; - - //! An implementation of audio property reading for AIFF - - /*! - * This reads the data from an AIFF stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of AIFF::Properties with the data read from the - * ByteVector \a data. - */ - Properties(const ByteVector &data, ReadStyle style); - - /*! - * Destroys this AIFF::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - int sampleWidth() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(const ByteVector &data); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - } -} - -#endif diff --git a/src/mytaglib/apefile.h b/src/mytaglib/apefile.h deleted file mode 100644 index a4bc80d..0000000 --- a/src/mytaglib/apefile.h +++ /dev/null @@ -1,171 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - (original WavPack implementation) - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEFILE_H -#define TAGLIB_APEFILE_H - -#include "tfile.h" -#include "taglib_export.h" -#include "apeproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of APE metadata - - /*! - * This is implementation of APE metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. - */ - - namespace APE { - - //! An implementation of TagLib::File with APE specific methods - - /*! - * This implements and provides an interface APE WavPack files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to APE files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches APE tags. - APE = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Contructs an WavPack file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Returns the APE::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - * - * \note According to the official Monkey's Audio SDK, an APE file - * can only have either ID3V1 or APE tags, so a parameter is used here. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist. If there is already an APE tag, the - * new ID3v1 tag will be placed after it. - * - * \note The Tag <b>is still</b> owned by the APE::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * a APE tag if one does not exist. - * - * \note The Tag <b>is still</b> owned by the APE::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findID3v1(); - long findAPE(); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/apefooter.h b/src/mytaglib/apefooter.h deleted file mode 100644 index 080f930..0000000 --- a/src/mytaglib/apefooter.h +++ /dev/null @@ -1,173 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEFOOTER_H -#define TAGLIB_APEFOOTER_H - -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace APE { - - //! An implementation of APE footers - - /*! - * This class implements APE footers (and headers). It attempts to follow, both - * semantically and programatically, the structure specified in - * the APE v2.0 standard. The API is based on the properties of APE footer and - * headers specified there. - */ - - class TAGLIB_EXPORT Footer - { - public: - /*! - * Constructs an empty APE footer. - */ - Footer(); - - /*! - * Constructs an APE footer based on \a data. parse() is called - * immediately. - */ - Footer(const ByteVector &data); - - /*! - * Destroys the footer. - */ - virtual ~Footer(); - - /*! - * Returns the version number. (Note: This is the 1000 or 2000.) - */ - uint version() const; - - /*! - * Returns true if a header is present in the tag. - */ - bool headerPresent() const; - - /*! - * Returns true if a footer is present in the tag. - */ - bool footerPresent() const; - - /*! - * Returns true this is actually the header. - */ - bool isHeader() const; - - /*! - * Sets whether the header should be rendered or not - */ - void setHeaderPresent(bool b) const; - - /*! - * Returns the number of items in the tag. - */ - uint itemCount() const; - - /*! - * Set the item count to \a s. - * \see itemCount() - */ - void setItemCount(uint s); - - /*! - * Returns the tag size in bytes. This is the size of the frame content and footer. - * The size of the \e entire tag will be this plus the header size, if present. - * - * \see completeTagSize() - */ - uint tagSize() const; - - /*! - * Returns the tag size, including if present, the header - * size. - * - * \see tagSize() - */ - uint completeTagSize() const; - - /*! - * Set the tag size to \a s. - * \see tagSize() - */ - void setTagSize(uint s); - - /*! - * Returns the size of the footer. Presently this is always 32 bytes. - */ - static uint size(); - - /*! - * Returns the string used to identify an APE tag inside of a file. - * Presently this is always "APETAGEX". - */ - static ByteVector fileIdentifier(); - - /*! - * Sets the data that will be used as the footer. 32 bytes, - * starting from \a data will be used. - */ - void setData(const ByteVector &data); - - /*! - * Renders the footer back to binary format. - */ - ByteVector renderFooter() const; - - /*! - * Renders the header corresponding to the footer. If headerPresent is - * set to false, it returns an empty ByteVector. - */ - ByteVector renderHeader() const; - - protected: - /*! - * Called by setData() to parse the footer data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - /*! - * Called by renderFooter and renderHeader - */ - ByteVector render(bool isHeader) const; - - private: - Footer(const Footer &); - Footer &operator=(const Footer &); - - class FooterPrivate; - FooterPrivate *d; - }; - - } -} - -#endif diff --git a/src/mytaglib/apeitem.h b/src/mytaglib/apeitem.h deleted file mode 100644 index 01fcc76..0000000 --- a/src/mytaglib/apeitem.h +++ /dev/null @@ -1,204 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEITEM_H -#define TAGLIB_APEITEM_H - -#include "tbytevector.h" -#include "tstring.h" -#include "tstringlist.h" - -namespace TagLib { - - namespace APE { - - //! An implementation of APE-items - - /*! - * This class provides the features of items in the APEv2 standard. - */ - class TAGLIB_EXPORT Item - { - public: - /*! - * Enum of types an Item can have. The value of 3 is reserved. - */ - enum ItemTypes { - //! Item contains text information coded in UTF-8 - Text = 0, - //! Item contains binary information - Binary = 1, - //! Item is a locator of external stored information - Locator = 2 - }; - /*! - * Constructs an empty item. - */ - Item(); - - /*! - * Constructs an item with \a key and \a value. - */ - // BIC: Remove this, StringList has a constructor from a single string - Item(const String &key, const String &value); - - /*! - * Constructs an item with \a key and \a values. - */ - Item(const String &key, const StringList &values); - - /*! - * Construct an item as a copy of \a item. - */ - Item(const Item &item); - - /*! - * Destroys the item. - */ - virtual ~Item(); - - /*! - * Copies the contents of \a item into this item. - */ - Item &operator=(const Item &item); - - /*! - * Returns the key. - */ - String key() const; - - /*! - * Returns the binary value. - * - * \deprecated This will be removed in the next binary incompatible version - * as it is not kept in sync with the things that are set using setValue() - * and friends. - */ - ByteVector value() const; - - /*! - * Sets the key for the item to \a key. - */ - void setKey(const String &key); - - /*! - * Sets the value of the item to \a value and clears any previous contents. - * - * \see toString() - */ - void setValue(const String &value); - - /*! - * Sets the value of the item to the list of values in \a value and clears - * any previous contents. - * - * \see toStringList() - */ - void setValues(const StringList &values); - - /*! - * Appends \a value to create (or extend) the current list of values. - * - * \see toString() - */ - void appendValue(const String &value); - - /*! - * Appends \a values to extend the current list of values. - * - * \see toStringList() - */ - void appendValues(const StringList &values); - - /*! - * Returns the size of the full item. - */ - int size() const; - - /*! - * Returns the value as a single string. In case of multiple strings, - * the first is returned. - */ - String toString() const; - - /*! - * \deprecated - * \see values - */ - StringList toStringList() const; - - /*! - * Returns the list of values. - */ - StringList values() const; - - /*! - * Render the item to a ByteVector. - */ - ByteVector render() const; - - /*! - * Parse the item from the ByteVector \a data. - */ - void parse(const ByteVector& data); - - /*! - * Set the item to read-only. - */ - void setReadOnly(bool readOnly); - - /*! - * Return true if the item is read-only. - */ - bool isReadOnly() const; - - /*! - * Sets the type of the item to \a type. - * - * \see ItemTypes - */ - void setType(ItemTypes type); - - /*! - * Returns the type of the item. - */ - ItemTypes type() const; - - /*! - * Returns if the item has any real content. - */ - bool isEmpty() const; - - private: - class ItemPrivate; - ItemPrivate *d; - }; - } - -} - -#endif - - diff --git a/src/mytaglib/apeproperties.h b/src/mytaglib/apeproperties.h deleted file mode 100644 index 8b543a5..0000000 --- a/src/mytaglib/apeproperties.h +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - (original WavPack implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APEPROPERTIES_H -#define TAGLIB_APEPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace APE { - - class File; - - //! An implementation of audio property reading for APE - - /*! - * This reads the data from an APE stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of APE::Properties with the data read from the - * ByteVector \a data. - */ - Properties(File *f, ReadStyle style = Average); - - /*! - * Destroys this APE::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns number of bits per sample. - */ - int bitsPerSample() const; - - /*! - * Returns APE version. - */ - int version() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - long findDescriptor(); - long findID3v2(); - - void analyzeCurrent(); - void analyzeOld(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/apetag.h b/src/mytaglib/apetag.h deleted file mode 100644 index 13efd5e..0000000 --- a/src/mytaglib/apetag.h +++ /dev/null @@ -1,170 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_APETAG_H -#define TAGLIB_APETAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "tmap.h" -#include "tstring.h" -#include "taglib_export.h" - -#include "apeitem.h" - -namespace TagLib { - - class File; - - //! An implementation of the APE tagging format - - namespace APE { - - class Footer; - - /*! - * A mapping between a list of item names, or keys, and the associated item. - * - * \see APE::Tag::itemListMap() - */ - typedef Map<const String, Item> ItemListMap; - - - //! An APE tag implementation - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Create an APE tag with default values. - */ - Tag(); - - /*! - * Create an APE tag and parse the data in \a file with APE footer at - * \a tagOffset. - */ - Tag(TagLib::File *file, long footerLocation); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Renders the in memory values to a ByteVector suitable for writing to - * the file. - */ - ByteVector render() const; - - /*! - * Returns the string "APETAGEX" suitable for usage in locating the tag in a - * file. - */ - static ByteVector fileIdentifier(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - - /*! - * Returns a pointer to the tag's footer. - */ - Footer *footer() const; - - /*! - * Returns a reference to the item list map. This is an ItemListMap of - * all of the items in the tag. - * - * This is the most powerfull structure for accessing the items of the tag. - * - * APE tags are case-insensitive, all keys in this map have been converted - * to upper case. - * - * \warning You should not modify this data structure directly, instead - * use setItem() and removeItem(). - */ - const ItemListMap &itemListMap() const; - - /*! - * Removes the \a key item from the tag - */ - void removeItem(const String &key); - - /*! - * Adds to the item specified by \a key the data \a value. If \a replace - * is true, then all of the other values on the same key will be removed - * first. - */ - void addValue(const String &key, const String &value, bool replace = true); - - /*! - * Sets the \a key item to the value of \a item. If an item with the \a key is already - * present, it will be replaced. - */ - void setItem(const String &key, const Item &item); - - /*! - * Returns true if the tag does not contain any data. - */ - bool isEmpty() const; - - protected: - - /*! - * Reads from the file specified in the constructor. - */ - void read(); - - /*! - * Parses the body of the tag in \a data. - */ - void parse(const ByteVector &data); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/asfattribute.h b/src/mytaglib/asfattribute.h deleted file mode 100644 index 5618699..0000000 --- a/src/mytaglib/asfattribute.h +++ /dev/null @@ -1,203 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFATTRIBUTE_H -#define TAGLIB_ASFATTRIBUTE_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "asfpicture.h" - -namespace TagLib -{ - - namespace ASF - { - - class File; - class Picture; - - class TAGLIB_EXPORT Attribute - { - public: - - /*! - * Enum of types an Attribute can have. - */ - enum AttributeTypes { - UnicodeType = 0, - BytesType = 1, - BoolType = 2, - DWordType = 3, - QWordType = 4, - WordType = 5, - GuidType = 6 - }; - - /*! - * Constructs an empty attribute. - */ - Attribute(); - - /*! - * Constructs an attribute with \a key and a UnicodeType \a value. - */ - Attribute(const String &value); - - /*! - * Constructs an attribute with \a key and a BytesType \a value. - */ - Attribute(const ByteVector &value); - - /*! - * Constructs an attribute with \a key and a Picture \a value. - * - * This attribute is compatible with the ID3 frame, APIC. The ID3 specification for the APIC frame stipulates that, - * while there may be any number of APIC frames associated with a file, - * only one may be of type 1 and only one may be of type 2. - * - * The specification also states that the description of the picture can be no longer than 64 characters, but can be empty. - * WM/Picture attributes added with TagLib::ASF are not automatically validated to conform to ID3 specifications. - * You must add code in your application to perform validations if you want to maintain complete compatibility with ID3. - */ - Attribute(const Picture &value); - - /*! - * Constructs an attribute with \a key and a DWordType \a value. - */ - Attribute(unsigned int value); - - /*! - * Constructs an attribute with \a key and a QWordType \a value. - */ - Attribute(unsigned long long value); - - /*! - * Constructs an attribute with \a key and a WordType \a value. - */ - Attribute(unsigned short value); - - /*! - * Constructs an attribute with \a key and a BoolType \a value. - */ - Attribute(bool value); - - /*! - * Construct an attribute as a copy of \a other. - */ - Attribute(const Attribute &item); - - /*! - * Copies the contents of \a other into this item. - */ - ASF::Attribute &operator=(const Attribute &other); - - /*! - * Destroys the attribute. - */ - virtual ~Attribute(); - - /*! - * Returns type of the value. - */ - AttributeTypes type() const; - - /*! - * Returns the BoolType \a value. - */ - unsigned short toBool() const; - - /*! - * Returns the WordType \a value. - */ - unsigned short toUShort() const; - - /*! - * Returns the DWordType \a value. - */ - unsigned int toUInt() const; - - /*! - * Returns the QWordType \a value. - */ - unsigned long long toULongLong() const; - - /*! - * Returns the UnicodeType \a value. - */ - String toString() const; - - /*! - * Returns the BytesType \a value. - */ - ByteVector toByteVector() const; - - /*! - * Returns the Picture \a value. - */ - Picture toPicture() const; - - /*! - * Returns the language number, or 0 is no stream number was set. - */ - int language() const; - - /*! - * Sets the language number. - */ - void setLanguage(int value); - - /*! - * Returns the stream number, or 0 is no stream number was set. - */ - int stream() const; - - /*! - * Sets the stream number. - */ - void setStream(int value); - -#ifndef DO_NOT_DOCUMENT - /* THIS IS PRIVATE, DON'T TOUCH IT! */ - String parse(ASF::File &file, int kind = 0); -#endif - - //! Returns the size of the stored data - int dataSize() const; - - private: - friend class File; - - ByteVector render(const String &name, int kind = 0) const; - - class AttributePrivate; - AttributePrivate *d; - }; - } - -} - -#endif diff --git a/src/mytaglib/asffile.h b/src/mytaglib/asffile.h deleted file mode 100644 index 9242aa6..0000000 --- a/src/mytaglib/asffile.h +++ /dev/null @@ -1,120 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFFILE_H -#define TAGLIB_ASFFILE_H - -#include "tag.h" -#include "tfile.h" -#include "taglib_export.h" -#include "asfproperties.h" -#include "asftag.h" - -namespace TagLib { - - //! An implementation of ASF (WMA) metadata - namespace ASF { - - /*! - * This implements and provides an interface for ASF files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to ASF files. - */ - class TAGLIB_EXPORT File : public TagLib::File - { - public: - - /*! - * Contructs an ASF file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. - */ - File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to the ASF tag of the file. - * - * ASF::Tag implements the tag interface, so this serves as the - * reimplementation of TagLib::File::tag(). - * - * \note The Tag <b>is still</b> owned by the ASF::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - virtual Tag *tag() const; - - /*! - * Returns the ASF audio properties for this file. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - private: - - int readBYTE(); - int readWORD(); - unsigned int readDWORD(); - long long readQWORD(); - static ByteVector renderString(const String &str, bool includeLength = false); - String readString(int len); - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - friend class Attribute; - friend class Picture; - - class BaseObject; - class UnknownObject; - class FilePropertiesObject; - class StreamPropertiesObject; - class ContentDescriptionObject; - class ExtendedContentDescriptionObject; - class HeaderExtensionObject; - class MetadataObject; - class MetadataLibraryObject; - - class FilePrivate; - FilePrivate *d; - }; - - } - -} - -#endif diff --git a/src/mytaglib/asfpicture.h b/src/mytaglib/asfpicture.h deleted file mode 100644 index 5c1bfbf..0000000 --- a/src/mytaglib/asfpicture.h +++ /dev/null @@ -1,217 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Anton Sergunov - email : setosha@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef ASFPICTURE_H -#define ASFPICTURE_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "attachedpictureframe.h" - -namespace TagLib -{ - namespace ASF - { - - //! An ASF attached picture interface implementation - - /*! - * This is an implementation of ASF attached pictures interface. Pictures may be - * included in attributes, one per WM/Picture attribute (but there may be multiple WM/Picture - * attribute in a single tag). These pictures are usually in either JPEG or - * PNG format. - * \see Attribute::toPicture() - * \see Attribute::Attribute(const Picture& picture) - */ - class TAGLIB_EXPORT Picture { - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - /*! - * Constructs an empty picture. - */ - Picture(); - - /*! - * Construct an picture as a copy of \a other. - */ - Picture(const Picture& other); - - /*! - * Destroys the picture. - */ - virtual ~Picture(); - - /*! - * Copies the contents of \a other into this picture. - */ - Picture& operator=(const Picture& other); - - /*! - * Returns true if Picture stores valid picture - */ - bool isValid() const; - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - * \see setMimeType(const String &) - * \see picture() - * \see setPicture(const ByteArray&) - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - * \see setMimeType(const String &) - * \see picture() - * \see setPicture(const ByteArray&) - */ - void setMimeType(const String &value); - - /*! - * Returns the type of the image. - * - * \see Type - * \see setType() - */ - Type type() const; - - /*! - * Sets the type for the image. - * - * \see Type - * \see type() - */ - void setType(const ASF::Picture::Type& t); - - /*! - * Returns a text description of the image. - * - * \see setDescription() - */ - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - * - * \see description() - */ - void setDescription(const String &desc); - - /*! - * Returns the image data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setPicture() - * \see mimeType() - */ - ByteVector picture() const; - - /*! - * Sets the image data to \a p. \a p should be of the type specified in - * this frame's mime-type specification. - * - * \see picture() - * \see mimeType() - * \see setMimeType() - */ - void setPicture(const ByteVector &p); - - /*! - * Returns picture as binary raw data \a value - */ - ByteVector render() const; - - /*! - * Returns picture as binary raw data \a value - */ - int dataSize() const; - -#ifndef DO_NOT_DOCUMENT - /* THIS IS PRIVATE, DON'T TOUCH IT! */ - void parse(const ByteVector& ); - static Picture fromInvalid(); - friend class Attribute; -#endif - private: - struct PicturePriavte; - PicturePriavte *d; - }; - } -} - -#endif // ASFPICTURE_H diff --git a/src/mytaglib/asfproperties.h b/src/mytaglib/asfproperties.h deleted file mode 100644 index 290eac7..0000000 --- a/src/mytaglib/asfproperties.h +++ /dev/null @@ -1,74 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFPROPERTIES_H -#define TAGLIB_ASFPROPERTIES_H - -#include "audioproperties.h" -#include "tstring.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ASF { - - //! An implementation of ASF audio properties - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - - /*! - * Create an instance of ASF::Properties. - */ - Properties(); - - /*! - * Destroys this ASF::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - -#ifndef DO_NOT_DOCUMENT - void setLength(int value); - void setBitrate(int value); - void setSampleRate(int value); - void setChannels(int value); -#endif - - private: - class PropertiesPrivate; - PropertiesPrivate *d; - }; - - } - -} - -#endif diff --git a/src/mytaglib/asftag.h b/src/mytaglib/asftag.h deleted file mode 100644 index a6c49df..0000000 --- a/src/mytaglib/asftag.h +++ /dev/null @@ -1,186 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFTAG_H -#define TAGLIB_ASFTAG_H - -#include "tag.h" -#include "tlist.h" -#include "tmap.h" -#include "taglib_export.h" -#include "asfattribute.h" - -namespace TagLib { - - namespace ASF { - - typedef List<Attribute> AttributeList; - typedef Map<String, AttributeList> AttributeListMap; - - class TAGLIB_EXPORT Tag : public TagLib::Tag { - - friend class File; - - public: - - Tag(); - - virtual ~Tag(); - - /*! - * Returns the track name. - */ - virtual String title() const; - - /*! - * Returns the artist name. - */ - virtual String artist() const; - - /*! - * Returns the album name; if no album name is present in the tag - * String::null will be returned. - */ - virtual String album() const; - - /*! - * Returns the track comment. - */ - virtual String comment() const; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String genre() const; - - /*! - * Returns the rating. - */ - virtual String rating() const; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String copyright() const; - - /*! - * Returns the year; if there is no year set, this will return 0. - */ - virtual uint year() const; - - /*! - * Returns the track number; if there is no track number set, this will - * return 0. - */ - virtual uint track() const; - - /*! - * Sets the title to \a s. - */ - virtual void setTitle(const String &s); - - /*! - * Sets the artist to \a s. - */ - virtual void setArtist(const String &s); - - /*! - * Sets the album to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setAlbum(const String &s); - - /*! - * Sets the comment to \a s. - */ - virtual void setComment(const String &s); - - /*! - * Sets the rating to \a s. - */ - virtual void setRating(const String &s); - - /*! - * Sets the copyright to \a s. - */ - virtual void setCopyright(const String &s); - - /*! - * Sets the genre to \a s. - */ - virtual void setGenre(const String &s); - - /*! - * Sets the year to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setYear(uint i); - - /*! - * Sets the track to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setTrack(uint i); - - /*! - * Returns true if the tag does not contain any data. This should be - * reimplemented in subclasses that provide more than the basic tagging - * abilities in this class. - */ - virtual bool isEmpty() const; - - /*! - * Returns a reference to the item list map. This is an AttributeListMap of - * all of the items in the tag. - * - * This is the most powerfull structure for accessing the items of the tag. - */ - AttributeListMap &attributeListMap(); - - /*! - * Removes the \a key attribute from the tag - */ - void removeItem(const String &name); - - /*! - * Sets the \a key attribute to the value of \a attribute. If an attribute - * with the \a key is already present, it will be replaced. - */ - void setAttribute(const String &name, const Attribute &attribute); - - /*! - * Sets the \a key attribute to the value of \a attribute. If an attribute - * with the \a key is already present, it will be added to the list. - */ - void addAttribute(const String &name, const Attribute &attribute); - - private: - - class TagPrivate; - TagPrivate *d; - }; - } -} -#endif diff --git a/src/mytaglib/attachedpictureframe.h b/src/mytaglib/attachedpictureframe.h deleted file mode 100644 index 55067bd..0000000 --- a/src/mytaglib/attachedpictureframe.h +++ /dev/null @@ -1,230 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ATTACHEDPICTUREFRAME_H -#define TAGLIB_ATTACHEDPICTUREFRAME_H - -#include "id3v2frame.h" -#include "id3v2header.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 attached picture frame implementation - - /*! - * This is an implementation of ID3v2 attached pictures. Pictures may be - * included in tags, one per APIC frame (but there may be multiple APIC - * frames in a single tag). These pictures are usually in either JPEG or - * PNG format. - */ - - class TAGLIB_EXPORT AttachedPictureFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - /*! - * Constructs an empty picture frame. The description, content and text - * encoding should be set manually. - */ - AttachedPictureFrame(); - - /*! - * Constructs an AttachedPicture frame based on \a data. - */ - explicit AttachedPictureFrame(const ByteVector &data); - - /*! - * Destroys the AttahcedPictureFrame instance. - */ - virtual ~AttachedPictureFrame(); - - /*! - * Returns a string containing the description and mime-type - */ - virtual String toString() const; - - /*! - * Returns the text encoding used for the description. - * - * \see setTextEncoding() - * \see description() - */ - String::Type textEncoding() const; - - /*! - * Set the text encoding used for the description. - * - * \see description() - */ - void setTextEncoding(String::Type t); - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - void setMimeType(const String &m); - - /*! - * Returns the type of the image. - * - * \see Type - * \see setType() - */ - Type type() const; - - /*! - * Sets the type for the image. - * - * \see Type - * \see type() - */ - void setType(Type t); - - /*! - * Returns a text description of the image. - * - * \see setDescription() - * \see textEncoding() - * \see setTextEncoding() - */ - - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - * - * \see description() - * \see textEncoding() - * \see setTextEncoding() - */ - - void setDescription(const String &desc); - - /*! - * Returns the image data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setPicture() - * \see mimeType() - */ - ByteVector picture() const; - - /*! - * Sets the image data to \a p. \a p should be of the type specified in - * this frame's mime-type specification. - * - * \see picture() - * \see mimeType() - * \see setMimeType() - */ - void setPicture(const ByteVector &p); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - class AttachedPictureFramePrivate; - AttachedPictureFramePrivate *d; - - private: - AttachedPictureFrame(const AttachedPictureFrame &); - AttachedPictureFrame &operator=(const AttachedPictureFrame &); - AttachedPictureFrame(const ByteVector &data, Header *h); - - }; - - //! support for ID3v2.2 PIC frames - class TAGLIB_EXPORT AttachedPictureFrameV22 : public AttachedPictureFrame - { - protected: - virtual void parseFields(const ByteVector &data); - private: - AttachedPictureFrameV22(const ByteVector &data, Header *h); - friend class FrameFactory; - }; - } -} - -#endif diff --git a/src/mytaglib/audioproperties.h b/src/mytaglib/audioproperties.h deleted file mode 100644 index e9844fa..0000000 --- a/src/mytaglib/audioproperties.h +++ /dev/null @@ -1,110 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_AUDIOPROPERTIES_H -#define TAGLIB_AUDIOPROPERTIES_H - -#include "taglib_export.h" - -namespace TagLib { - - //! A simple, abstract interface to common audio properties - - /*! - * The values here are common to most audio formats. For more specific, codec - * dependant values, please see see the subclasses APIs. This is meant to - * compliment the TagLib::File and TagLib::Tag APIs in providing a simple - * interface that is sufficient for most applications. - */ - - class TAGLIB_EXPORT AudioProperties - { - public: - - /*! - * Reading audio properties from a file can sometimes be very time consuming - * and for the most accurate results can often involve reading the entire - * file. Because in many situations speed is critical or the accuracy of the - * values is not particularly important this allows the level of desired - * accuracy to be set. - */ - enum ReadStyle { - //! Read as little of the file as possible - Fast, - //! Read more of the file and make better values guesses - Average, - //! Read as much of the file as needed to report accurate values - Accurate - }; - - /*! - * Destroys this AudioProperties instance. - */ - virtual ~AudioProperties(); - - /*! - * Returns the length of the file in seconds. - */ - virtual int length() const = 0; - - /*! - * Returns the most appropriate bit rate for the file in kb/s. For constant - * bitrate formats this is simply the bitrate of the file. For variable - * bitrate formats this is either the average or nominal bitrate. - */ - virtual int bitrate() const = 0; - - /*! - * Returns the sample rate in Hz. - */ - virtual int sampleRate() const = 0; - - /*! - * Returns the number of audio channels. - */ - virtual int channels() const = 0; - - protected: - - /*! - * Construct an audio properties instance. This is protected as this class - * should not be instantiated directly, but should be instantiated via its - * subclasses and can be fetched from the FileRef or File APIs. - * - * \see ReadStyle - */ - AudioProperties(ReadStyle style); - - private: - AudioProperties(const AudioProperties &); - AudioProperties &operator=(const AudioProperties &); - - class AudioPropertiesPrivate; - AudioPropertiesPrivate *d; - }; - -} - -#endif diff --git a/src/mytaglib/commentsframe.h b/src/mytaglib/commentsframe.h deleted file mode 100644 index def01dc..0000000 --- a/src/mytaglib/commentsframe.h +++ /dev/null @@ -1,168 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_COMMENTSFRAME_H -#define TAGLIB_COMMENTSFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 comments - - /*! - * This implements the ID3v2 comment format. An ID3v2 comment concists of - * a language encoding, a description and a single text field. - */ - - class TAGLIB_EXPORT CommentsFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty comment frame that will use the text encoding - * \a encoding. - */ - explicit CommentsFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a comment based on the data in \a data. - */ - explicit CommentsFrame(const ByteVector &data); - - /*! - * Destroys this CommentFrame instance. - */ - virtual ~CommentsFrame(); - - /*! - * Returns the text of this comment. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the language encoding as a 3 byte encoding as specified by - * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>. - * - * \note Most taggers simply ignore this value. - * - * \see setLanguage() - */ - ByteVector language() const; - - /*! - * Returns the description of this comment. - * - * \note Most taggers simply ignore this value. - * - * \see setDescription() - */ - String description() const; - - /*! - * Returns the text of this comment. - * - * \see setText() - */ - String text() const; - - /*! - * Set the language using the 3 byte language code from - * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to - * \a languageCode. - * - * \see language() - */ - void setLanguage(const ByteVector &languageCode); - - /*! - * Sets the description of the comment to \a s. - * - * \see decription() - */ - void setDescription(const String &s); - - /*! - * Sets the text portion of the comment to \a s. - * - * \see text() - */ - virtual void setText(const String &s); - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Comments each have a unique description. This searches for a comment - * frame with the decription \a d and returns a pointer to it. If no - * frame is found that matches the given description null is returned. - * - * \see description() - */ - static CommentsFrame *findByDescription(const Tag *tag, const String &d); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - CommentsFrame(const ByteVector &data, Header *h); - CommentsFrame(const CommentsFrame &); - CommentsFrame &operator=(const CommentsFrame &); - - class CommentsFramePrivate; - CommentsFramePrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/fileref.h b/src/mytaglib/fileref.h deleted file mode 100644 index 0f0c21a..0000000 --- a/src/mytaglib/fileref.h +++ /dev/null @@ -1,263 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FILEREF_H -#define TAGLIB_FILEREF_H - -#include "tfile.h" -#include "tstringlist.h" - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - class Tag; - - //! This class provides a simple abstraction for creating and handling files - - /*! - * FileRef exists to provide a minimal, generic and value-based wrapper around - * a File. It is lightweight and implicitly shared, and as such suitable for - * pass-by-value use. This hides some of the uglier details of TagLib::File - * and the non-generic portions of the concrete file implementations. - * - * This class is useful in a "simple usage" situation where it is desirable - * to be able to get and set some of the tag information that is similar - * across file types. - * - * Also note that it is probably a good idea to plug this into your mime - * type system rather than using the constructor that accepts a file name using - * the FileTypeResolver. - * - * \see FileTypeResolver - * \see addFileTypeResolver() - */ - - class TAGLIB_EXPORT FileRef - { - public: - - //! A class for pluggable file type resolution. - - /*! - * This class is used to add extend TagLib's very basic file name based file - * type resolution. - * - * This can be accomplished with: - * - * \code - * - * class MyFileTypeResolver : FileTypeResolver - * { - * TagLib::File *createFile(TagLib::FileName *fileName, bool, AudioProperties::ReadStyle) - * { - * if(someCheckForAnMP3File(fileName)) - * return new TagLib::MPEG::File(fileName); - * return 0; - * } - * } - * - * FileRef::addFileTypeResolver(new MyFileTypeResolver); - * - * \endcode - * - * Naturally a less contrived example would be slightly more complex. This - * can be used to plug in mime-type detection systems or to add new file types - * to TagLib. - */ - - class TAGLIB_EXPORT FileTypeResolver - { - TAGLIB_IGNORE_MISSING_DESTRUCTOR - public: - /*! - * This method must be overridden to provide an additional file type - * resolver. If the resolver is able to determine the file type it should - * return a valid File object; if not it should return 0. - * - * \note The created file is then owned by the FileRef and should not be - * deleted. Deletion will happen automatically when the FileRef passes - * out of scope. - */ - virtual File *createFile(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle - audioPropertiesStyle = AudioProperties::Average) const = 0; - }; - - /*! - * Creates a null FileRef. - */ - FileRef(); - - /*! - * Create a FileRef from \a fileName. If \a readAudioProperties is true then - * the audio properties will be read using \a audioPropertiesStyle. If - * \a readAudioProperties is false then \a audioPropertiesStyle will be - * ignored. - * - * Also see the note in the class documentation about why you may not want to - * use this method in your application. - */ - explicit FileRef(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle - audioPropertiesStyle = AudioProperties::Average); - - /*! - * Contruct a FileRef using \a file. The FileRef now takes ownership of the - * pointer and will delete the File when it passes out of scope. - */ - explicit FileRef(File *file); - - /*! - * Make a copy of \a ref. - */ - FileRef(const FileRef &ref); - - /*! - * Destroys this FileRef instance. - */ - virtual ~FileRef(); - - /*! - * Returns a pointer to represented file's tag. - * - * \warning This pointer will become invalid when this FileRef and all - * copies pass out of scope. - * - * \warning Do not cast it to any subclasses of \class Tag. - * Use tag returning methods of appropriate subclasses of \class File instead. - * - * \see File::tag() - */ - Tag *tag() const; - - /*! - * Returns the audio properties for this FileRef. If no audio properties - * were read then this will returns a null pointer. - */ - AudioProperties *audioProperties() const; - - /*! - * Returns a pointer to the file represented by this handler class. - * - * As a general rule this call should be avoided since if you need to work - * with file objects directly, you are probably better served instantiating - * the File subclasses (i.e. MPEG::File) manually and working with their APIs. - * - * This <i>handle</i> exists to provide a minimal, generic and value-based - * wrapper around a File. Accessing the file directly generally indicates - * a moving away from this simplicity (and into things beyond the scope of - * FileRef). - * - * \warning This pointer will become invalid when this FileRef and all - * copies pass out of scope. - */ - File *file() const; - - /*! - * Saves the file. Returns true on success. - */ - bool save(); - - /*! - * Adds a FileTypeResolver to the list of those used by TagLib. Each - * additional FileTypeResolver is added to the front of a list of resolvers - * that are tried. If the FileTypeResolver returns zero the next resolver - * is tried. - * - * Returns a pointer to the added resolver (the same one that's passed in -- - * this is mostly so that static inialializers have something to use for - * assignment). - * - * \see FileTypeResolver - */ - static const FileTypeResolver *addFileTypeResolver(const FileTypeResolver *resolver); - - /*! - * As is mentioned elsewhere in this class's documentation, the default file - * type resolution code provided by TagLib only works by comparing file - * extensions. - * - * This method returns the list of file extensions that are used by default. - * - * The extensions are all returned in lowercase, though the comparison used - * by TagLib for resolution is case-insensitive. - * - * \note This does not account for any additional file type resolvers that - * are plugged in. Also note that this is not intended to replace a propper - * mime-type resolution system, but is just here for reference. - * - * \see FileTypeResolver - */ - static StringList defaultFileExtensions(); - - /*! - * Returns true if the file (and as such other pointers) are null. - */ - bool isNull() const; - - /*! - * Assign the file pointed to by \a ref to this FileRef. - */ - FileRef &operator=(const FileRef &ref); - - /*! - * Returns true if this FileRef and \a ref point to the same File object. - */ - bool operator==(const FileRef &ref) const; - - /*! - * Returns true if this FileRef and \a ref do not point to the same File - * object. - */ - bool operator!=(const FileRef &ref) const; - - /*! - * A simple implementation of file type guessing. If \a readAudioProperties - * is true then the audio properties will be read using - * \a audioPropertiesStyle. If \a readAudioProperties is false then - * \a audioPropertiesStyle will be ignored. - * - * \note You generally shouldn't use this method, but instead the constructor - * directly. - * - * \deprecated - */ - static File *create(FileName fileName, - bool readAudioProperties = true, - AudioProperties::ReadStyle audioPropertiesStyle = AudioProperties::Average); - - - private: - class FileRefPrivate; - FileRefPrivate *d; - }; - -} // namespace TagLib - -#endif diff --git a/src/mytaglib/flacfile.h b/src/mytaglib/flacfile.h deleted file mode 100644 index 64e67bc..0000000 --- a/src/mytaglib/flacfile.h +++ /dev/null @@ -1,222 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACFILE_H -#define TAGLIB_FLACFILE_H - -#include "taglib_export.h" -#include "tfile.h" -#include "tlist.h" - -#include "flacpicture.h" -#include "flacproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v2 { class FrameFactory; class Tag; } - namespace ID3v1 { class Tag; } - namespace Ogg { class XiphComment; } - - //! An implementation of FLAC metadata - - /*! - * This is implementation of FLAC metadata for non-Ogg FLAC files. At some - * point when Ogg / FLAC is more common there will be a similar implementation - * under the Ogg hiearchy. - * - * This supports ID3v1, ID3v2 and Xiph style comments as well as reading stream - * properties from the file. - */ - - namespace FLAC { - - //! An implementation of TagLib::File with FLAC specific methods - - /*! - * This implements and provides an interface for FLAC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to FLAC files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * Contructs a FLAC file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Contructs a FLAC file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - * - * If this file contains and ID3v2 tag the frames will be created using - * \a frameFactory. - */ - // BIC: merge with the above constructor - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be a union of XiphComment, - * ID3v1 and ID3v2 tags. - * - * \see ID3v2Tag() - * \see ID3v1Tag() - * \see XiphComment() - */ - virtual TagLib::Tag *tag() const; - - /*! - * Returns the FLAC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. This will primarily save the XiphComment, but - * will also keep any old ID3-tags up to date. If the file - * has no XiphComment, one will be constructed from the ID3-tags. - * - * This returns true if the save was successful. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v2 tag if one does not exist. - * - * \note The Tag <b>is still</b> owned by the FLAC::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist. - * - * \note The Tag <b>is still</b> owned by the FLAC::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the XiphComment for the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid XiphComment. If \a create is true it will create - * a XiphComment if one does not exist. - * - * \note The Tag <b>is still</b> owned by the FLAC::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - Ogg::XiphComment *xiphComment(bool create = false); - - /*! - * Set the ID3v2::FrameFactory to something other than the default. This - * can be used to specify the way that ID3v2 frames will be interpreted - * when - * - * \see ID3v2FrameFactory - */ - void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Returns the block of data used by FLAC::Properties for parsing the - * stream properties. - * - * \deprecated This method will not be public in a future release. - */ - ByteVector streamInfoData(); // BIC: remove - - /*! - * Returns the length of the audio-stream, used by FLAC::Properties for - * calculating the bitrate. - * - * \deprecated This method will not be public in a future release. - */ - long streamLength(); // BIC: remove - - /*! - * Returns a list of pictures attached to the FLAC file. - */ - List<Picture *> pictureList(); - - /*! - * Remove all attached images. - */ - void removePictures(); - - /*! - * Add a new picture to the file. The file takes ownership of the - * picture and will handle freeing its memory. - * - * \note The file will be saved only after calling save(). - */ - void addPicture(Picture *picture); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findID3v2(); - long findID3v1(); - ByteVector xiphCommentData() const; - long findPaddingBreak(long nextPageOffset, long targetOffset, bool *isLast); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/flacmetadatablock.h b/src/mytaglib/flacmetadatablock.h deleted file mode 100644 index 41bca31..0000000 --- a/src/mytaglib/flacmetadatablock.h +++ /dev/null @@ -1,75 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACMETADATABLOCK_H -#define TAGLIB_FLACMETADATABLOCK_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace FLAC { - - class TAGLIB_EXPORT MetadataBlock - { - public: - MetadataBlock(); - virtual ~MetadataBlock(); - - enum BlockType { - StreamInfo = 0, - Padding, - Application, - SeekTable, - VorbisComment, - CueSheet, - Picture - }; - - /*! - * Returns the FLAC metadata block type. - */ - virtual int code() const = 0; - - /*! - * Render the content of the block. - */ - virtual ByteVector render() const = 0; - - private: - MetadataBlock(const MetadataBlock &item); - MetadataBlock &operator=(const MetadataBlock &item); - - class MetadataBlockPrivate; - MetadataBlockPrivate *d; - }; - - } - -} - -#endif diff --git a/src/mytaglib/flacpicture.h b/src/mytaglib/flacpicture.h deleted file mode 100644 index b6def57..0000000 --- a/src/mytaglib/flacpicture.h +++ /dev/null @@ -1,208 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACPICTURE_H -#define TAGLIB_FLACPICTURE_H - -#include "tlist.h" -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "flacmetadatablock.h" - -namespace TagLib { - - namespace FLAC { - - class TAGLIB_EXPORT Picture : public MetadataBlock - { - public: - - /*! - * This describes the function or content of the picture. - */ - enum Type { - //! A type not enumerated below - Other = 0x00, - //! 32x32 PNG image that should be used as the file icon - FileIcon = 0x01, - //! File icon of a different size or format - OtherFileIcon = 0x02, - //! Front cover image of the album - FrontCover = 0x03, - //! Back cover image of the album - BackCover = 0x04, - //! Inside leaflet page of the album - LeafletPage = 0x05, - //! Image from the album itself - Media = 0x06, - //! Picture of the lead artist or soloist - LeadArtist = 0x07, - //! Picture of the artist or performer - Artist = 0x08, - //! Picture of the conductor - Conductor = 0x09, - //! Picture of the band or orchestra - Band = 0x0A, - //! Picture of the composer - Composer = 0x0B, - //! Picture of the lyricist or text writer - Lyricist = 0x0C, - //! Picture of the recording location or studio - RecordingLocation = 0x0D, - //! Picture of the artists during recording - DuringRecording = 0x0E, - //! Picture of the artists during performance - DuringPerformance = 0x0F, - //! Picture from a movie or video related to the track - MovieScreenCapture = 0x10, - //! Picture of a large, coloured fish - ColouredFish = 0x11, - //! Illustration related to the track - Illustration = 0x12, - //! Logo of the band or performer - BandLogo = 0x13, - //! Logo of the publisher (record company) - PublisherLogo = 0x14 - }; - - Picture(); - Picture(const ByteVector &data); - ~Picture(); - - /*! - * Returns the type of the image. - */ - Type type() const; - - /*! - * Sets the type of the image. - */ - void setType(Type type); - - /*! - * Returns the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - String mimeType() const; - - /*! - * Sets the mime type of the image. This should in most cases be - * "image/png" or "image/jpeg". - */ - void setMimeType(const String &m); - - /*! - * Returns a text description of the image. - */ - - String description() const; - - /*! - * Sets a textual description of the image to \a desc. - */ - - void setDescription(const String &desc); - - /*! - * Returns the width of the image. - */ - int width() const; - - /*! - * Sets the width of the image. - */ - void setWidth(int w); - - /*! - * Returns the height of the image. - */ - int height() const; - - /*! - * Sets the height of the image. - */ - void setHeight(int h); - - /*! - * Returns the color depth (in bits-per-pixel) of the image. - */ - int colorDepth() const; - - /*! - * Sets the color depth (in bits-per-pixel) of the image. - */ - void setColorDepth(int depth); - - /*! - * Returns the number of colors used on the image.. - */ - int numColors() const; - - /*! - * Sets the number of colors used on the image (for indexed images). - */ - void setNumColors(int numColors); - - /*! - * Returns the image data. - */ - ByteVector data() const; - - /*! - * Sets the image data. - */ - void setData(const ByteVector &data); - - /*! - * Returns the FLAC metadata block type. - */ - int code() const; - - /*! - * Render the content to the FLAC picture block format. - */ - ByteVector render() const; - - /*! - * Parse the picture data in the FLAC picture block format. - */ - bool parse(const ByteVector &rawData); - - private: - Picture(const Picture &item); - Picture &operator=(const Picture &item); - - class PicturePrivate; - PicturePrivate *d; - }; - - typedef List<Picture> PictureList; - - } - -} - -#endif diff --git a/src/mytaglib/flacproperties.h b/src/mytaglib/flacproperties.h deleted file mode 100644 index 5bba641..0000000 --- a/src/mytaglib/flacproperties.h +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACPROPERTIES_H -#define TAGLIB_FLACPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace FLAC { - - class File; - - //! An implementation of audio property reading for FLAC - - /*! - * This reads the data from an FLAC stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of FLAC::Properties with the data read from the - * ByteVector \a data. - */ - // BIC: switch to const reference - Properties(ByteVector data, long streamLength, ReadStyle style = Average); - - /*! - * Create an instance of FLAC::Properties with the data read from the - * FLAC::File \a file. - */ - // BIC: remove - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this FLAC::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns the sample width as read from the FLAC identification - * header. - */ - int sampleWidth() const; - - /*! - * Returns the MD5 signature of the uncompressed audio stream as read - * from the stream info header header. - */ - ByteVector signature() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/generalencapsulatedobjectframe.h b/src/mytaglib/generalencapsulatedobjectframe.h deleted file mode 100644 index 42f854c..0000000 --- a/src/mytaglib/generalencapsulatedobjectframe.h +++ /dev/null @@ -1,178 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Aaron VonderHaar - email : avh4@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_GENERALENCAPSULATEDOBJECT_H -#define TAGLIB_GENERALENCAPSULATEDOBJECT_H - -#include "id3v2frame.h" -#include "id3v2header.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 general encapsulated object frame implementation - - /*! - * This is an implementation of ID3v2 general encapsulated objects. - * Arbitrary binary data may be included in tags, stored in GEOB frames. - * There may be multiple GEOB frames in a single tag. Each GEOB it - * labelled with a content description (which may be blank), a required - * mime-type, and a file name (may be blank). The content description - * uniquely identifies the GEOB frame in the tag. - */ - - class TAGLIB_EXPORT GeneralEncapsulatedObjectFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * Constructs an empty object frame. The description, file name and text - * encoding should be set manually. - */ - GeneralEncapsulatedObjectFrame(); - - /*! - * Constructs a GeneralEncapsulatedObjectFrame frame based on \a data. - * - * \warning This is \em not data for the encapsulated object, for that use - * setObject(). This constructor is used when reading the frame from the - * disk. - */ - explicit GeneralEncapsulatedObjectFrame(const ByteVector &data); - - /*! - * Destroys the GeneralEncapsulatedObjectFrame instance. - */ - virtual ~GeneralEncapsulatedObjectFrame(); - - /*! - * Returns a string containing the description, file name and mime-type - */ - virtual String toString() const; - - /*! - * Returns the text encoding used for the description and file name. - * - * \see setTextEncoding() - * \see description() - * \see fileName() - */ - String::Type textEncoding() const; - - /*! - * Set the text encoding used for the description and file name. - * - * \see description() - * \see fileName() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns the mime type of the object. - */ - String mimeType() const; - - /*! - * Sets the mime type of the object. - */ - void setMimeType(const String &type); - - /*! - * Returns the file name of the object. - * - * \see setFileName() - */ - String fileName() const; - - /*! - * Sets the file name for the object. - * - * \see fileName() - */ - void setFileName(const String &name); - - /*! - * Returns the content description of the object. - * - * \see setDescription() - * \see textEncoding() - * \see setTextEncoding() - */ - - String description() const; - - /*! - * Sets the content description of the object to \a desc. - * - * \see description() - * \see textEncoding() - * \see setTextEncoding() - */ - - void setDescription(const String &desc); - - /*! - * Returns the object data as a ByteVector. - * - * \note ByteVector has a data() method that returns a const char * which - * should make it easy to export this data to external programs. - * - * \see setObject() - * \see mimeType() - */ - ByteVector object() const; - - /*! - * Sets the object data to \a data. \a data should be of the type specified in - * this frame's mime-type specification. - * - * \see object() - * \see mimeType() - * \see setMimeType() - */ - void setObject(const ByteVector &object); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h); - GeneralEncapsulatedObjectFrame(const GeneralEncapsulatedObjectFrame &); - GeneralEncapsulatedObjectFrame &operator=(const GeneralEncapsulatedObjectFrame &); - - class GeneralEncapsulatedObjectFramePrivate; - GeneralEncapsulatedObjectFramePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/id3v1genres.h b/src/mytaglib/id3v1genres.h deleted file mode 100644 index 271f725..0000000 --- a/src/mytaglib/id3v1genres.h +++ /dev/null @@ -1,66 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V1GENRE_H -#define TAGLIB_ID3V1GENRE_H - -#include "tmap.h" -#include "tstringlist.h" -#include "taglib_export.h" - -namespace TagLib { - namespace ID3v1 { - - typedef Map<String, int> GenreMap; - - /*! - * Returns the list of canonical ID3v1 genre names in the order that they - * are listed in the standard. - */ - StringList TAGLIB_EXPORT genreList(); - - /*! - * A "reverse mapping" that goes from the canonical ID3v1 genre name to the - * respective genre number. genreMap()["Rock"] == - */ - GenreMap TAGLIB_EXPORT genreMap(); - - /*! - * Returns the name of the genre at \a index in the ID3v1 genre list. If - * \a index is out of range -- less than zero or greater than 146 -- a null - * string will be returned. - */ - String TAGLIB_EXPORT genre(int index); - - /*! - * Returns the genre index for the (case sensitive) genre \a name. If the - * genre is not in the list 255 (which signifies an unknown genre in ID3v1) - * will be returned. - */ - int TAGLIB_EXPORT genreIndex(const String &name); - } -} - -#endif diff --git a/src/mytaglib/id3v1tag.h b/src/mytaglib/id3v1tag.h deleted file mode 100644 index fad485e..0000000 --- a/src/mytaglib/id3v1tag.h +++ /dev/null @@ -1,181 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V1TAG_H -#define TAGLIB_ID3V1TAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - class File; - - //! An ID3v1 implementation - - namespace ID3v1 { - - //! A abstraction for the string to data encoding in ID3v1 tags. - - /*! - * ID3v1 should in theory always contain ISO-8859-1 (Latin1) data. In - * practice it does not. TagLib by default only supports ISO-8859-1 data - * in ID3v1 tags. - * - * However by subclassing this class and reimplementing parse() and render() - * and setting your reimplementation as the default with - * ID3v1::Tag::setStringHandler() you can define how you would like these - * transformations to be done. - * - * \warning It is advisable <b>not</b> to write non-ISO-8859-1 data to ID3v1 - * tags. Please consider disabling the writing of ID3v1 tags in the case - * that the data is not ISO-8859-1. - * - * \see ID3v1::Tag::setStringHandler() - */ - - class TAGLIB_EXPORT StringHandler - { - TAGLIB_IGNORE_MISSING_DESTRUCTOR - public: - // BIC: Add virtual destructor. - - /*! - * Decode a string from \a data. The default implementation assumes that - * \a data is an ISO-8859-1 (Latin1) character array. - */ - virtual String parse(const ByteVector &data) const; - - /*! - * Encode a ByteVector with the data from \a s. The default implementation - * assumes that \a s is an ISO-8859-1 (Latin1) string. If the string is - * does not conform to ISO-8859-1, no value is written. - * - * \warning It is recommended that you <b>not</b> override this method, but - * instead do not write an ID3v1 tag in the case that the data is not - * ISO-8859-1. - */ - virtual ByteVector render(const String &s) const; - }; - - //! The main class in the ID3v1 implementation - - /*! - * This is an implementation of the ID3v1 format. ID3v1 is both the simplist - * and most common of tag formats but is rather limited. Because of its - * pervasiveness and the way that applications have been written around the - * fields that it provides, the generic TagLib::Tag API is a mirror of what is - * provided by ID3v1. - * - * ID3v1 tags should generally only contain Latin1 information. However because - * many applications do not follow this rule there is now support for overriding - * the ID3v1 string handling using the ID3v1::StringHandler class. Please see - * the documentation for that class for more information. - * - * \see StringHandler - * - * \note Most fields are truncated to a maximum of 28-30 bytes. The - * truncation happens automatically when the tag is rendered. - */ - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Create an ID3v1 tag with default values. - */ - Tag(); - - /*! - * Create an ID3v1 tag and parse the data in \a file starting at - * \a tagOffset. - */ - Tag(File *file, long tagOffset); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Renders the in memory values to a ByteVector suitable for writing to - * the file. - */ - ByteVector render() const; - - /*! - * Returns the string "TAG" suitable for usage in locating the tag in a - * file. - */ - static ByteVector fileIdentifier(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - - /*! - * Sets the string handler that decides how the ID3v1 data will be - * converted to and from binary data. - * - * \see StringHandler - */ - static void setStringHandler(const StringHandler *handler); - - protected: - /*! - * Reads from the file specified in the constructor. - */ - void read(); - /*! - * Pareses the body of the tag in \a data. - */ - void parse(const ByteVector &data); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/id3v2extendedheader.h b/src/mytaglib/id3v2extendedheader.h deleted file mode 100644 index d7227e9..0000000 --- a/src/mytaglib/id3v2extendedheader.h +++ /dev/null @@ -1,93 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2EXTENDEDHEADER_H -#define TAGLIB_ID3V2EXTENDEDHEADER_H - -#include "taglib_export.h" -#include "tbytevector.h" -#include "taglib.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 extended header implementation - - /*! - * This class implements ID3v2 extended headers. It attempts to follow, - * both semantically and programatically, the structure specified in - * the ID3v2 standard. The API is based on the properties of ID3v2 extended - * headers specified there. If any of the terms used in this documentation - * are unclear please check the specification in the linked section. - * (Structure, <a href="id3v2-structure.html#3.2">3.2</a>) - */ - - class TAGLIB_EXPORT ExtendedHeader - { - public: - /*! - * Constructs an empty ID3v2 extended header. - */ - ExtendedHeader(); - - /*! - * Destroys the extended header. - */ - virtual ~ExtendedHeader(); - - /*! - * Returns the size of the extended header. This is variable for the - * extended header. - */ - uint size() const; - - /*! - * Sets the data that will be used as the extended header. Since the - * length is not known before the extended header has been parsed, this - * should just be a pointer to the first byte of the extended header. It - * will determine the length internally and make that available through - * size(). - */ - void setData(const ByteVector &data); - - protected: - /*! - * Called by setData() to parse the extended header data. It makes this - * information available through the public API. - */ - void parse(const ByteVector &data); - - private: - ExtendedHeader(const ExtendedHeader &); - ExtendedHeader &operator=(const ExtendedHeader &); - - class ExtendedHeaderPrivate; - ExtendedHeaderPrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/id3v2footer.h b/src/mytaglib/id3v2footer.h deleted file mode 100644 index 1374a14..0000000 --- a/src/mytaglib/id3v2footer.h +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FOOTER_H -#define TAGLIB_ID3V2FOOTER_H - -#include "taglib_export.h" -#include "tbytevector.h" - -namespace TagLib { - - namespace ID3v2 { - - class Header; - - //! ID3v2 footer implementation - - /*! - * Per the ID3v2 specification, the tag's footer is just a copy of the - * information in the header. As such there is no API for reading the - * data from the header, it can just as easily be done from the header. - * - * In fact, at this point, TagLib does not even parse the footer since - * it is not useful internally. However, if the flag to include a footer - * has been set in the ID3v2::Tag, TagLib will render a footer. - */ - - class TAGLIB_EXPORT Footer - { - public: - /*! - * Constructs an empty ID3v2 footer. - */ - Footer(); - /*! - * Destroys the footer. - */ - virtual ~Footer(); - - /*! - * Returns the size of the footer. Presently this is always 10 bytes. - */ - static uint size(); - - /*! - * Renders the footer based on the data in \a header. - */ - ByteVector render(const Header *header) const; - - private: - Footer(const Footer &); - Footer &operator=(const Footer &); - - class FooterPrivate; - FooterPrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/id3v2frame.h b/src/mytaglib/id3v2frame.h deleted file mode 100644 index 661be3d..0000000 --- a/src/mytaglib/id3v2frame.h +++ /dev/null @@ -1,414 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FRAME_H -#define TAGLIB_ID3V2FRAME_H - -#include "tstring.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - class StringList; - - namespace ID3v2 { - - class Tag; - class FrameFactory; - - //! ID3v2 frame implementation - - /*! - * This class is the main ID3v2 frame implementation. In ID3v2, a tag is - * split between a collection of frames (which are in turn split into fields - * (Structure, <a href="id3v2-structure.html#4">4</a>) - * (<a href="id3v2-frames.html">Frames</a>). This class provides an API for - * gathering information about and modifying ID3v2 frames. Funtionallity - * specific to a given frame type is handed in one of the many subclasses. - */ - - class TAGLIB_EXPORT Frame - { - friend class Tag; - friend class FrameFactory; - - public: - /*! - * Destroys this Frame instance. - */ - virtual ~Frame(); - - /*! - * Returns the Frame ID (Structure, <a href="id3v2-structure.html#4">4</a>) - * (Frames, <a href="id3v2-frames.html#4">4</a>) - */ - ByteVector frameID() const; - - /*! - * Returns the size of the frame. - */ - uint size() const; - - /*! - * Returns the size of the frame header - * - * \deprecated This is only accurate for ID3v2.3 or ID3v2.4. Please use - * the call below which accepts an ID3v2 version number. In the next - * non-binary compatible release this will be made into a non-static - * member that checks the internal ID3v2 version. - */ - static uint headerSize(); // BIC: remove and make non-static - - /*! - * Returns the size of the frame header for the given ID3v2 version. - * - * \deprecated Please see the explanation above. - */ - static uint headerSize(uint version); // BIC: remove and make non-static - - /*! - * Sets the data that will be used as the frame. Since the length is not - * known before the frame has been parsed, this should just be a pointer to - * the first byte of the frame. It will determine the length internally - * and make that available through size(). - */ - void setData(const ByteVector &data); - - /*! - * Set the text of frame in the sanest way possible. This should only be - * reimplemented in frames where there is some logical mapping to text. - * - * \note If the frame type supports multiple text encodings, this will not - * change the text encoding of the frame; the string will be converted to - * that frame's encoding. Please use the specific APIs of the frame types - * to set the encoding if that is desired. - */ - virtual void setText(const String &text); - - /*! - * This returns the textual representation of the data in the frame. - * Subclasses must reimplement this method to provide a string - * representation of the frame's data. - */ - virtual String toString() const = 0; - - /*! - * Render the frame back to its binary format in a ByteVector. - */ - ByteVector render() const; - - /*! - * Returns the text delimiter that is used between fields for the string - * type \a t. - */ - static ByteVector textDelimiter(String::Type t); - - protected: - class Header; - - /*! - * Constructs an ID3v2 frame using \a data to read the header information. - * All other processing of \a data should be handled in a subclass. - * - * \note This need not contain anything more than a frame ID, but - * \e must constain at least that. - */ - explicit Frame(const ByteVector &data); - - /*! - * This creates an Frame using the header \a h. - * - * The ownership of this header will be assigned to the frame and the - * header will be deleted when the frame is destroyed. - */ - Frame(Header *h); - - /*! - * Returns a pointer to the frame header. - */ - Header *header() const; - - /*! - * Sets the header to \a h. If \a deleteCurrent is true, this will free - * the memory of the current header. - * - * The ownership of this header will be assigned to the frame and the - * header will be deleted when the frame is destroyed. - */ - void setHeader(Header *h, bool deleteCurrent = true); - - /*! - * Called by setData() to parse the frame data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - /*! - * Called by parse() to parse the field data. It makes this information - * available through the public API. This must be overridden by the - * subclasses. - */ - virtual void parseFields(const ByteVector &data) = 0; - - /*! - * Render the field data back to a binary format in a ByteVector. This - * must be overridden by subclasses. - */ - virtual ByteVector renderFields() const = 0; - - /*! - * Returns a ByteVector containing the field data given the frame data. - * This correctly adjusts for the header size plus any additional frame - * data that's specified in the frame header flags. - */ - ByteVector fieldData(const ByteVector &frameData) const; - - /*! - * Reads a String of type \a encodiong from the ByteVector \a data. If \a - * position is passed in it is used both as the starting point and is - * updated to replect the position just after the string that has been read. - * This is useful for reading strings sequentially. - */ - String readStringField(const ByteVector &data, String::Type encoding, - int *positon = 0); - - /*! - * Checks a the list of string values to see if they can be used with the - * specified encoding and returns the recommended encoding. - */ - static String::Type checkEncoding(const StringList &fields, - String::Type encoding); - - private: - Frame(const Frame &); - Frame &operator=(const Frame &); - - class FramePrivate; - friend class FramePrivate; - FramePrivate *d; - }; - - //! ID3v2 frame header implementation - - /*! - * The ID3v2 Frame Header (Structure, <a href="id3v2-structure.html#4">4</a>) - * - * Every ID3v2::Frame has an associated header that gives some general - * properties of the frame and also makes it possible to identify the frame - * type. - * - * As such when reading an ID3v2 tag ID3v2::FrameFactory first creates the - * frame headers and then creates the appropriate Frame subclass based on - * the type and attaches the header. - */ - - class TAGLIB_EXPORT Frame::Header - { - public: - /*! - * Construct a Frame Header based on \a data. \a data must at least - * contain a 4 byte frame ID, and optionally can contain flag data and the - * frame size. i.e. Just the frame id -- "TALB" -- is a valid value. - * - * \deprecated Please use the constructor below that accepts a version - * number. - */ - Header(const ByteVector &data, bool synchSafeInts); - - /*! - * Construct a Frame Header based on \a data. \a data must at least - * contain a 4 byte frame ID, and optionally can contain flag data and the - * frame size. i.e. Just the frame id -- "TALB" -- is a valid value. - * - * \a version should be the ID3v2 version of the tag. - */ - explicit Header(const ByteVector &data, uint version = 4); - - /*! - * Destroys this Header instance. - */ - virtual ~Header(); - - /*! - * Sets the data for the Header. - * - * \deprecated Please use the version below that accepts an ID3v2 version - * number. - */ - void setData(const ByteVector &data, bool synchSafeInts); - - /*! - * Sets the data for the Header. \a version should indicate the ID3v2 - * version number of the tag that this frame is contained in. - */ - void setData(const ByteVector &data, uint version = 4); - - /*! - * Returns the Frame ID (Structure, <a href="id3v2-structure.html#4">4</a>) - * (Frames, <a href="id3v2-frames.html#4">4</a>) - */ - ByteVector frameID() const; - - /*! - * Sets the frame's ID to \a id. Only the first four bytes of \a id will - * be used. - * - * \warning This method should in general be avoided. It exists simply to - * provide a mechanism for transforming frames from a deprecated frame type - * to a newer one -- i.e. TYER to TDRC from ID3v2.3 to ID3v2.4. - */ - void setFrameID(const ByteVector &id); - - /*! - * Returns the size of the frame data portion, as set when setData() was - * called or set explicitly via setFrameSize(). - */ - uint frameSize() const; - - /*! - * Sets the size of the frame data portion. - */ - void setFrameSize(uint size); - - /*! - * Returns the ID3v2 version of the header (as passed in from the - * construction of the header). - */ - uint version() const; - - /*! - * Returns the size of the frame header in bytes. - * - * \deprecated Please use the version of this method that accepts a - * version. This is only accurate for ID3v2.3 and ID3v2.4. This will be - * removed in the next binary incompatible release (2.0) and will be - * replaced with a non-static method that checks the frame version. - */ - static uint size(); - - /*! - * Returns the size of the frame header in bytes for the ID3v2 version - * that's given. - * - * \deprecated Please see the explanation in the version above. - */ - static uint size(uint version); - - /*! - * Returns true if the flag for tag alter preservation is set. - * - * The semantics are a little backwards from what would seem natural - * (setting the preservation flag to throw away the frame), but this - * follows the ID3v2 standard. - * - * \see setTagAlterPreservation() - */ - bool tagAlterPreservation() const; - - /*! - * Sets the flag for preservation of this frame if the tag is set. If - * this is set to true the frame will not be written when the tag is - * saved. - * - * The semantics are a little backwards from what would seem natural - * (setting the preservation flag to throw away the frame), but this - * follows the ID3v2 standard. - * - * \see tagAlterPreservation() - */ - void setTagAlterPreservation(bool discard); - - /*! - * Returns true if the flag for file alter preservation is set. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool fileAlterPreservation() const; - - /*! - * Returns true if the frame is meant to be read only. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool readOnly() const; - - /*! - * Returns true if the flag for the grouping identifity is set. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool groupingIdentity() const; - - /*! - * Returns true if compression is enabled for this frame. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool compression() const; - - /*! - * Returns true if encryption is enabled for this frame. - * - * \note This flag is currently ignored internally in TagLib. - */ - bool encryption() const; - -#ifndef DO_NOT_DOCUMENT - bool unsycronisation() const; -#endif - - /*! - * Returns true if unsynchronisation is enabled for this frame. - */ - bool unsynchronisation() const; - - /*! - * Returns true if the flag for a data length indicator is set. - */ - bool dataLengthIndicator() const; - - /*! - * Render the Header back to binary format in a ByteVector. - */ - ByteVector render() const; - - /*! - * \deprecated - */ - bool frameAlterPreservation() const; - - private: - Header(const Header &); - Header &operator=(const Header &); - - class HeaderPrivate; - HeaderPrivate *d; - }; - - } -} - -#endif diff --git a/src/mytaglib/id3v2framefactory.h b/src/mytaglib/id3v2framefactory.h deleted file mode 100644 index 34b704b..0000000 --- a/src/mytaglib/id3v2framefactory.h +++ /dev/null @@ -1,167 +0,0 @@ - /*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2FRAMEFACTORY_H -#define TAGLIB_ID3V2FRAMEFACTORY_H - -#include "taglib_export.h" -#include "tbytevector.h" -#include "id3v2frame.h" -#include "id3v2header.h" - -namespace TagLib { - - namespace ID3v2 { - - class TextIdentificationFrame; - - //! A factory for creating ID3v2 frames during parsing - - /*! - * This factory abstracts away the frame creation process and instantiates - * the appropriate ID3v2::Frame subclasses based on the contents of the - * data. - * - * Reimplementing this factory is the key to adding support for frame types - * not directly supported by TagLib to your application. To do so you would - * subclass this factory reimplement createFrame(). Then by setting your - * factory to be the default factory in ID3v2::Tag constructor or with - * MPEG::File::setID3v2FrameFactory() you can implement behavior that will - * allow for new ID3v2::Frame subclasses (also provided by you) to be used. - * - * This implements both <i>abstract factory</i> and <i>singleton</i> patterns - * of which more information is available on the web and in software design - * textbooks (Notably <i>Design Patters</i>). - * - * \note You do not need to use this factory to create new frames to add to - * an ID3v2::Tag. You can instantiate frame subclasses directly (with new) - * and add them to a tag using ID3v2::Tag::addFrame() - * - * \see ID3v2::Tag::addFrame() - */ - - class TAGLIB_EXPORT FrameFactory - { - public: - static FrameFactory *instance(); - /*! - * Create a frame based on \a data. \a synchSafeInts should only be set - * false if we are parsing an old tag (v2.3 or older) that does not support - * synchsafe ints. - * - * \deprecated Please use the method below that accepts a ID3v2::Header - * instance in new code. - */ - Frame *createFrame(const ByteVector &data, bool synchSafeInts) const; - - /*! - * Create a frame based on \a data. \a version should indicate the ID3v2 - * version of the tag. As ID3v2.4 is the most current version of the - * standard 4 is the default. - * - * \deprecated Please use the method below that accepts a ID3v2::Header - * instance in new code. - */ - Frame *createFrame(const ByteVector &data, uint version = 4) const; - - /*! - * Create a frame based on \a data. \a tagHeader should be a valid - * ID3v2::Header instance. - */ - // BIC: make virtual - Frame *createFrame(const ByteVector &data, Header *tagHeader) const; - - /*! - * Returns the default text encoding for text frames. If setTextEncoding() - * has not been explicitly called this will only be used for new text - * frames. However, if this value has been set explicitly all frames will be - * converted to this type (unless it's explitly set differently for the - * individual frame) when being rendered. - * - * \see setDefaultTextEncoding() - */ - String::Type defaultTextEncoding() const; - - /*! - * Set the default text encoding for all text frames that are created to - * \a encoding. If no value is set the frames with either default to the - * encoding type that was parsed and new frames default to Latin1. - * - * Valid string types for ID3v2 tags are Latin1, UTF8, UTF16 and UTF16BE. - * - * \see defaultTextEncoding() - */ - void setDefaultTextEncoding(String::Type encoding); - - protected: - /*! - * Constructs a frame factory. Because this is a singleton this method is - * protected, but may be used for subclasses. - */ - FrameFactory(); - - /*! - * Destroys the frame factory. In most cases this will never be called (as - * is typical of singletons). - */ - virtual ~FrameFactory(); - - /*! - * This method checks for compliance to the current ID3v2 standard (2.4) - * and does nothing in the common case. However if a frame is found that - * is not compatible with the current standard, this method either updates - * the frame or indicates that it should be discarded. - * - * This method with return true (with or without changes to the frame) if - * this frame should be kept or false if it should be discarded. - * - * See the id3v2.4.0-changes.txt document for further information. - */ - virtual bool updateFrame(Frame::Header *header) const; - - private: - FrameFactory(const FrameFactory &); - FrameFactory &operator=(const FrameFactory &); - - /*! - * This method is used internally to convert a frame from ID \a from to ID - * \a to. If the frame matches the \a from pattern and converts the frame - * ID in the \a header or simply does nothing if the frame ID does not match. - */ - void convertFrame(const char *from, const char *to, - Frame::Header *header) const; - - void updateGenre(TextIdentificationFrame *frame) const; - - static FrameFactory *factory; - - class FrameFactoryPrivate; - FrameFactoryPrivate *d; - }; - - } -} - -#endif diff --git a/src/mytaglib/id3v2header.h b/src/mytaglib/id3v2header.h deleted file mode 100644 index 307ba96..0000000 --- a/src/mytaglib/id3v2header.h +++ /dev/null @@ -1,175 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2HEADER_H -#define TAGLIB_ID3V2HEADER_H - -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 headers - - /*! - * This class implements ID3v2 headers. It attempts to follow, both - * semantically and programatically, the structure specified in - * the ID3v2 standard. The API is based on the properties of ID3v2 headers - * specified there. If any of the terms used in this documentation are - * unclear please check the specification in the linked section. - * (Structure, <a href="id3v2-structure.html#3.1">3.1</a>) - */ - - class TAGLIB_EXPORT Header - { - public: - /*! - * Constructs an empty ID3v2 header. - */ - Header(); - - /*! - * Constructs an ID3v2 header based on \a data. parse() is called - * immediately. - */ - Header(const ByteVector &data); - - /*! - * Destroys the header. - */ - virtual ~Header(); - - /*! - * Returns the major version number. (Note: This is the 4, not the 2 in - * ID3v2.4.0. The 2 is implied.) - */ - uint majorVersion() const; - - /*! - * Set the the major version number to \a version. (Note: This is - * the 4, not the 2 in ID3v2.4.0. The 2 is implied.) - * \see majorVersion() - * - * \note This is used by the internal parser; this will not change the - * version which is written and in general should not be called by API - * users. - */ - void setMajorVersion(uint version); - - /*! - * Returns the revision number. (Note: This is the 0, not the 4 in - * ID3v2.4.0. The 2 is implied.) - */ - uint revisionNumber() const; - - /*! - * Returns true if unsynchronisation has been applied to all frames. - */ - bool unsynchronisation() const; - - /*! - * Returns true if an extended header is present in the tag. - */ - bool extendedHeader() const; - - /*! - * Returns true if the experimental indicator flag is set. - */ - bool experimentalIndicator() const; - - /*! - * Returns true if a footer is present in the tag. - */ - bool footerPresent() const; - /*! - * Returns the tag size in bytes. This is the size of the frame content. - * The size of the \e entire tag will be this plus the header size (10 - * bytes) and, if present, the footer size (potentially another 10 bytes). - * - * \note This is the value as read from the header to which TagLib attempts - * to provide an API to; it was not a design decision on the part of TagLib - * to not include the mentioned portions of the tag in the \e size. - * - * \see completeTagSize() - */ - uint tagSize() const; - - /*! - * Returns the tag size, including the header and, if present, the footer - * size. - * - * \see tagSize() - */ - uint completeTagSize() const; - - /*! - * Set the tag size to \a s. - * \see tagSize() - */ - void setTagSize(uint s); - - /*! - * Returns the size of the header. Presently this is always 10 bytes. - */ - static uint size(); - - /*! - * Returns the string used to identify and ID3v2 tag inside of a file. - * Presently this is always "ID3". - */ - static ByteVector fileIdentifier(); - - /*! - * Sets the data that will be used as the header. 10 bytes, starting from - * the beginning of \a data are used. - */ - void setData(const ByteVector &data); - - /*! - * Renders the Header back to binary format. - */ - ByteVector render() const; - - protected: - /*! - * Called by setData() to parse the header data. It makes this information - * available through the public API. - */ - void parse(const ByteVector &data); - - private: - Header(const Header &); - Header &operator=(const Header &); - - class HeaderPrivate; - HeaderPrivate *d; - }; - - } -} - -#endif diff --git a/src/mytaglib/id3v2synchdata.h b/src/mytaglib/id3v2synchdata.h deleted file mode 100644 index 4a1f596..0000000 --- a/src/mytaglib/id3v2synchdata.h +++ /dev/null @@ -1,70 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2SYNCHDATA_H -#define TAGLIB_ID3V2SYNCHDATA_H - -#include "tbytevector.h" -#include "taglib.h" - -namespace TagLib { - - namespace ID3v2 { - - //! A few functions for ID3v2 synch safe integer conversion - - /*! - * In the ID3v2.4 standard most integer values are encoded as "synch safe" - * integers which are encoded in such a way that they will not give false - * MPEG syncs and confuse MPEG decoders. This namespace provides some - * methods for converting to and from these values to ByteVectors for - * things rendering and parsing ID3v2 data. - */ - - namespace SynchData - { - /*! - * This returns the unsigned integer value of \a data where \a data is a - * ByteVector that contains a \e synchsafe integer (Structure, - * <a href="id3v2-structure.html#6.2">6.2</a>). The default \a length of - * 4 is used if another value is not specified. - */ - TAGLIB_EXPORT uint toUInt(const ByteVector &data); - - /*! - * Returns a 4 byte (32 bit) synchsafe integer based on \a value. - */ - TAGLIB_EXPORT ByteVector fromUInt(uint value); - - /*! - * Convert the data from unsynchronized data to its original format. - */ - TAGLIB_EXPORT ByteVector decode(const ByteVector &input); - } - - } -} - -#endif diff --git a/src/mytaglib/id3v2tag.h b/src/mytaglib/id3v2tag.h deleted file mode 100644 index a139d45..0000000 --- a/src/mytaglib/id3v2tag.h +++ /dev/null @@ -1,300 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ID3V2TAG_H -#define TAGLIB_ID3V2TAG_H - -#include "tag.h" -#include "tbytevector.h" -#include "tstring.h" -#include "tlist.h" -#include "tmap.h" -#include "taglib_export.h" - -#include "id3v2framefactory.h" - -namespace TagLib { - - class File; - - //! An ID3v2 implementation - - /*! - * This is a relatively complete and flexible framework for working with ID3v2 - * tags. - * - * \see ID3v2::Tag - */ - - namespace ID3v2 { - - class Header; - class ExtendedHeader; - class Footer; - - typedef List<Frame *> FrameList; - typedef Map<ByteVector, FrameList> FrameListMap; - - //! The main class in the ID3v2 implementation - - /*! - * This is the main class in the ID3v2 implementation. It serves two - * functions. This first, as is obvious from the public API, is to provide a - * container for the other ID3v2 related classes. In addition, through the - * read() and parse() protected methods, it provides the most basic level of - * parsing. In these methods the ID3v2 tag is extracted from the file and - * split into data components. - * - * ID3v2 tags have several parts, TagLib attempts to provide an interface - * for them all. header(), footer() and extendedHeader() corespond to those - * data structures in the ID3v2 standard and the APIs for the classes that - * they return attempt to reflect this. - * - * Also ID3v2 tags are built up from a list of frames, which are in turn - * have a header and a list of fields. TagLib provides two ways of accessing - * the list of frames that are in a given ID3v2 tag. The first is simply - * via the frameList() method. This is just a list of pointers to the frames. - * The second is a map from the frame type -- i.e. "COMM" for comments -- and - * a list of frames of that type. (In some cases ID3v2 allows for multiple - * frames of the same type, hence this being a map to a list rather than just - * a map to an individual frame.) - * - * More information on the structure of frames can be found in the ID3v2::Frame - * class. - * - * read() and parse() pass binary data to the other ID3v2 class structures, - * they do not handle parsing of flags or fields, for instace. Those are - * handled by similar functions within those classes. - * - * \note All pointers to data structures within the tag will become invalid - * when the tag is destroyed. - * - * \warning Dealing with the nasty details of ID3v2 is not for the faint of - * heart and should not be done without much meditation on the spec. It's - * rather long, but if you're planning on messing with this class and others - * that deal with the details of ID3v2 (rather than the nice, safe, abstract - * TagLib::Tag and friends), it's worth your time to familiarize yourself - * with said spec (which is distrubuted with the TagLib sources). TagLib - * tries to do most of the work, but with a little luck, you can still - * convince it to generate invalid ID3v2 tags. The APIs for ID3v2 assume a - * working knowledge of ID3v2 structure. You're been warned. - */ - - class TAGLIB_EXPORT Tag : public TagLib::Tag - { - public: - /*! - * Constructs an empty ID3v2 tag. - * - * \note You must create at least one frame for this tag to be valid. - */ - Tag(); - - /*! - * Constructs an ID3v2 tag read from \a file starting at \a tagOffset. - * \a factory specifies which FrameFactory will be used for the - * construction of new frames. - * - * \note You should be able to ignore the \a factory parameter in almost - * all situations. You would want to specify your own FrameFactory - * subclass in the case that you are extending TagLib to support additional - * frame types, which would be incorperated into your factory. - * - * \see FrameFactory - */ - Tag(File *file, long tagOffset, - const FrameFactory *factory = FrameFactory::instance()); - - /*! - * Destroys this Tag instance. - */ - virtual ~Tag(); - - // Reimplementations. - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - - virtual bool isEmpty() const; - - /*! - * Returns a pointer to the tag's header. - */ - Header *header() const; - - /*! - * Returns a pointer to the tag's extended header or null if there is no - * extended header. - */ - ExtendedHeader *extendedHeader() const; - - /*! - * Returns a pointer to the tag's footer or null if there is no footer. - * - * \deprecated I don't see any reason to keep this around since there's - * nothing useful to be retrieved from the footer, but well, again, I'm - * prone to change my mind, so this gets to stay around until near a - * release. - */ - Footer *footer() const; - - /*! - * Returns a reference to the frame list map. This is an FrameListMap of - * all of the frames in the tag. - * - * This is the most convenient structure for accessing the tag's frames. - * Many frame types allow multiple instances of the same frame type so this - * is a map of lists. In most cases however there will only be a single - * frame of a certain type. - * - * Let's say for instance that you wanted to access the frame for total - * beats per minute -- the TBPM frame. - * - * \code - * TagLib::MPEG::File f("foo.mp3"); - * - * // Check to make sure that it has an ID3v2 tag - * - * if(f.ID3v2Tag()) { - * - * // Get the list of frames for a specific frame type - * - * TagLib::ID3v2::FrameList l = f.ID3v2Tag()->frameListMap()["TBPM"]; - * - * if(!l.isEmpty()) - * std::cout << l.front()->toString() << std::endl; - * } - * - * \endcode - * - * \warning You should not modify this data structure directly, instead - * use addFrame() and removeFrame(). - * - * \see frameList() - */ - const FrameListMap &frameListMap() const; - - /*! - * Returns a reference to the frame list. This is an FrameList of all of - * the frames in the tag in the order that they were parsed. - * - * This can be useful if for example you want iterate over the tag's frames - * in the order that they occur in the tag. - * - * \warning You should not modify this data structure directly, instead - * use addFrame() and removeFrame(). - */ - const FrameList &frameList() const; - - /*! - * Returns the frame list for frames with the id \a frameID or an empty - * list if there are no frames of that type. This is just a convenience - * and is equivalent to: - * - * \code - * frameListMap()[frameID]; - * \endcode - * - * \see frameListMap() - */ - const FrameList &frameList(const ByteVector &frameID) const; - - /*! - * Add a frame to the tag. At this point the tag takes ownership of - * the frame and will handle freeing its memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void addFrame(Frame *frame); - - /*! - * Remove a frame from the tag. If \a del is true the frame's memory - * will be freed; if it is false, it must be deleted by the user. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void removeFrame(Frame *frame, bool del = true); - - /*! - * Remove all frames of type \a id from the tag and free their memory. - * - * \note Using this method will invalidate any pointers on the list - * returned by frameList() - */ - void removeFrames(const ByteVector &id); - - /*! - * Render the tag back to binary data, suitable to be written to disk. - */ - ByteVector render() const; - - protected: - /*! - * Reads data from the file specified in the constructor. It does basic - * parsing of the data in the largest chunks. It partitions the tag into - * the Header, the body of the tag (which contains the ExtendedHeader and - * frames) and Footer. - */ - void read(); - - /*! - * This is called by read to parse the body of the tag. It determines if an - * extended header exists and adds frames to the FrameListMap. - */ - void parse(const ByteVector &data); - - /*! - * Sets the value of the text frame with the Frame ID \a id to \a value. - * If the frame does not exist, it is created. - */ - void setTextFrame(const ByteVector &id, const String &value); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; - - } -} - -#endif diff --git a/src/mytaglib/mp4atom.h b/src/mytaglib/mp4atom.h deleted file mode 100644 index 7d9dac2..0000000 --- a/src/mytaglib/mp4atom.h +++ /dev/null @@ -1,77 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -// This file is not part of the public API! - -#ifndef DO_NOT_DOCUMENT - -#ifndef TAGLIB_MP4ATOM_H -#define TAGLIB_MP4ATOM_H - -#include "tfile.h" -#include "tlist.h" - -namespace TagLib { - - namespace MP4 { - - class Atom; - typedef TagLib::List<Atom *> AtomList; - - class Atom - { - public: - Atom(File *file); - ~Atom(); - Atom *find(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - bool path(AtomList &path, const char *name1, const char *name2 = 0, const char *name3 = 0); - AtomList findall(const char *name, bool recursive = false); - long offset; - long length; - TagLib::ByteVector name; - AtomList children; - private: - static const int numContainers = 10; - static const char *containers[10]; - }; - - //! Root-level atoms - class Atoms - { - public: - Atoms(File *file); - ~Atoms(); - Atom *find(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - AtomList path(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); - AtomList atoms; - }; - - } - -} - -#endif - -#endif diff --git a/src/mytaglib/mp4coverart.h b/src/mytaglib/mp4coverart.h deleted file mode 100644 index 26c4f9d..0000000 --- a/src/mytaglib/mp4coverart.h +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************** - copyright : (C) 2009 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4COVERART_H -#define TAGLIB_MP4COVERART_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace MP4 { - - class TAGLIB_EXPORT CoverArt - { - public: - /*! - * This describes the image type. - */ - enum Format { - JPEG = 0x0D, - PNG = 0x0E - }; - - CoverArt(Format format, const ByteVector &data); - ~CoverArt(); - - CoverArt(const CoverArt &item); - CoverArt &operator=(const CoverArt &item); - - //! Format of the image - Format format() const; - - //! The image data - ByteVector data() const; - - private: - class CoverArtPrivate; - CoverArtPrivate *d; - }; - - typedef List<CoverArt> CoverArtList; - - } - -} - -#endif diff --git a/src/mytaglib/mp4file.h b/src/mytaglib/mp4file.h deleted file mode 100644 index 5c28d77..0000000 --- a/src/mytaglib/mp4file.h +++ /dev/null @@ -1,103 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4FILE_H -#define TAGLIB_MP4FILE_H - -#include "tag.h" -#include "tfile.h" -#include "taglib_export.h" -#include "mp4properties.h" -#include "mp4tag.h" - -namespace TagLib { - - //! An implementation of MP4 (AAC, ALAC, ...) metadata - namespace MP4 { - - class Atoms; - - /*! - * This implements and provides an interface for MP4 files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to MP4 files. - */ - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * Contructs a MP4 file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - * - * \note In the current implementation, both \a readProperties and - * \a propertiesStyle are ignored. - */ - File(FileName file, bool readProperties = true, Properties::ReadStyle audioPropertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to the MP4 tag of the file. - * - * MP4::Tag implements the tag interface, so this serves as the - * reimplementation of TagLib::File::tag(). - * - * \note The Tag <b>is still</b> owned by the MP4::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - Tag *tag() const; - - /*! - * Returns the MP4 audio properties for this file. - */ - Properties *audioProperties() const; - - /*! - * Save the file. - * - * This returns true if the save was successful. - */ - bool save(); - - private: - - void read(bool readProperties, Properties::ReadStyle audioPropertiesStyle); - bool checkValid(const MP4::AtomList &list); - - class FilePrivate; - FilePrivate *d; - }; - - } - -} - -#endif diff --git a/src/mytaglib/mp4item.h b/src/mytaglib/mp4item.h deleted file mode 100644 index 3158b4d..0000000 --- a/src/mytaglib/mp4item.h +++ /dev/null @@ -1,72 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4ITEM_H -#define TAGLIB_MP4ITEM_H - -#include "tstringlist.h" -#include "mp4coverart.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace MP4 { - - class TAGLIB_EXPORT Item - { - public: - struct IntPair { - int first, second; - }; - - Item(); - Item(const Item &item); - Item &operator=(const Item &item); - ~Item(); - - Item(int value); - Item(bool value); - Item(int first, int second); - Item(const StringList &value); - Item(const CoverArtList &value); - - int toInt() const; - bool toBool() const; - IntPair toIntPair() const; - StringList toStringList() const; - CoverArtList toCoverArtList() const; - - bool isValid() const; - - private: - class ItemPrivate; - ItemPrivate *d; - }; - - } - -} - -#endif diff --git a/src/mytaglib/mp4properties.h b/src/mytaglib/mp4properties.h deleted file mode 100644 index ef81385..0000000 --- a/src/mytaglib/mp4properties.h +++ /dev/null @@ -1,61 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4PROPERTIES_H -#define TAGLIB_MP4PROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace MP4 { - - class Atoms; - class File; - - //! An implementation of MP4 audio properties - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - Properties(File *file, Atoms *atoms, ReadStyle style = Average); - virtual ~Properties(); - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - virtual int bitsPerSample() const; - - private: - class PropertiesPrivate; - PropertiesPrivate *d; - }; - - } - -} - -#endif diff --git a/src/mytaglib/mp4tag.h b/src/mytaglib/mp4tag.h deleted file mode 100644 index 3e6d667..0000000 --- a/src/mytaglib/mp4tag.h +++ /dev/null @@ -1,104 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MP4TAG_H -#define TAGLIB_MP4TAG_H - -#include "tag.h" -#include "tbytevectorlist.h" -#include "tfile.h" -#include "tmap.h" -#include "tstringlist.h" -#include "taglib_export.h" -#include "mp4atom.h" -#include "mp4item.h" - -namespace TagLib { - - namespace MP4 { - - typedef TagLib::Map<String, Item> ItemListMap; - - class TAGLIB_EXPORT Tag: public TagLib::Tag - { - public: - Tag(TagLib::File *file, Atoms *atoms); - ~Tag(); - bool save(); - - String title() const; - String artist() const; - String album() const; - String comment() const; - String genre() const; - uint year() const; - uint track() const; - - void setTitle(const String &value); - void setArtist(const String &value); - void setAlbum(const String &value); - void setComment(const String &value); - void setGenre(const String &value); - void setYear(uint value); - void setTrack(uint value); - - ItemListMap &itemListMap(); - - private: - TagLib::ByteVectorList parseData(Atom *atom, TagLib::File *file, int expectedFlags = -1, bool freeForm = false); - void parseText(Atom *atom, TagLib::File *file, int expectedFlags = 1); - void parseFreeForm(Atom *atom, TagLib::File *file); - void parseInt(Atom *atom, TagLib::File *file); - void parseGnre(Atom *atom, TagLib::File *file); - void parseIntPair(Atom *atom, TagLib::File *file); - void parseBool(Atom *atom, TagLib::File *file); - void parseCovr(Atom *atom, TagLib::File *file); - - TagLib::ByteVector padIlst(const ByteVector &data, int length = -1); - TagLib::ByteVector renderAtom(const ByteVector &name, const TagLib::ByteVector &data); - TagLib::ByteVector renderData(const ByteVector &name, int flags, const TagLib::ByteVectorList &data); - TagLib::ByteVector renderText(const ByteVector &name, Item &item, int flags = 1); - TagLib::ByteVector renderFreeForm(const String &name, Item &item); - TagLib::ByteVector renderBool(const ByteVector &name, Item &item); - TagLib::ByteVector renderInt(const ByteVector &name, Item &item); - TagLib::ByteVector renderIntPair(const ByteVector &name, Item &item); - TagLib::ByteVector renderIntPairNoTrailing(const ByteVector &name, Item &item); - TagLib::ByteVector renderCovr(const ByteVector &name, Item &item); - - void updateParents(AtomList &path, long delta, int ignore = 0); - void updateOffsets(long delta, long offset); - - void saveNew(TagLib::ByteVector &data); - void saveExisting(TagLib::ByteVector &data, AtomList &path); - - class TagPrivate; - TagPrivate *d; - }; - - } - -} - -#endif diff --git a/src/mytaglib/mpcfile.h b/src/mytaglib/mpcfile.h deleted file mode 100644 index 6adc0ff..0000000 --- a/src/mytaglib/mpcfile.h +++ /dev/null @@ -1,175 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPCFILE_H -#define TAGLIB_MPCFILE_H - -#include "taglib_export.h" -#include "tfile.h" - -#include "mpcproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of MPC metadata - - /*! - * This is implementation of MPC metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. ID3v2 tags are invalid in MPC-files, but will be skipped - * and ignored. - */ - - namespace MPC { - - //! An implementation of TagLib::File with MPC specific methods - - /*! - * This implements and provides an interface for MPC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to MPC files. - * The only invalid tag combination supported is an ID3v1 tag after an APE tag. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches APE tags. - APE = 0x0004, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Contructs an MPC file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Returns the MPC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist. If there is already an APE tag, the - * new ID3v1 tag will be placed after it. - * - * \note The Tag <b>is still</b> owned by the APE::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * a APE tag if one does not exist. If there is already an ID3v1 tag, thes - * new APE tag will be placed before it. - * - * \note The Tag <b>is still</b> owned by the APE::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \warning This will also invalidate pointers to the tags - * as their memory will be freed. - * - * \note In order to make the removal permanent save() still needs to be called. - */ - void strip(int tags = AllTags); - - /*! - * \deprecated - * \see strip - */ - void remove(int tags = AllTags); - - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findAPE(); - long findID3v1(); - long findID3v2(); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/mpcproperties.h b/src/mytaglib/mpcproperties.h deleted file mode 100644 index d159345..0000000 --- a/src/mytaglib/mpcproperties.h +++ /dev/null @@ -1,85 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPCPROPERTIES_H -#define TAGLIB_MPCPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace MPC { - - class File; - - static const uint HeaderSize = 8*7; - - //! An implementation of audio property reading for MPC - - /*! - * This reads the data from an MPC stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of MPC::Properties with the data read from the - * ByteVector \a data. - */ - Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this MPC::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns the version of the bitstream (SV4-SV7) - */ - int mpcVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/mpegfile.h b/src/mytaglib/mpegfile.h deleted file mode 100644 index 282af77..0000000 --- a/src/mytaglib/mpegfile.h +++ /dev/null @@ -1,277 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGFILE_H -#define TAGLIB_MPEGFILE_H - -#include "taglib_export.h" -#include "tfile.h" - -#include "mpegproperties.h" - -namespace TagLib { - - namespace ID3v2 { class Tag; class FrameFactory; } - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of TagLib::File with MPEG (MP3) specific methods - - namespace MPEG { - - //! An MPEG file class with some useful methods specific to MPEG - - /*! - * This implements the generic TagLib::File API and additionally provides - * access to properties that are distinct to MPEG files, notably access - * to the different ID3 tags. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches APE tags. - APE = 0x0004, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Contructs an MPEG file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Contructs an MPEG file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. The frames will be created using - * \a frameFactory. - */ - // BIC: merge with the above constructor - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns a pointer to a tag that is the union of the ID3v2 and ID3v1 - * tags. The ID3v2 tag is given priority in reading the information -- if - * requested information exists in both the ID3v2 tag and the ID3v1 tag, - * the information from the ID3v2 tag will be returned. - * - * If you would like more granular control over the content of the tags, - * with the concession of generality, use the tag-type specific calls. - * - * \note As this tag is not implemented as an ID3v2 tag or an ID3v1 tag, - * but a union of the two this pointer may not be cast to the specific - * tag types. - * - * \see ID3v1Tag() - * \see ID3v2Tag() - * \see APETag() - */ - virtual Tag *tag() const; - - /*! - * Returns the MPEG::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. If at least one tag -- ID3v1 or ID3v2 -- exists this - * will duplicate its content into the other tag. This returns true - * if saving was successful. - * - * If neither exists or if both tags are empty, this will strip the tags - * from the file. - * - * This is the same as calling save(AllTags); - * - * If you would like more granular control over the content of the tags, - * with the concession of generality, use paramaterized save call below. - * - * \see save(int tags) - */ - virtual bool save(); - - /*! - * Save the file. This will attempt to save all of the tag types that are - * specified by OR-ing together TagTypes values. The save() method above - * uses AllTags. This returns true if saving was successful. - * - * This strips all tags not included in the mask, but does not modify them - * in memory, so later calls to save() which make use of these tags will - * remain valid. This also strips empty tags. - */ - bool save(int tags); - - /*! - * Save the file. This will attempt to save all of the tag types that are - * specified by OR-ing together TagTypes values. The save() method above - * uses AllTags. This returns true if saving was successful. - * - * If \a stripOthers is true this strips all tags not included in the mask, - * but does not modify them in memory, so later calls to save() which make - * use of these tags will remain valid. This also strips empty tags. - */ - // BIC: combine with the above method - bool save(int tags, bool stripOthers); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v2 tag if one does not exist. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * an APE tag if one does not exist. - * - * \note The Tag <b>is still</b> owned by the MPEG::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will strip the tags that match the OR-ed together TagTypes from the - * file. By default it strips all tags. It returns true if the tags are - * successfully stripped. - * - * This is equivalent to strip(tags, true) - * - * \note This will also invalidate pointers to the ID3 and APE tags - * as their memory will be freed. - */ - bool strip(int tags = AllTags); - - /*! - * This will strip the tags that match the OR-ed together TagTypes from the - * file. By default it strips all tags. It returns true if the tags are - * successfully stripped. - * - * If \a freeMemory is true the ID3 and APE tags will be deleted and - * pointers to them will be invalidated. - */ - // BIC: merge with the method above - bool strip(int tags, bool freeMemory); - - /*! - * Set the ID3v2::FrameFactory to something other than the default. - * - * \see ID3v2FrameFactory - */ - void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Returns the position in the file of the first MPEG frame. - */ - long firstFrameOffset(); - - /*! - * Returns the position in the file of the next MPEG frame, - * using the current position as start - */ - long nextFrameOffset(long position); - - /*! - * Returns the position in the file of the previous MPEG frame, - * using the current position as start - */ - long previousFrameOffset(long position); - - /*! - * Returns the position in the file of the last MPEG frame. - */ - long lastFrameOffset(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - long findID3v2(); - long findID3v1(); - void findAPE(); - - /*! - * MPEG frames can be recognized by the bit pattern 11111111 111, so the - * first byte is easy to check for, however checking to see if the second byte - * starts with \e 111 is a bit more tricky, hence this member function. - */ - static bool secondSynchByte(char byte); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/mpegheader.h b/src/mytaglib/mpegheader.h deleted file mode 100644 index 020ebd0..0000000 --- a/src/mytaglib/mpegheader.h +++ /dev/null @@ -1,166 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGHEADER_H -#define TAGLIB_MPEGHEADER_H - -#include "taglib_export.h" - -namespace TagLib { - - class ByteVector; - - namespace MPEG { - - //! An implementation of MP3 frame headers - - /*! - * This is an implementation of MPEG Layer III headers. The API follows more - * or less the binary format of these headers. I've used - * <a href="http://www.mp3-tech.org/programmer/frame_header.html">this</a> - * document as a reference. - */ - - class TAGLIB_EXPORT Header - { - public: - /*! - * Parses an MPEG header based on \a data. - */ - Header(const ByteVector &data); - - /*! - * Does a shallow copy of \a h. - */ - Header(const Header &h); - - /*! - * Destroys this Header instance. - */ - virtual ~Header(); - - /*! - * Returns true if the frame is at least an appropriate size and has - * legal values. - */ - bool isValid() const; - - /*! - * The MPEG Version. - */ - enum Version { - //! MPEG Version 1 - Version1 = 0, - //! MPEG Version 2 - Version2 = 1, - //! MPEG Version 2.5 - Version2_5 = 2 - }; - - /*! - * Returns the MPEG Version of the header. - */ - Version version() const; - - /*! - * Returns the layer version. This will be between the values 1-3. - */ - int layer() const; - - /*! - * Returns true if the MPEG protection bit is enabled. - */ - bool protectionEnabled() const; - - /*! - * Returns the bitrate encoded in the header. - */ - int bitrate() const; - - /*! - * Returns the sample rate in Hz. - */ - int sampleRate() const; - - /*! - * Returns true if the frame is padded. - */ - bool isPadded() const; - - /*! - * There are a few combinations or one or two channel audio that are - * possible: - */ - enum ChannelMode { - //! Stereo - Stereo = 0, - //! Stereo - JointStereo = 1, - //! Dual Mono - DualChannel = 2, - //! Mono - SingleChannel = 3 - }; - - /*! - * Returns the channel mode for this frame. - */ - ChannelMode channelMode() const; - - /*! - * Returns true if the copyrighted bit is set. - */ - bool isCopyrighted() const; - - /*! - * Returns true if the "original" bit is set. - */ - bool isOriginal() const; - - /*! - * Returns the frame length. - */ - int frameLength() const; - - /*! - * Returns the number of frames per sample. - */ - int samplesPerFrame() const; - - /*! - * Makes a shallow copy of the header. - */ - Header &operator=(const Header &h); - - private: - void parse(const ByteVector &data); - - class HeaderPrivate; - HeaderPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/mpegproperties.h b/src/mytaglib/mpegproperties.h deleted file mode 100644 index 72e594f..0000000 --- a/src/mytaglib/mpegproperties.h +++ /dev/null @@ -1,118 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGPROPERTIES_H -#define TAGLIB_MPEGPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -#include "mpegheader.h" - -namespace TagLib { - - namespace MPEG { - - class File; - class XingHeader; - - //! An implementation of audio property reading for MP3 - - /*! - * This reads the data from an MPEG Layer III stream found in the - * AudioProperties API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of MPEG::Properties with the data read from the - * MPEG::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this MPEG Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns a pointer to the XingHeader if one exists or null if no - * XingHeader was found. - */ - - const XingHeader *xingHeader() const; - - /*! - * Returns the MPEG Version of the file. - */ - Header::Version version() const; - - /*! - * Returns the layer version. This will be between the values 1-3. - */ - int layer() const; - - /*! - * Returns true if the MPEG protection bit is enabled. - */ - bool protectionEnabled() const; - - /*! - * Returns the channel mode for this frame. - */ - Header::ChannelMode channelMode() const; - - /*! - * Returns true if the copyrighted bit is set. - */ - bool isCopyrighted() const; - - /*! - * Returns true if the "original" bit is set. - */ - bool isOriginal() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/oggfile.h b/src/mytaglib/oggfile.h deleted file mode 100644 index da1fcb6..0000000 --- a/src/mytaglib/oggfile.h +++ /dev/null @@ -1,112 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "taglib_export.h" -#include "tfile.h" -#include "tbytevectorlist.h" - -#ifndef TAGLIB_OGGFILE_H -#define TAGLIB_OGGFILE_H - -namespace TagLib { - - //! A namespace for the classes used by Ogg-based metadata files - - namespace Ogg { - - class PageHeader; - - //! An implementation of TagLib::File with some helpers for Ogg based formats - - /*! - * This is an implementation of Ogg file page and packet rendering and is of - * use to Ogg based formats. While the API is small this handles the - * non-trivial details of breaking up an Ogg stream into packets and makes - * these available (via subclassing) to the codec meta data implementations. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - virtual ~File(); - - /*! - * Returns the packet contents for the i-th packet (starting from zero) - * in the Ogg bitstream. - * - * \warning The requires reading at least the packet header for every page - * up to the requested page. - */ - ByteVector packet(uint i); - - /*! - * Sets the packet with index \a i to the value \a p. - */ - void setPacket(uint i, const ByteVector &p); - - /*! - * Returns a pointer to the PageHeader for the first page in the stream or - * null if the page could not be found. - */ - const PageHeader *firstPageHeader(); - - /*! - * Returns a pointer to the PageHeader for the last page in the stream or - * null if the page could not be found. - */ - const PageHeader *lastPageHeader(); - - virtual bool save(); - - protected: - /*! - * Contructs an Ogg file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - * - * \note This constructor is protected since Ogg::File shouldn't be - * instantiated directly but rather should be used through the codec - * specific subclasses. - */ - File(FileName file); - - private: - File(const File &); - File &operator=(const File &); - - /*! - * Reads the next page and updates the internal "current page" pointer. - */ - bool nextPage(); - void writePageGroup(const List<int> &group); - - class FilePrivate; - FilePrivate *d; - }; - - } -} - -#endif diff --git a/src/mytaglib/oggflacfile.h b/src/mytaglib/oggflacfile.h deleted file mode 100644 index 5882a69..0000000 --- a/src/mytaglib/oggflacfile.h +++ /dev/null @@ -1,118 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGFLACFILE_H -#define TAGLIB_OGGFLACFILE_H - -#include "taglib_export.h" -#include "oggfile.h" -#include "xiphcomment.h" - -#include "flacproperties.h" - -namespace TagLib { - - class Tag; - - namespace Ogg { - - //! An implementation of Ogg FLAC metadata - - /*! - * This is implementation of FLAC metadata for Ogg FLAC files. For "pure" - * FLAC files look under the FLAC hiearchy. - * - * Unlike "pure" FLAC-files, Ogg FLAC only supports Xiph-comments, - * while the audio-properties are the same. - */ - namespace FLAC { - - using TagLib::FLAC::Properties; - - //! An implementation of TagLib::File with Ogg/FLAC specific methods - - /*! - * This implements and provides an interface for Ogg/FLAC files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to Ogg FLAC files. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Contructs an Ogg/FLAC file from \a file. If \a readProperties is true - * the file's audio properties will also be read using \a propertiesStyle. - * If false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will always be a XiphComment. - */ - virtual XiphComment *tag() const; - - /*! - * Returns the FLAC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Save the file. This will primarily save and update the XiphComment. - * Returns true if the save is successful. - */ - virtual bool save(); - - /*! - * Returns the length of the audio-stream, used by FLAC::Properties for - * calculating the bitrate. - */ - long streamLength(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - ByteVector streamInfoData(); - ByteVector xiphCommentData(); - - class FilePrivate; - FilePrivate *d; - }; - } // namespace FLAC - } // namespace Ogg -} // namespace TagLib - -#endif diff --git a/src/mytaglib/oggpage.h b/src/mytaglib/oggpage.h deleted file mode 100644 index a8d5c1a..0000000 --- a/src/mytaglib/oggpage.h +++ /dev/null @@ -1,211 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGPAGE_H -#define TAGLIB_OGGPAGE_H - -#include "taglib_export.h" -#include "tbytevectorlist.h" - -namespace TagLib { - - namespace Ogg { - - class File; - class PageHeader; - - //! An implementation of Ogg pages - - /*! - * This is an implementation of the pages that make up an Ogg stream. - * This handles parsing pages and breaking them down into packets and handles - * the details of packets spanning multiple pages and pages that contiain - * multiple packets. - * - * In most Xiph.org formats the comments are found in the first few packets, - * this however is a reasonably complete implementation of Ogg pages that - * could potentially be useful for non-meta data purposes. - */ - - class TAGLIB_EXPORT Page - { - public: - /*! - * Read an Ogg page from the \a file at the position \a pageOffset. - */ - Page(File *file, long pageOffset); - - virtual ~Page(); - - /*! - * Returns the page's position within the file (in bytes). - */ - long fileOffset() const; - - /*! - * Returns a pointer to the header for this page. This pointer will become - * invalid when the page is deleted. - */ - const PageHeader *header() const; - - /*! - * Returns a copy of the page with \a sequenceNumber set as sequence number. - * - * \see header() - * \see PageHeader::setPageSequenceNumber() - */ - Page* getCopyWithNewPageSequenceNumber(int sequenceNumber); - - /*! - * Returns the index of the first packet wholly or partially contained in - * this page. - * - * \see setFirstPacketIndex() - */ - int firstPacketIndex() const; - - /*! - * Sets the index of the first packet in the page. - * - * \see firstPacketIndex() - */ - void setFirstPacketIndex(int index); - - /*! - * When checking to see if a page contains a given packet this set of flags - * represents the possible values for that packets status in the page. - * - * \see containsPacket() - */ - enum ContainsPacketFlags { - //! No part of the packet is contained in the page - DoesNotContainPacket = 0x0000, - //! The packet is wholly contained in the page - CompletePacket = 0x0001, - //! The page starts with the given packet - BeginsWithPacket = 0x0002, - //! The page ends with the given packet - EndsWithPacket = 0x0004 - }; - - /*! - * Checks to see if the specified \a packet is contained in the current - * page. - * - * \see ContainsPacketFlags - */ - ContainsPacketFlags containsPacket(int index) const; - - /*! - * Returns the number of packets (whole or partial) in this page. - */ - uint packetCount() const; - - /*! - * Returns a list of the packets in this page. - * - * \note Either or both the first and last packets may be only partial. - * \see PageHeader::firstPacketContinued() - */ - ByteVectorList packets() const; - - /*! - * Returns the size of the page in bytes. - */ - int size() const; - - ByteVector render() const; - - /*! - * Defines a strategy for pagination, or grouping pages into Ogg packets, - * for use with pagination methods. - * - * \note Yes, I'm aware that this is not a canonical "Strategy Pattern", - * the term was simply convenient. - */ - enum PaginationStrategy { - /*! - * Attempt to put the specified set of packets into a single Ogg packet. - * If the sum of the packet data is greater than will fit into a single - * Ogg page -- 65280 bytes -- this will fall back to repagination using - * the recommended page sizes. - */ - SinglePagePerGroup, - /*! - * Split the packet or group of packets into pages that conform to the - * sizes recommended in the Ogg standard. - */ - Repaginate - }; - - /*! - * Pack \a packets into Ogg pages using the \a strategy for pagination. - * The page number indicater inside of the rendered packets will start - * with \a firstPage and be incremented for each page rendered. - * \a containsLastPacket should be set to true if \a packets contains the - * last page in the stream and will set the appropriate flag in the last - * rendered Ogg page's header. \a streamSerialNumber should be set to - * the serial number for this stream. - * - * \note The "absolute granule position" is currently always zeroed using - * this method as this suffices for the comment headers. - * - * \warning The pages returned by this method must be deleted by the user. - * You can use List<T>::setAutoDelete(true) to set these pages to be - * automatically deleted when this list passes out of scope. - * - * \see PaginationStrategy - * \see List::setAutoDelete() - */ - static List<Page *> paginate(const ByteVectorList &packets, - PaginationStrategy strategy, - uint streamSerialNumber, - int firstPage, - bool firstPacketContinued = false, - bool lastPacketCompleted = true, - bool containsLastPacket = false); - - protected: - /*! - * Creates an Ogg packet based on the data in \a packets. The page number - * for each page will be set to \a pageNumber. - */ - Page(const ByteVectorList &packets, - uint streamSerialNumber, - int pageNumber, - bool firstPacketContinued = false, - bool lastPacketCompleted = true, - bool containsLastPacket = false); - - private: - Page(const Page &); - Page &operator=(const Page &); - - class PagePrivate; - PagePrivate *d; - }; - } -} -#endif diff --git a/src/mytaglib/oggpageheader.h b/src/mytaglib/oggpageheader.h deleted file mode 100644 index 742710a..0000000 --- a/src/mytaglib/oggpageheader.h +++ /dev/null @@ -1,232 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_OGGPAGEHEADER_H -#define TAGLIB_OGGPAGEHEADER_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace Ogg { - - class File; - - //! An implementation of the page headers associated with each Ogg::Page - - /*! - * This class implements Ogg page headers which contain the information - * about Ogg pages needed to break them into packets which can be passed on - * to the codecs. - */ - - class TAGLIB_EXPORT PageHeader - { - public: - /*! - * Reads a PageHeader from \a file starting at \a pageOffset. The defaults - * create a page with no (and as such, invalid) data that must be set - * later. - */ - PageHeader(File *file = 0, long pageOffset = -1); - - /*! - * Deletes this instance of the PageHeader. - */ - virtual ~PageHeader(); - - /*! - * Returns true if the header parsed properly and is valid. - */ - bool isValid() const; - - /*! - * Ogg pages contain a list of packets (which are used by the contained - * codecs). The sizes of these pages is encoded in the page header. This - * returns a list of the packet sizes in bytes. - * - * \see setPacketSizes() - */ - List<int> packetSizes() const; - - /*! - * Sets the sizes of the packets in this page to \a sizes. Internally this - * updates the lacing values in the header. - * - * \see packetSizes() - */ - void setPacketSizes(const List<int> &sizes); - - /*! - * Some packets can be <i>continued</i> across multiple pages. If the - * first packet in the current page is a continuation this will return - * true. If this is page starts with a new packet this will return false. - * - * \see lastPacketCompleted() - * \see setFirstPacketContinued() - */ - bool firstPacketContinued() const; - - /*! - * Sets the internal flag indicating if the first packet in this page is - * continued to \a continued. - * - * \see firstPacketContinued() - */ - void setFirstPacketContinued(bool continued); - - /*! - * Returns true if the last packet of this page is completely contained in - * this page. - * - * \see firstPacketContinued() - * \see setLastPacketCompleted() - */ - bool lastPacketCompleted() const; - - /*! - * Sets the internal flag indicating if the last packet in this page is - * complete to \a completed. - * - * \see lastPacketCompleted() - */ - void setLastPacketCompleted(bool completed); - - /*! - * This returns true if this is the first page of the Ogg (logical) stream. - * - * \see setFirstPageOfStream() - */ - bool firstPageOfStream() const; - - /*! - * Marks this page as the first page of the Ogg stream. - * - * \see firstPageOfStream() - */ - void setFirstPageOfStream(bool first); - - /*! - * This returns true if this is the last page of the Ogg (logical) stream. - * - * \see setLastPageOfStream() - */ - bool lastPageOfStream() const; - - /*! - * Marks this page as the last page of the Ogg stream. - * - * \see lastPageOfStream() - */ - void setLastPageOfStream(bool last); - - /*! - * A special value of containing the position of the packet to be - * interpreted by the codec. In the case of Vorbis this contains the PCM - * value and is used to calculate the length of the stream. - * - * \see setAbsoluteGranularPosition() - */ - long long absoluteGranularPosition() const; - - /*! - * A special value of containing the position of the packet to be - * interpreted by the codec. It is only supported here so that it may be - * coppied from one page to another. - * - * \see absoluteGranularPosition() - */ - void setAbsoluteGranularPosition(long long agp); - - /*! - * Every Ogg logical stream is given a random serial number which is common - * to every page in that logical stream. This returns the serial number of - * the stream associated with this packet. - * - * \see setStreamSerialNumber() - */ - uint streamSerialNumber() const; - - /*! - * Every Ogg logical stream is given a random serial number which is common - * to every page in that logical stream. This sets this pages serial - * number. This method should be used when adding new pages to a logical - * stream. - * - * \see streamSerialNumber() - */ - void setStreamSerialNumber(uint n); - - /*! - * Returns the index of the page within the Ogg stream. This helps make it - * possible to determine if pages have been lost. - * - * \see setPageSequenceNumber() - */ - int pageSequenceNumber() const; - - /*! - * Sets the page's position in the stream to \a sequenceNumber. - * - * \see pageSequenceNumber() - */ - void setPageSequenceNumber(int sequenceNumber); - - /*! - * Returns the complete header size. - */ - int size() const; - - /*! - * Returns the size of the data portion of the page -- i.e. the size of the - * page less the header size. - */ - int dataSize() const; - - /*! - * Render the page header to binary data. - * - * \note The checksum -- bytes 22 - 25 -- will be left empty and must be - * filled in when rendering the entire page. - */ - ByteVector render() const; - - private: - PageHeader(const PageHeader &); - PageHeader &operator=(const PageHeader &); - - void read(); - ByteVector lacingValues() const; - - class PageHeaderPrivate; - PageHeaderPrivate *d; - }; - - } -} - -#endif diff --git a/src/mytaglib/popularimeterframe.h b/src/mytaglib/popularimeterframe.h deleted file mode 100644 index d39f1aa..0000000 --- a/src/mytaglib/popularimeterframe.h +++ /dev/null @@ -1,132 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_POPULARIMETERFRAME_H -#define TAGLIB_POPULARIMETERFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 "popularimeter" - - /*! - * This implements the ID3v2 popularimeter (POPM frame). It concists of - * an email, a rating and an optional counter. - */ - - class TAGLIB_EXPORT PopularimeterFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty popularimeter frame. - */ - explicit PopularimeterFrame(); - - /*! - * Construct a popularimeter based on the data in \a data. - */ - explicit PopularimeterFrame(const ByteVector &data); - - /*! - * Destroys this PopularimeterFrame instance. - */ - virtual ~PopularimeterFrame(); - - /*! - * Returns the text of this popularimeter. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the email. - * - * \see setEmail() - */ - String email() const; - - /*! - * Set the email. - * - * \see email() - */ - void setEmail(const String &email); - - /*! - * Returns the rating. - * - * \see setRating() - */ - int rating() const; - - /*! - * Set the rating. - * - * \see rating() - */ - void setRating(int rating); - - /*! - * Returns the counter. - * - * \see setCounter() - */ - uint counter() const; - - /*! - * Set the counter. - * - * \see counter() - */ - void setCounter(uint counter); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - PopularimeterFrame(const ByteVector &data, Header *h); - PopularimeterFrame(const PopularimeterFrame &); - PopularimeterFrame &operator=(const PopularimeterFrame &); - - class PopularimeterFramePrivate; - PopularimeterFramePrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/privateframe.h b/src/mytaglib/privateframe.h deleted file mode 100644 index 06f82f3..0000000 --- a/src/mytaglib/privateframe.h +++ /dev/null @@ -1,111 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Serkan Kalyoncu - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_PRIVATEFRAME_H -#define TAGLIB_PRIVATEFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An implementation of ID3v2 privateframe - - class TAGLIB_EXPORT PrivateFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty private frame. - */ - PrivateFrame(); - - /*! - * Construct a private frame based on the data in \a data. - * - * \note This is the constructor used when parsing the frame from a file. - */ - explicit PrivateFrame(const ByteVector &data); - - /*! - * Destroys this private frame instance. - */ - virtual ~PrivateFrame(); - - /*! - * Returns the text of this private frame, currently just the owner. - * - * \see text() - */ - virtual String toString() const; - - /*! - * \return The owner of the private frame. - * \note This should contain an email address or link to a website. - */ - String owner() const; - - /*! - * - */ - ByteVector data() const; - - /*! - * Sets the owner of the frame to \a s. - * \note This should contain an email address or link to a website. - */ - void setOwner(const String &s); - - /*! - * - */ - void setData(const ByteVector &v); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - PrivateFrame(const ByteVector &data, Header *h); - - PrivateFrame(const PrivateFrame &); - PrivateFrame &operator=(const PrivateFrame &); - - class PrivateFramePrivate; - PrivateFramePrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/relativevolumeframe.h b/src/mytaglib/relativevolumeframe.h deleted file mode 100644 index dad4e7d..0000000 --- a/src/mytaglib/relativevolumeframe.h +++ /dev/null @@ -1,274 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_RELATIVEVOLUMEFRAME_H -#define TAGLIB_RELATIVEVOLUMEFRAME_H - -#include "tlist.h" -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! An ID3v2 relative volume adjustment frame implementation - - /*! - * This is an implementation of ID3v2 relative volume adjustment. The - * presence of this frame makes it possible to specify an increase in volume - * for an audio file or specific audio tracks in that file. - * - * Multiple relative volume adjustment frames may be present in the tag - * each with a unique identification and describing volume adjustment for - * different channel types. - */ - - class TAGLIB_EXPORT RelativeVolumeFrame : public Frame - { - friend class FrameFactory; - - public: - - /*! - * This indicates the type of volume adjustment that should be applied. - */ - enum ChannelType { - //! A type not enumerated below - Other = 0x00, - //! The master volume for the track - MasterVolume = 0x01, - //! The front right audio channel - FrontRight = 0x02, - //! The front left audio channel - FrontLeft = 0x03, - //! The back right audio channel - BackRight = 0x04, - //! The back left audio channel - BackLeft = 0x05, - //! The front center audio channel - FrontCentre = 0x06, - //! The back center audio channel - BackCentre = 0x07, - //! The subwoofer audio channel - Subwoofer = 0x08 - }; - - //! Struct that stores the relevant values for ID3v2 peak volume - - /*! - * The peak volume is described as a series of bits that is padded to fill - * a block of bytes. These two values should always be updated in tandem. - */ - struct PeakVolume - { - /*! - * Constructs an empty peak volume description. - */ - PeakVolume() : bitsRepresentingPeak(0) {} - /*! - * The number of bits (in the range of 0 to 255) used to describe the - * peak volume. - */ - unsigned char bitsRepresentingPeak; - /*! - * The array of bits (represented as a series of bytes) used to describe - * the peak volume. - */ - ByteVector peakVolume; - }; - - /*! - * Constructs a RelativeVolumeFrame. The relevant data should be set - * manually. - */ - RelativeVolumeFrame(); - - /*! - * Constructs a RelativeVolumeFrame based on the contents of \a data. - */ - RelativeVolumeFrame(const ByteVector &data); - - /*! - * Destroys the RelativeVolumeFrame instance. - */ - virtual ~RelativeVolumeFrame(); - - /*! - * Returns the frame's identification. - * - * \see identification() - */ - virtual String toString() const; - - /*! - * Returns a list of channels with information currently in the frame. - */ - List<ChannelType> channels() const; - - /*! - * \deprecated Always returns master volume. - */ - ChannelType channelType() const; - - /*! - * \deprecated This method no longer has any effect. - */ - void setChannelType(ChannelType t); - - /* - * There was a terrible API goof here, and while this can't be changed to - * the way it appears below for binary compaibility reasons, let's at - * least pretend that it looks clean. - */ - -#ifdef DOXYGEN - - /*! - * Returns the relative volume adjustment "index". As indicated by the - * ID3v2 standard this is a 16-bit signed integer that reflects the - * decibils of adjustment when divided by 512. - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setVolumeAdjustmentIndex() - * \see volumeAjustment() - */ - short volumeAdjustmentIndex(ChannelType type = MasterVolume) const; - - /*! - * Set the volume adjustment to \a index. As indicated by the ID3v2 - * standard this is a 16-bit signed integer that reflects the decibils of - * adjustment when divided by 512. - * - * By default this sets the value for the master volume. - * - * \see volumeAdjustmentIndex() - * \see setVolumeAjustment() - */ - void setVolumeAdjustmentIndex(short index, ChannelType type = MasterVolume); - - /*! - * Returns the relative volume adjustment in decibels. - * - * \note Because this is actually stored internally as an "index" to this - * value the value returned by this method may not be identical to the - * value set using setVolumeAdjustment(). - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setVolumeAdjustment() - * \see volumeAdjustmentIndex() - */ - float volumeAdjustment(ChannelType type = MasterVolume) const; - - /*! - * Set the relative volume adjustment in decibels to \a adjustment. - * - * By default this sets the value for the master volume. - * - * \note Because this is actually stored internally as an "index" to this - * value the value set by this method may not be identical to the one - * returned by volumeAdjustment(). - * - * \see setVolumeAdjustment() - * \see volumeAdjustmentIndex() - */ - void setVolumeAdjustment(float adjustment, ChannelType type = MasterVolume); - - /*! - * Returns the peak volume (represented as a length and a string of bits). - * - * This defaults to returning the value for the master volume channel if - * available and returns 0 if the specified channel does not exist. - * - * \see setPeakVolume() - */ - PeakVolume peakVolume(ChannelType type = MasterVolume) const; - - /*! - * Sets the peak volume to \a peak. - * - * By default this sets the value for the master volume. - * - * \see peakVolume() - */ - void setPeakVolume(const PeakVolume &peak, ChannelType type = MasterVolume); - -#else - - // BIC: Combine each of the following pairs of functions (or maybe just - // rework this junk altogether). - - short volumeAdjustmentIndex(ChannelType type) const; - short volumeAdjustmentIndex() const; - - void setVolumeAdjustmentIndex(short index, ChannelType type); - void setVolumeAdjustmentIndex(short index); - - float volumeAdjustment(ChannelType type) const; - float volumeAdjustment() const; - - void setVolumeAdjustment(float adjustment, ChannelType type); - void setVolumeAdjustment(float adjustment); - - PeakVolume peakVolume(ChannelType type) const; - PeakVolume peakVolume() const; - - void setPeakVolume(const PeakVolume &peak, ChannelType type); - void setPeakVolume(const PeakVolume &peak); - -#endif - - /*! - * Returns the identification for this frame. - */ - String identification() const; - - /*! - * Sets the identification of the frame to \a s. The string - * is used to identify the situation and/or device where this - * adjustment should apply. - */ - void setIdentification(const String &s); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - RelativeVolumeFrame(const ByteVector &data, Header *h); - RelativeVolumeFrame(const RelativeVolumeFrame &); - RelativeVolumeFrame &operator=(const RelativeVolumeFrame &); - - class RelativeVolumeFramePrivate; - RelativeVolumeFramePrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/rifffile.h b/src/mytaglib/rifffile.h deleted file mode 100644 index 9928256..0000000 --- a/src/mytaglib/rifffile.h +++ /dev/null @@ -1,121 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_RIFFFILE_H -#define TAGLIB_RIFFFILE_H - -#include "taglib_export.h" -#include "tfile.h" - -namespace TagLib { - - //! An implementation of TagLib::File with RIFF specific methods - - namespace RIFF { - - //! An RIFF file class with some useful methods specific to RIFF - - /*! - * This implements the generic TagLib::File API and additionally provides - * access to properties that are distinct to RIFF files, notably access - * to the different ID3 tags. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - protected: - - enum Endianness { BigEndian, LittleEndian }; - - File(FileName file, Endianness endianness); - - /*! - * \return The size of the main RIFF chunk. - */ - uint riffSize() const; - - /*! - * \return The number of chunks in the file. - */ - uint chunkCount() const; - - /*! - * \return The offset within the file for the selected chunk number. - */ - uint chunkOffset(uint i) const; - - /*! - * \return The size of the chunk data. - */ - uint chunkDataSize(uint i) const; - - /*! - * \return The size of the padding after the chunk (can be either 0 or 1). - */ - uint chunkPadding(uint i) const; - - /*! - * \return The name of the specified chunk, for instance, "COMM" or "ID3 " - */ - ByteVector chunkName(uint i) const; - - /*! - * Reads the chunk data from the file and returns it. - * - * \note This \e will move the read pointer for the file. - */ - ByteVector chunkData(uint i); - - /*! - * Sets the data for the chunk \a name to \a data. If a chunk with the - * given name already exists it will be overwritten, otherwise it will be - * created after the existing chunks. - * - * \warning This will update the file immediately. - */ - void setChunkData(const ByteVector &name, const ByteVector &data); - - private: - File(const File &); - File &operator=(const File &); - - void read(); - void writeChunk(const ByteVector &name, const ByteVector &data, - ulong offset, ulong replace = 0, - uint leadingPadding = 0); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/speexfile.h b/src/mytaglib/speexfile.h deleted file mode 100644 index 508b7aa..0000000 --- a/src/mytaglib/speexfile.h +++ /dev/null @@ -1,99 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_SPEEXFILE_H -#define TAGLIB_SPEEXFILE_H - -#include "oggfile.h" -#include "xiphcomment.h" - -#include "speexproperties.h" - -namespace TagLib { - - namespace Ogg { - - //! A namespace containing classes for Speex metadata - - namespace Speex { - - //! An implementation of Ogg::File with Speex specific methods - - /*! - * This is the central class in the Ogg Speex metadata processing collection - * of classes. It's built upon Ogg::File which handles processing of the Ogg - * logical bitstream and breaking it down into pages which are handled by - * the codec implementations, in this case Speex specifically. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Contructs a Speex file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the XiphComment for this file. XiphComment implements the tag - * interface, so this serves as the reimplementation of - * TagLib::File::tag(). - */ - virtual Ogg::XiphComment *tag() const; - - /*! - * Returns the Speex::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - virtual bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - class FilePrivate; - FilePrivate *d; - }; - } - } -} - -#endif diff --git a/src/mytaglib/speexproperties.h b/src/mytaglib/speexproperties.h deleted file mode 100644 index 4720bd8..0000000 --- a/src/mytaglib/speexproperties.h +++ /dev/null @@ -1,89 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_SPEEXPROPERTIES_H -#define TAGLIB_SPEEXPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace Ogg { - - namespace Speex { - - class File; - - //! An implementation of audio property reading for Ogg Speex - - /*! - * This reads the data from an Ogg Speex stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of Speex::Properties with the data read from the - * Speex::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this Speex::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns the Speex version, currently "0" (as specified by the spec). - */ - int speexVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - } -} - -#endif diff --git a/src/mytaglib/tag.h b/src/mytaglib/tag.h deleted file mode 100644 index c8f12a8..0000000 --- a/src/mytaglib/tag.h +++ /dev/null @@ -1,173 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TAG_H -#define TAGLIB_TAG_H - -#include "taglib_export.h" -#include "tstring.h" - -namespace TagLib { - - //! A simple, generic interface to common audio meta data fields - - /*! - * This is an attempt to abstract away the difference in the meta data formats - * of various audio codecs and tagging schemes. As such it is generally a - * subset of what is available in the specific formats but should be suitable - * for most applications. This is meant to compliment the generic APIs found - * in TagLib::AudioProperties, TagLib::File and TagLib::FileRef. - */ - - class TAGLIB_EXPORT Tag - { - public: - - /*! - * Detroys this Tag instance. - */ - virtual ~Tag(); - - /*! - * Returns the track name; if no track name is present in the tag - * String::null will be returned. - */ - virtual String title() const = 0; - - /*! - * Returns the artist name; if no artist name is present in the tag - * String::null will be returned. - */ - virtual String artist() const = 0; - - /*! - * Returns the album name; if no album name is present in the tag - * String::null will be returned. - */ - virtual String album() const = 0; - - /*! - * Returns the track comment; if no comment is present in the tag - * String::null will be returned. - */ - virtual String comment() const = 0; - - /*! - * Returns the genre name; if no genre is present in the tag String::null - * will be returned. - */ - virtual String genre() const = 0; - - /*! - * Returns the year; if there is no year set, this will return 0. - */ - virtual uint year() const = 0; - - /*! - * Returns the track number; if there is no track number set, this will - * return 0. - */ - virtual uint track() const = 0; - - /*! - * Sets the title to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setTitle(const String &s) = 0; - - /*! - * Sets the artist to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setArtist(const String &s) = 0; - - /*! - * Sets the album to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setAlbum(const String &s) = 0; - - /*! - * Sets the comment to \a s. If \a s is String::null then this value will be - * cleared. - */ - virtual void setComment(const String &s) = 0; - - /*! - * Sets the genre to \a s. If \a s is String::null then this value will be - * cleared. For tag formats that use a fixed set of genres, the appropriate - * value will be selected based on a string comparison. A list of available - * genres for those formats should be available in that type's - * implementation. - */ - virtual void setGenre(const String &s) = 0; - - /*! - * Sets the year to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setYear(uint i) = 0; - - /*! - * Sets the track to \a i. If \a s is 0 then this value will be cleared. - */ - virtual void setTrack(uint i) = 0; - - /*! - * Returns true if the tag does not contain any data. This should be - * reimplemented in subclasses that provide more than the basic tagging - * abilities in this class. - */ - virtual bool isEmpty() const; - - /*! - * Copies the generic data from one tag to another. - * - * \note This will no affect any of the lower level details of the tag. For - * instance if any of the tag type specific data (maybe a URL for a band) is - * set, this will not modify or copy that. This just copies using the API - * in this class. - * - * If \a overwrite is true then the values will be unconditionally copied. - * If false only empty values will be overwritten. - */ - static void duplicate(const Tag *source, Tag *target, bool overwrite = true); - - protected: - /*! - * Construct a Tag. This is protected since tags should only be instantiated - * through subclasses. - */ - Tag(); - - private: - Tag(const Tag &); - Tag &operator=(const Tag &); - - class TagPrivate; - TagPrivate *d; - }; -} - -#endif diff --git a/src/mytaglib/taglib.h b/src/mytaglib/taglib.h deleted file mode 100644 index 65a0c0b..0000000 --- a/src/mytaglib/taglib.h +++ /dev/null @@ -1,186 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_H -#define TAGLIB_H - -#define TAGLIB_MAJOR_VERSION 1 -#define TAGLIB_MINOR_VERSION 7 -#define TAGLIB_PATCH_VERSION 0 - -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 1)) -#define TAGLIB_IGNORE_MISSING_DESTRUCTOR _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"") -#else -#define TAGLIB_IGNORE_MISSING_DESTRUCTOR -#endif - -#if (defined(_MSC_VER) && _MSC_VER >= 1600) -#define TAGLIB_CONSTRUCT_BITSET(x) static_cast<unsigned long long>(x) -#else -#define TAGLIB_CONSTRUCT_BITSET(x) static_cast<unsigned long>(x) -#endif - -#include <string> - -//! A namespace for all TagLib related classes and functions - -/*! - * This namespace contains everything in TagLib. For projects working with - * TagLib extensively it may be conveniten to add a - * \code - * using namespace TagLib; - * \endcode - */ - -namespace TagLib { - - class String; - - typedef wchar_t wchar; - typedef unsigned char uchar; - typedef unsigned int uint; - typedef unsigned long ulong; - - /*! - * Unfortunately std::wstring isn't defined on some systems, (i.e. GCC < 3) - * so I'm providing something here that should be constant. - */ - typedef std::basic_string<wchar> wstring; - -#ifndef DO_NOT_DOCUMENT // Tell Doxygen to skip this class. - /*! - * \internal - * This is just used as a base class for shared classes in TagLib. - * - * \warning This <b>is not</b> part of the TagLib public API! - */ - - class RefCounter - { - public: - RefCounter() : refCount(1) {} - void ref() { refCount++; } - bool deref() { return ! --refCount ; } - int count() { return refCount; } - private: - uint refCount; - }; - -#endif // DO_NOT_DOCUMENT - -} - -/*! - * \mainpage TagLib - * - * \section intro Introduction - * - * TagLib is a library for reading and editing audio meta data, commonly know as \e tags. - * - * Features: - * - A clean, high level, C++ API to handling audio meta data. - * - Format specific APIs for advanced API users. - * - ID3v1, ID3v2, APE, FLAC, Xiph, iTunes-style MP4 and WMA tag formats. - * - MP3, MPC, FLAC, MP4, ASF, AIFF, WAV, TrueAudio, WavPack, Ogg FLAC, Ogg Vorbis and Speex file formats. - * - Basic audio file properties such as length, sample rate, etc. - * - Long term binary and source compatibility. - * - Extensible design, notably the ability to add other formats or extend current formats as a library user. - * - Full support for unicode and internationalized tags. - * - Dual <a href="http://www.mozilla.org/MPL/MPL-1.1.html">MPL</a> and - * <a href="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</a> licenses. - * - No external toolkit dependancies. - * - * \section why Why TagLib? - * - * TagLib originally was written to provide an updated and improved ID3v2 implementation in C++ for use - * in a variety of Open Source projects. Since development began in 2002 and the 1.0 release in 2004 - * it has expanded to cover a wide variety of tag and file formats and is used in a wide variety of - * Open Source and proprietary applications. It now supports a variety of UNIXes, including Apple's OS - * X, as well as Microsoft Windows. - * - * \section commercial Usage in Commercial Applications - * - * TagLib's licenses \e do allow usage within propriety (\e closed) applications, however TagLib is \e not - * public domain. Please note the requirements of the LGPL or MPL, and adhere to at least one of them. - * In simple terms, you must at a minimum note your usage of TagLib, note the licensing terms of TagLib and - * if you make changes to TagLib publish them. Please review the licenses above before using TagLib in your - * software. Note that you may choose either the MPL or the LGPL, you do not have to fulfill the - * requirements of both. - * - * \section installing Installing TagLib - * - * Please see the <a href="http://developer.kde.org/~wheeler/taglib.html">TagLib website</a> for the latest - * downloads. - * - * TagLib can be built using the CMake build system. TagLib installs a taglib-config and pkg-config file to - * make it easier to integrate into various build systems. Note that TagLib's include install directory \e must - * be included in the header include path. Simply adding <taglib/tag.h> will \e not work. - * - * \section start Getting Started - * - * TagLib provides both simple, abstract APIs which make it possible to ignore the differences between tagging - * formats and format specific APIs which allow programmers to work with the features of specific tagging - * schemes. There is a similar abstraction mechanism for AudioProperties. - * - * The best place to start is with the <b>Class Hierarchy</b> linked at the top of the page. The File and - * AudioProperties classes and their subclasses are the core of TagLib. The FileRef class is also a convenient - * way for using a value-based handle. - * - * \note When working with FileRef please consider that it has only the most basic (extension-based) file - * type resolution. Please see its documentation on how to plug in more advanced file type resolution. (Such - * resolution may be part of later TagLib releases by default.) - * - * Here's a very simple example with TagLib: - * - * \code - * - * TagLib::FileRef f("Latex Solar Beef.mp3"); - * TagLib::String artist = f.tag()->artist(); // artist == "Frank Zappa" - * - * f.tag()->setAlbum("Fillmore East"); - * f.save(); - * - * TagLib::FileRef g("Free City Rhymes.ogg"); - * TagLib::String album = g.tag()->album(); // album == "NYC Ghosts & Flowers" - * - * g.tag()->setTrack(1); - * g.save(); - * - * \endcode - * - * More examples can be found in the \e examples directory of the source distribution. - * - * \section Contact - * - * Questions about TagLib should be directed to the TagLib mailing list, not directly to the author. - * - * - <a href="http://developer.kde.org/~wheeler/taglib/">TagLib Homepage</a> - * - <a href="https://mail.kde.org/mailman/listinfo/taglib-devel">TagLib Mailing List (taglib-devel@kde.org)</a> - * - * \author Scott Wheeler <wheeler@kde.org> et al. - * - */ - -#endif diff --git a/src/mytaglib/taglib_export.h b/src/mytaglib/taglib_export.h deleted file mode 100644 index ab1492c..0000000 --- a/src/mytaglib/taglib_export.h +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_EXPORT_H -#define TAGLIB_EXPORT_H - -#if defined(TAGLIB_STATIC) -#define TAGLIB_EXPORT -#elif (defined(_WIN32) || defined(_WIN64)) -#ifdef MAKE_TAGLIB_LIB -#define TAGLIB_EXPORT __declspec(dllexport) -#else -#define TAGLIB_EXPORT __declspec(dllimport) -#endif -#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1) -#define TAGLIB_EXPORT __attribute__ ((visibility("default"))) -#else -#define TAGLIB_EXPORT -#endif - -#ifndef TAGLIB_NO_CONFIG -//#include "taglib_config.h" -#endif - -#endif diff --git a/src/mytaglib/tagunion.h b/src/mytaglib/tagunion.h deleted file mode 100644 index e94d523..0000000 --- a/src/mytaglib/tagunion.h +++ /dev/null @@ -1,95 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TAGUNION_H -#define TAGLIB_TAGUNION_H - -#include "tag.h" - -#ifndef DO_NOT_DOCUMENT - -namespace TagLib { - - /*! - * \internal - */ - - class TagUnion : public Tag - { - public: - - enum AccessType { Read, Write }; - - /*! - * Creates a TagLib::Tag that is the union of \a first, \a second, and - * \a third. The TagUnion takes ownership of these tags and will handle - * their deletion. - */ - TagUnion(Tag *first = 0, Tag *second = 0, Tag *third = 0); - - virtual ~TagUnion(); - - Tag *operator[](int index) const; - Tag *tag(int index) const; - - void set(int index, Tag *tag); - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - virtual bool isEmpty() const; - - template <class T> T *access(int index, bool create) - { - if(!create || tag(index)) - return static_cast<T *>(tag(index)); - - set(index, new T); - return static_cast<T *>(tag(index)); - } - - private: - TagUnion(const Tag &); - TagUnion &operator=(const Tag &); - - class TagUnionPrivate; - TagUnionPrivate *d; - }; -} - -#endif -#endif diff --git a/src/mytaglib/tbytevector.h b/src/mytaglib/tbytevector.h deleted file mode 100644 index b7fffdd..0000000 --- a/src/mytaglib/tbytevector.h +++ /dev/null @@ -1,425 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_BYTEVECTOR_H -#define TAGLIB_BYTEVECTOR_H - -#include "taglib.h" -#include "taglib_export.h" - -#include <vector> -#include <ostream> - -namespace TagLib { - - //! A byte vector - - /*! - * This class provides a byte vector with some methods that are useful for - * tagging purposes. Many of the search functions are tailored to what is - * useful for finding tag related paterns in a data array. - */ - - class TAGLIB_EXPORT ByteVector - { - public: -#ifndef DO_NOT_DOCUMENT - typedef std::vector<char>::iterator Iterator; - typedef std::vector<char>::const_iterator ConstIterator; -#endif - - /*! - * Constructs an empty byte vector. - */ - ByteVector(); - - /*! - * Construct a vector of size \a size with all values set to \a value by - * default. - */ - ByteVector(uint size, char value = 0); - - /*! - * Contructs a byte vector that is a copy of \a v. - */ - ByteVector(const ByteVector &v); - - /*! - * Contructs a byte vector that contains \a c. - */ - ByteVector(char c); - - /*! - * Constructs a byte vector that copies \a data for up to \a length bytes. - */ - ByteVector(const char *data, uint length); - - /*! - * Constructs a byte vector that copies \a data up to the first null - * byte. The behavior is undefined if \a data is not null terminated. - * This is particularly useful for constructing byte arrays from string - * constants. - */ - ByteVector(const char *data); - - /*! - * Destroys this ByteVector instance. - */ - virtual ~ByteVector(); - - /*! - * Sets the data for the byte array using the first \a length bytes of \a data - */ - ByteVector &setData(const char *data, uint length); - - /*! - * Sets the data for the byte array copies \a data up to the first null - * byte. The behavior is undefined if \a data is not null terminated. - */ - ByteVector &setData(const char *data); - - /*! - * Returns a pointer to the internal data structure. - * - * \warning Care should be taken when modifying this data structure as it is - * easy to corrupt the ByteVector when doing so. Specifically, while the - * data may be changed, its length may not be. - */ - char *data(); - - /*! - * Returns a pointer to the internal data structure which may not be modified. - */ - const char *data() const; - - /*! - * Returns a byte vector made up of the bytes starting at \a index and - * for \a length bytes. If \a length is not specified it will return the bytes - * from \a index to the end of the vector. - */ - ByteVector mid(uint index, uint length = 0xffffffff) const; - - /*! - * This essentially performs the same as operator[](), but instead of causing - * a runtime error if the index is out of bounds, it will return a null byte. - */ - char at(uint index) const; - - /*! - * Searches the ByteVector for \a pattern starting at \a offset and returns - * the offset. Returns -1 if the pattern was not found. If \a byteAlign is - * specified the pattern will only be matched if it starts on a byte divisible - * by \a byteAlign (starting from \a offset). - */ - int find(const ByteVector &pattern, uint offset = 0, int byteAlign = 1) const; - - /*! - * Searches the ByteVector for \a pattern starting from either the end of the - * vector or \a offset and returns the offset. Returns -1 if the pattern was - * not found. If \a byteAlign is specified the pattern will only be matched - * if it starts on a byte divisible by \a byteAlign (starting from \a offset). - */ - int rfind(const ByteVector &pattern, uint offset = 0, int byteAlign = 1) const; - - /*! - * Checks to see if the vector contains the \a pattern starting at position - * \a offset. Optionally, if you only want to search for part of the pattern - * you can specify an offset within the pattern to start from. Also, you can - * specify to only check for the first \a patternLength bytes of \a pattern with - * the \a patternLength argument. - */ - bool containsAt(const ByteVector &pattern, uint offset, uint patternOffset = 0, uint patternLength = 0xffffffff) const; - - /*! - * Returns true if the vector starts with \a pattern. - */ - bool startsWith(const ByteVector &pattern) const; - - /*! - * Returns true if the vector ends with \a pattern. - */ - bool endsWith(const ByteVector &pattern) const; - - /*! - * Replaces \a pattern with \a with and returns a reference to the ByteVector - * after the operation. This \e does modify the vector. - */ - ByteVector &replace(const ByteVector &pattern, const ByteVector &with); - - /*! - * Checks for a partial match of \a pattern at the end of the vector. It - * returns the offset of the partial match within the vector, or -1 if the - * pattern is not found. This method is particularly useful when searching for - * patterns that start in one vector and end in another. When combined with - * startsWith() it can be used to find a pattern that overlaps two buffers. - * - * \note This will not match the complete pattern at the end of the string; use - * endsWith() for that. - */ - int endsWithPartialMatch(const ByteVector &pattern) const; - - /*! - * Appends \a v to the end of the ByteVector. - */ - ByteVector &append(const ByteVector &v); - - /*! - * Clears the data. - */ - ByteVector &clear(); - - /*! - * Returns the size of the array. - */ - uint size() const; - - /*! - * Resize the vector to \a size. If the vector is currently less than - * \a size, pad the remaining spaces with \a padding. Returns a reference - * to the resized vector. - */ - ByteVector &resize(uint size, char padding = 0); - - /*! - * Returns an Iterator that points to the front of the vector. - */ - Iterator begin(); - - /*! - * Returns a ConstIterator that points to the front of the vector. - */ - ConstIterator begin() const; - - /*! - * Returns an Iterator that points to the back of the vector. - */ - Iterator end(); - - /*! - * Returns a ConstIterator that points to the back of the vector. - */ - ConstIterator end() const; - - /*! - * Returns true if the vector is null. - * - * \note A vector may be empty without being null. - * \see isEmpty() - */ - bool isNull() const; - - /*! - * Returns true if the ByteVector is empty. - * - * \see size() - * \see isNull() - */ - bool isEmpty() const; - - /*! - * Returns a CRC checksum of the byte vector's data. - */ - uint checksum() const; - - /*! - * Converts the first 4 bytes of the vector to an unsigned integer. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see fromUInt() - */ - uint toUInt(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 2 bytes of the vector to a short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - short toShort(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 2 bytes of the vector to a unsigned short. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. - * - * \see fromShort() - */ - unsigned short toUShort(bool mostSignificantByteFirst = true) const; - - /*! - * Converts the first 8 bytes of the vector to a (signed) long long. - * - * If \a mostSignificantByteFirst is true this will operate left to right - * evaluating the integer. For example if \a mostSignificantByteFirst is - * true then $00 00 00 00 00 00 00 01 == 0x0000000000000001 == 1, - * if false, $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. - * - * \see fromUInt() - */ - long long toLongLong(bool mostSignificantByteFirst = true) const; - - /*! - * Creates a 4 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 00 00 01 == 0x00000001 == 1, if false, $01 00 00 00 == - * 0x01000000 == 1. - * - * \see toUInt() - */ - static ByteVector fromUInt(uint value, bool mostSignificantByteFirst = true); - - /*! - * Creates a 2 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 01 == 0x0001 == 1, if false, $01 00 == 0x0100 == 1. - * - * \see toShort() - */ - static ByteVector fromShort(short value, bool mostSignificantByteFirst = true); - - /*! - * Creates a 8 byte ByteVector based on \a value. If - * \a mostSignificantByteFirst is true, then this will operate left to right - * in building the ByteVector. For example if \a mostSignificantByteFirst is - * true then $00 00 00 01 == 0x0000000000000001 == 1, if false, - * $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. - * - * \see toLongLong() - */ - static ByteVector fromLongLong(long long value, bool mostSignificantByteFirst = true); - - /*! - * Returns a ByteVector based on the CString \a s. - */ - static ByteVector fromCString(const char *s, uint length = 0xffffffff); - - /*! - * Returns a const refernence to the byte at \a index. - */ - const char &operator[](int index) const; - - /*! - * Returns a reference to the byte at \a index. - */ - char &operator[](int index); - - /*! - * Returns true if this ByteVector and \a v are equal. - */ - bool operator==(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector and \a v are not equal. - */ - bool operator!=(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector and the null terminated C string \a s - * contain the same data. - */ - bool operator==(const char *s) const; - - /*! - * Returns true if this ByteVector and the null terminated C string \a s - * do not contain the same data. - */ - bool operator!=(const char *s) const; - - /*! - * Returns true if this ByteVector is less than \a v. The value of the - * vectors is determined by evaluating the character from left to right, and - * in the event one vector is a superset of the other, the size is used. - */ - bool operator<(const ByteVector &v) const; - - /*! - * Returns true if this ByteVector is greater than \a v. - */ - bool operator>(const ByteVector &v) const; - - /*! - * Returns a vector that is \a v appended to this vector. - */ - ByteVector operator+(const ByteVector &v) const; - - /*! - * Copies ByteVector \a v. - */ - ByteVector &operator=(const ByteVector &v); - - /*! - * Copies ByteVector \a v. - */ - ByteVector &operator=(char c); - - /*! - * Copies ByteVector \a v. - */ - ByteVector &operator=(const char *data); - - /*! - * A static, empty ByteVector which is convenient and fast (since returning - * an empty or "null" value does not require instantiating a new ByteVector). - */ - static ByteVector null; - - /*! - * Returns a hex-encoded copy of the byte vector. - */ - ByteVector toHex() const; - - protected: - /* - * If this ByteVector is being shared via implicit sharing, do a deep copy - * of the data and separate from the shared members. This should be called - * by all non-const subclass members. - */ - void detach(); - - private: - class ByteVectorPrivate; - ByteVectorPrivate *d; - }; - -} - -/*! - * \relates TagLib::ByteVector - * Streams the ByteVector \a v to the output stream \a s. - */ -TAGLIB_EXPORT std::ostream &operator<<(std::ostream &s, const TagLib::ByteVector &v); - -#endif diff --git a/src/mytaglib/tbytevectorlist.h b/src/mytaglib/tbytevectorlist.h deleted file mode 100644 index 5852583..0000000 --- a/src/mytaglib/tbytevectorlist.h +++ /dev/null @@ -1,91 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_BYTEVECTORLIST_H -#define TAGLIB_BYTEVECTORLIST_H - -#include "taglib_export.h" -#include "tbytevector.h" -#include "tlist.h" - -namespace TagLib { - - //! A list of ByteVectors - - /*! - * A List specialization with some handy features useful for ByteVectors. - */ - - class TAGLIB_EXPORT ByteVectorList : public List<ByteVector> - { - public: - - /*! - * Construct an empty ByteVectorList. - */ - ByteVectorList(); - - /*! - * Destroys this ByteVectorList instance. - */ - virtual ~ByteVectorList(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - ByteVectorList(const ByteVectorList &l); - - /*! - * Convert the ByteVectorList to a ByteVector separated by \a separator. By - * default a space is used. - */ - ByteVector toByteVector(const ByteVector &separator = " ") const; - - /*! - * Splits the ByteVector \a v into several strings at \a pattern. This will - * not include the pattern in the returned ByteVectors. - */ - static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, - int byteAlign = 1); - /*! - * Splits the ByteVector \a v into several strings at \a pattern. This will - * not include the pattern in the returned ByteVectors. \a max is the - * maximum number of entries that will be separated. If \a max for instance - * is 2 then a maximum of 1 match will be found and the vector will be split - * on that match. - */ - // BIC: merge with the function above - static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, - int byteAlign, int max); - private: - class ByteVectorListPrivate; - ByteVectorListPrivate *d; - }; - -} - -#endif diff --git a/src/mytaglib/tdebug.h b/src/mytaglib/tdebug.h deleted file mode 100644 index 5204fe7..0000000 --- a/src/mytaglib/tdebug.h +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_DEBUG_H -#define TAGLIB_DEBUG_H - -namespace TagLib { - - class String; - class ByteVector; - -#ifndef DO_NOT_DOCUMENT -#ifndef NDEBUG - - /*! - * A simple function that prints debugging output to cerr if debugging is - * not disabled. - * - * \warning Do not use this outside of TagLib, it could lead to undefined - * symbols in your build if TagLib is built with NDEBUG defined and your - * application is not. - * - * \internal - */ - void debug(const String &s); - - /*! - * For debugging binary data. - * - * \warning Do not use this outside of TagLib, it could lead to undefined - * symbols in your build if TagLib is built with NDEBUG defined and your - * application is not. - * - * \internal - */ - void debugData(const ByteVector &v); - -#else - - // Define these to an empty statement if debugging is disabled. - -#define debug(x) -#define debugData(x) - -#endif -#endif -} - -#endif diff --git a/src/mytaglib/textidentificationframe.h b/src/mytaglib/textidentificationframe.h deleted file mode 100644 index 418ef97..0000000 --- a/src/mytaglib/textidentificationframe.h +++ /dev/null @@ -1,258 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TEXTIDENTIFICATIONFRAME_H -#define TAGLIB_TEXTIDENTIFICATIONFRAME_H - -#include "tstringlist.h" -#include "taglib_export.h" - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - class Tag; - - //! An ID3v2 text identification frame implementation - - /*! - * This is an implementation of the most common type of ID3v2 frame -- text - * identification frames. There are a number of variations on this. Those - * enumerated in the ID3v2.4 standard are: - * - * <ul> - * <li><b>TALB</b> Album/Movie/Show title</li> - * <li><b>TBPM</b> BPM (beats per minute)</li> - * <li><b>TCOM</b> Composer</li> - * <li><b>TCON</b> Content type</li> - * <li><b>TCOP</b> Copyright message</li> - * <li><b>TDEN</b> Encoding time</li> - * <li><b>TDLY</b> Playlist delay</li> - * <li><b>TDOR</b> Original release time</li> - * <li><b>TDRC</b> Recording time</li> - * <li><b>TDRL</b> Release time</li> - * <li><b>TDTG</b> Tagging time</li> - * <li><b>TENC</b> Encoded by</li> - * <li><b>TEXT</b> Lyricist/Text writer</li> - * <li><b>TFLT</b> File type</li> - * <li><b>TIPL</b> Involved people list</li> - * <li><b>TIT1</b> Content group description</li> - * <li><b>TIT2</b> Title/songname/content description</li> - * <li><b>TIT3</b> Subtitle/Description refinement</li> - * <li><b>TKEY</b> Initial key</li> - * <li><b>TLAN</b> Language(s)</li> - * <li><b>TLEN</b> Length</li> - * <li><b>TMCL</b> Musician credits list</li> - * <li><b>TMED</b> Media type</li> - * <li><b>TMOO</b> Mood</li> - * <li><b>TOAL</b> Original album/movie/show title</li> - * <li><b>TOFN</b> Original filename</li> - * <li><b>TOLY</b> Original lyricist(s)/text writer(s)</li> - * <li><b>TOPE</b> Original artist(s)/performer(s)</li> - * <li><b>TOWN</b> File owner/licensee</li> - * <li><b>TPE1</b> Lead performer(s)/Soloist(s)</li> - * <li><b>TPE2</b> Band/orchestra/accompaniment</li> - * <li><b>TPE3</b> Conductor/performer refinement</li> - * <li><b>TPE4</b> Interpreted, remixed, or otherwise modified by</li> - * <li><b>TPOS</b> Part of a set</li> - * <li><b>TPRO</b> Produced notice</li> - * <li><b>TPUB</b> Publisher</li> - * <li><b>TRCK</b> Track number/Position in set</li> - * <li><b>TRSN</b> Internet radio station name</li> - * <li><b>TRSO</b> Internet radio station owner</li> - * <li><b>TSOA</b> Album sort order</li> - * <li><b>TSOP</b> Performer sort order</li> - * <li><b>TSOT</b> Title sort order</li> - * <li><b>TSRC</b> ISRC (international standard recording code)</li> - * <li><b>TSSE</b> Software/Hardware and settings used for encoding</li> - * <li><b>TSST</b> Set subtitle</li> - * </ul> - * - * The ID3v2 Frames document gives a description of each of these formats - * and the expected order of strings in each. ID3v2::Header::frameID() can - * be used to determine the frame type. - * - * \note If non-Latin1 compatible strings are used with this class, even if - * the text encoding is set to Latin1, the frame will be written using UTF8 - * (with the encoding flag appropriately set in the output). - */ - - class TAGLIB_EXPORT TextIdentificationFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty frame of type \a type. Uses \a encoding as the - * default text encoding. - * - * \note In this case you must specify the text encoding as it - * resolves the ambiguity between constructors. - * - * \note Please see the note in the class description regarding Latin1. - */ - TextIdentificationFrame(const ByteVector &type, String::Type encoding); - - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit TextIdentificationFrame(const ByteVector &data); - - /*! - * Destroys this TextIdentificationFrame instance. - */ - virtual ~TextIdentificationFrame(); - - /*! - * Text identification frames are a list of string fields. - * - * This function will accept either a StringList or a String (using the - * StringList constructor that accepts a single String). - * - * \note This will not change the text encoding of the frame even if the - * strings passed in are not of the same encoding. Please use - * setEncoding(s.type()) if you wish to change the encoding of the frame. - */ - void setText(const StringList &l); - - // Reimplementations. - - virtual void setText(const String &s); - virtual String toString() const; - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \note Please see the note in the class description regarding Latin1. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \note Please see the note in the class description regarding Latin1. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns a list of the strings in this frame. - */ - StringList fieldList() const; - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - TextIdentificationFrame(const ByteVector &data, Header *h); - - private: - TextIdentificationFrame(const TextIdentificationFrame &); - TextIdentificationFrame &operator=(const TextIdentificationFrame &); - - class TextIdentificationFramePrivate; - TextIdentificationFramePrivate *d; - }; - - /*! - * This is a specialization of text identification frames that allows for - * user defined entries. Each entry has a description in addition to the - * normal list of fields that a text identification frame has. - * - * This description identifies the frame and must be unique. - */ - - //! An ID3v2 custom text identification frame implementationx - - class TAGLIB_EXPORT UserTextIdentificationFrame : public TextIdentificationFrame - { - friend class FrameFactory; - - public: - /*! - * Constructs an empty user defined text identification frame. For this to be - * a useful frame both a description and text must be set. - */ - explicit UserTextIdentificationFrame(String::Type encoding = String::Latin1); - - /*! - * Creates a frame based on \a data. - */ - explicit UserTextIdentificationFrame(const ByteVector &data); - - virtual String toString() const; - - /*! - * Returns the description for this frame. - */ - String description() const; - - /*! - * Sets the description of the frame to \a s. \a s must be unique. You can - * check for the presence of another user defined text frame of the same type - * using find() and testing for null. - */ - void setDescription(const String &s); - - StringList fieldList() const; - void setText(const String &text); - void setText(const StringList &fields); - - /*! - * Searches for the user defined text frame with the description \a description - * in \a tag. This returns null if no matching frames were found. - */ - static UserTextIdentificationFrame *find(Tag *tag, const String &description); - - private: - UserTextIdentificationFrame(const ByteVector &data, Header *h); - UserTextIdentificationFrame(const TextIdentificationFrame &); - UserTextIdentificationFrame &operator=(const UserTextIdentificationFrame &); - - void checkFields(); - - class UserTextIdentificationFramePrivate; - UserTextIdentificationFramePrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/tfile.h b/src/mytaglib/tfile.h deleted file mode 100644 index da32280..0000000 --- a/src/mytaglib/tfile.h +++ /dev/null @@ -1,270 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FILE_H -#define TAGLIB_FILE_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tbytevector.h" - -namespace TagLib { - - class String; - class Tag; - class AudioProperties; - -#ifdef _WIN32 - class TAGLIB_EXPORT FileName - { - public: - FileName(const wchar_t *name) : m_wname(name) {} - FileName(const char *name) : m_name(name) {} - operator const wchar_t *() const { return m_wname.c_str(); } - operator const char *() const { return m_name.c_str(); } - private: - std::string m_name; - std::wstring m_wname; - }; -#else - typedef const char *FileName; -#endif - - //! A file class with some useful methods for tag manipulation - - /*! - * This class is a basic file class with some methods that are particularly - * useful for tag editors. It has methods to take advantage of - * ByteVector and a binary search method for finding patterns in a file. - */ - - class TAGLIB_EXPORT File - { - public: - /*! - * Position in the file used for seeking. - */ - enum Position { - //! Seek from the beginning of the file. - Beginning, - //! Seek from the current position in the file. - Current, - //! Seek from the end of the file. - End - }; - - /*! - * Destroys this File instance. - */ - virtual ~File(); - - /*! - * Returns the file name in the local file system encoding. - */ - FileName name() const; - - /*! - * Returns a pointer to this file's tag. This should be reimplemented in - * the concrete subclasses. - */ - virtual Tag *tag() const = 0; - - /*! - * Returns a pointer to this file's audio properties. This should be - * reimplemented in the concrete subclasses. If no audio properties were - * read then this will return a null pointer. - */ - virtual AudioProperties *audioProperties() const = 0; - - /*! - * Save the file and its associated tags. This should be reimplemented in - * the concrete subclasses. Returns true if the save succeeds. - * - * \warning On UNIX multiple processes are able to write to the same file at - * the same time. This can result in serious file corruption. If you are - * developing a program that makes use of TagLib from multiple processes you - * must insure that you are only doing writes to a particular file from one - * of them. - */ - virtual bool save() = 0; - - /*! - * Reads a block of size \a length at the current get pointer. - */ - ByteVector readBlock(ulong length); - - /*! - * Attempts to write the block \a data at the current get pointer. If the - * file is currently only opened read only -- i.e. readOnly() returns true -- - * this attempts to reopen the file in read/write mode. - * - * \note This should be used instead of using the streaming output operator - * for a ByteVector. And even this function is significantly slower than - * doing output with a char[]. - */ - void writeBlock(const ByteVector &data); - - /*! - * Returns the offset in the file that \a pattern occurs at or -1 if it can - * not be found. If \a before is set, the search will only continue until the - * pattern \a before is found. This is useful for tagging purposes to search - * for a tag before the synch frame. - * - * Searching starts at \a fromOffset, which defaults to the beginning of the - * file. - * - * \note This has the practial limitation that \a pattern can not be longer - * than the buffer size used by readBlock(). Currently this is 1024 bytes. - */ - long find(const ByteVector &pattern, - long fromOffset = 0, - const ByteVector &before = ByteVector::null); - - /*! - * Returns the offset in the file that \a pattern occurs at or -1 if it can - * not be found. If \a before is set, the search will only continue until the - * pattern \a before is found. This is useful for tagging purposes to search - * for a tag before the synch frame. - * - * Searching starts at \a fromOffset and proceeds from the that point to the - * beginning of the file and defaults to the end of the file. - * - * \note This has the practial limitation that \a pattern can not be longer - * than the buffer size used by readBlock(). Currently this is 1024 bytes. - */ - long rfind(const ByteVector &pattern, - long fromOffset = 0, - const ByteVector &before = ByteVector::null); - - /*! - * Insert \a data at position \a start in the file overwriting \a replace - * bytes of the original content. - * - * \note This method is slow since it requires rewriting all of the file - * after the insertion point. - */ - void insert(const ByteVector &data, ulong start = 0, ulong replace = 0); - - /*! - * Removes a block of the file starting a \a start and continuing for - * \a length bytes. - * - * \note This method is slow since it involves rewriting all of the file - * after the removed portion. - */ - void removeBlock(ulong start = 0, ulong length = 0); - - /*! - * Returns true if the file is read only (or if the file can not be opened). - */ - bool readOnly() const; - - /*! - * Since the file can currently only be opened as an argument to the - * constructor (sort-of by design), this returns if that open succeeded. - */ - bool isOpen() const; - - /*! - * Returns true if the file is open and readble. - */ - bool isValid() const; - - /*! - * Move the I/O pointer to \a offset in the file from position \a p. This - * defaults to seeking from the beginning of the file. - * - * \see Position - */ - void seek(long offset, Position p = Beginning); - - /*! - * Reset the end-of-file and error flags on the file. - */ - void clear(); - - /*! - * Returns the current offset within the file. - */ - long tell() const; - - /*! - * Returns the length of the file. - */ - long length(); - - /*! - * Returns true if \a file can be opened for reading. If the file does not - * exist, this will return false. - * - * \deprecated - */ - static bool isReadable(const char *file); - - /*! - * Returns true if \a file can be opened for writing. - * - * \deprecated - */ - static bool isWritable(const char *name); - - protected: - /*! - * Construct a File object and opens the \a file. \a file should be a - * be a C-string in the local file system encoding. - * - * \note Constructor is protected since this class should only be - * instantiated through subclasses. - */ - File(FileName file); - - /*! - * Marks the file as valid or invalid. - * - * \see isValid() - */ - void setValid(bool valid); - - /*! - * Truncates the file to a \a length. - */ - void truncate(long length); - - /*! - * Returns the buffer size that is used for internal buffering. - */ - static uint bufferSize(); - - private: - File(const File &); - File &operator=(const File &); - - class FilePrivate; - FilePrivate *d; - }; - -} - -#endif diff --git a/src/mytaglib/tlist.h b/src/mytaglib/tlist.h deleted file mode 100644 index dce0e1c..0000000 --- a/src/mytaglib/tlist.h +++ /dev/null @@ -1,252 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_LIST_H -#define TAGLIB_LIST_H - -#include "taglib.h" - -#include <list> - -namespace TagLib { - - //! A generic, implicitly shared list. - - /*! - * This is basic generic list that's somewhere between a std::list and a - * QValueList. This class is implicitly shared. For example: - * - * \code - * - * TagLib::List<int> l = someOtherIntList; - * - * \endcode - * - * The above example is very cheap. This also makes lists suitable for the - * return types of functions. The above example will just copy a pointer rather - * than copying the data in the list. When your \e shared list's data changes, - * only \e then will the data be copied. - */ - - template <class T> class List - { - public: -#ifndef DO_NOT_DOCUMENT - typedef typename std::list<T>::iterator Iterator; - typedef typename std::list<T>::const_iterator ConstIterator; -#endif - - /*! - * Constructs an empty list. - */ - List(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - List(const List<T> &l); - - /*! - * Destroys this List instance. If auto deletion is enabled and this list - * contains a pointer type all of the memebers are also deleted. - */ - virtual ~List(); - - /*! - * Returns an STL style iterator to the beginning of the list. See - * std::list::const_iterator for the semantics. - */ - Iterator begin(); - - /*! - * Returns an STL style constant iterator to the beginning of the list. See - * std::list::iterator for the semantics. - */ - ConstIterator begin() const; - - /*! - * Returns an STL style iterator to the end of the list. See - * std::list::iterator for the semantics. - */ - Iterator end(); - - /*! - * Returns an STL style constant iterator to the end of the list. See - * std::list::const_iterator for the semantics. - */ - ConstIterator end() const; - - /*! - * Inserts a copy of \a value before \a it. - */ - Iterator insert(Iterator it, const T &value); - - /*! - * Inserts the \a value into the list. This assumes that the list is - * currently sorted. If \a unique is true then the value will not - * be inserted if it is already in the list. - */ - List<T> &sortedInsert(const T &value, bool unique = false); - - /*! - * Appends \a item to the end of the list and returns a reference to the - * list. - */ - List<T> &append(const T &item); - - /*! - * Appends all of the values in \a l to the end of the list and returns a - * reference to the list. - */ - List<T> &append(const List<T> &l); - - /*! - * Prepends \a item to the beginning list and returns a reference to the - * list. - */ - List<T> &prepend(const T &item); - - /*! - * Prepends all of the items in \a l to the beginning list and returns a - * reference to the list. - */ - List<T> &prepend(const List<T> &l); - - /*! - * Clears the list. If auto deletion is enabled and this list contains a - * pointer type the members are also deleted. - * - * \see setAutoDelete() - */ - List<T> &clear(); - - /*! - * Returns the number of elements in the list. - */ - uint size() const; - bool isEmpty() const; - - /*! - * Find the first occurrence of \a value. - */ - Iterator find(const T &value); - - /*! - * Find the first occurrence of \a value. - */ - ConstIterator find(const T &value) const; - - /*! - * Returns true if the list contains \a value. - */ - bool contains(const T &value) const; - - /*! - * Erase the item at \a it from the list. - */ - Iterator erase(Iterator it); - - /*! - * Returns a reference to the first item in the list. - */ - const T &front() const; - - /*! - * Returns a reference to the first item in the list. - */ - T &front(); - - /*! - * Returns a reference to the last item in the list. - */ - const T &back() const; - - /*! - * Returns a reference to the last item in the list. - */ - T &back(); - - /*! - * Auto delete the members of the list when the last reference to the list - * passes out of scope. This will have no effect on lists which do not - * contain a pointer type. - * - * \note This relies on partial template instantiation -- most modern C++ - * compilers should now support this. - */ - void setAutoDelete(bool autoDelete); - - /*! - * Returns a reference to item \a i in the list. - * - * \warning This method is slow. Use iterators to loop through the list. - */ - T &operator[](uint i); - - /*! - * Returns a const reference to item \a i in the list. - * - * \warning This method is slow. Use iterators to loop through the list. - */ - const T &operator[](uint i) const; - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - List<T> &operator=(const List<T> &l); - - /*! - * Compares this list with \a l and returns true if all of the elements are - * the same. - */ - bool operator==(const List<T> &l) const; - - protected: - /* - * If this List is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: -#ifndef DO_NOT_DOCUMENT - template <class TP> class ListPrivate; - ListPrivate<T> *d; -#endif - }; - -} - -// Since GCC doesn't support the "export" keyword, we have to include the -// implementation. - -#include "tlist.tcc" - -#endif diff --git a/src/mytaglib/tlist.tcc b/src/mytaglib/tlist.tcc deleted file mode 100644 index a11887d..0000000 --- a/src/mytaglib/tlist.tcc +++ /dev/null @@ -1,316 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <algorithm> - -namespace TagLib { - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -// The functionality of List<T>::setAutoDelete() is implemented here partial -// template specialization. This is implemented in such a way that calling -// setAutoDelete() on non-pointer types will simply have no effect. - -// A base for the generic and specialized private class types. New -// non-templatized members should be added here. - -class ListPrivateBase : public RefCounter -{ -public: - ListPrivateBase() : autoDelete(false) {} - bool autoDelete; -}; - -// A generic implementation - -template <class T> -template <class TP> class List<T>::ListPrivate : public ListPrivateBase -{ -public: - ListPrivate() : ListPrivateBase() {} - ListPrivate(const std::list<TP> &l) : ListPrivateBase(), list(l) {} - void clear() { - list.clear(); - } - std::list<TP> list; -}; - -// A partial specialization for all pointer types that implements the -// setAutoDelete() functionality. - -template <class T> -template <class TP> class List<T>::ListPrivate<TP *> : public ListPrivateBase -{ -public: - ListPrivate() : ListPrivateBase() {} - ListPrivate(const std::list<TP *> &l) : ListPrivateBase(), list(l) {} - ~ListPrivate() { - clear(); - } - void clear() { - if(autoDelete) { - typename std::list<TP *>::const_iterator it = list.begin(); - for(; it != list.end(); ++it) - delete *it; - } - list.clear(); - } - std::list<TP *> list; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -template <class T> -List<T>::List() -{ - d = new ListPrivate<T>; -} - -template <class T> -List<T>::List(const List<T> &l) : d(l.d) -{ - d->ref(); -} - -template <class T> -List<T>::~List() -{ - if(d->deref()) - delete d; -} - -template <class T> -typename List<T>::Iterator List<T>::begin() -{ - detach(); - return d->list.begin(); -} - -template <class T> -typename List<T>::ConstIterator List<T>::begin() const -{ - return d->list.begin(); -} - -template <class T> -typename List<T>::Iterator List<T>::end() -{ - detach(); - return d->list.end(); -} - -template <class T> -typename List<T>::ConstIterator List<T>::end() const -{ - return d->list.end(); -} - -template <class T> -typename List<T>::Iterator List<T>::insert(Iterator it, const T &item) -{ - detach(); - return d->list.insert(it, item); -} - -template <class T> -List<T> &List<T>::sortedInsert(const T &value, bool unique) -{ - detach(); - Iterator it = begin(); - while(it != end() && *it < value) - ++it; - if(unique && it != end() && *it == value) - return *this; - insert(it, value); - return *this; -} - -template <class T> -List<T> &List<T>::append(const T &item) -{ - detach(); - d->list.push_back(item); - return *this; -} - -template <class T> -List<T> &List<T>::append(const List<T> &l) -{ - detach(); - d->list.insert(d->list.end(), l.begin(), l.end()); - return *this; -} - -template <class T> -List<T> &List<T>::prepend(const T &item) -{ - detach(); - d->list.push_front(item); - return *this; -} - -template <class T> -List<T> &List<T>::prepend(const List<T> &l) -{ - detach(); - d->list.insert(d->list.begin(), l.begin(), l.end()); - return *this; -} - -template <class T> -List<T> &List<T>::clear() -{ - detach(); - d->clear(); - return *this; -} - -template <class T> -TagLib::uint List<T>::size() const -{ - return d->list.size(); -} - -template <class T> -bool List<T>::isEmpty() const -{ - return d->list.empty(); -} - -template <class T> -typename List<T>::Iterator List<T>::find(const T &value) -{ - return std::find(d->list.begin(), d->list.end(), value); -} - -template <class T> -typename List<T>::ConstIterator List<T>::find(const T &value) const -{ - return std::find(d->list.begin(), d->list.end(), value); -} - -template <class T> -bool List<T>::contains(const T &value) const -{ - return std::find(d->list.begin(), d->list.end(), value) != d->list.end(); -} - -template <class T> -typename List<T>::Iterator List<T>::erase(Iterator it) -{ - return d->list.erase(it); -} - -template <class T> -const T &List<T>::front() const -{ - return d->list.front(); -} - -template <class T> -T &List<T>::front() -{ - detach(); - return d->list.front(); -} - -template <class T> -const T &List<T>::back() const -{ - return d->list.back(); -} - -template <class T> -void List<T>::setAutoDelete(bool autoDelete) -{ - d->autoDelete = autoDelete; -} - -template <class T> -T &List<T>::back() -{ - detach(); - return d->list.back(); -} - -template <class T> -T &List<T>::operator[](uint i) -{ - Iterator it = d->list.begin(); - - for(uint j = 0; j < i; j++) - ++it; - - return *it; -} - -template <class T> -const T &List<T>::operator[](uint i) const -{ - ConstIterator it = d->list.begin(); - - for(uint j = 0; j < i; j++) - ++it; - - return *it; -} - -template <class T> -List<T> &List<T>::operator=(const List<T> &l) -{ - if(&l == this) - return *this; - - if(d->deref()) - delete d; - d = l.d; - d->ref(); - return *this; -} - -template <class T> -bool List<T>::operator==(const List<T> &l) const -{ - return d->list == l.d->list; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -template <class T> -void List<T>::detach() -{ - if(d->count() > 1) { - d->deref(); - d = new ListPrivate<T>(d->list); - } -} - -} // namespace TagLib diff --git a/src/mytaglib/tmap.h b/src/mytaglib/tmap.h deleted file mode 100644 index f2f8364..0000000 --- a/src/mytaglib/tmap.h +++ /dev/null @@ -1,200 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MAP_H -#define TAGLIB_MAP_H - -#include <map> -using namespace std; - -#include "taglib.h" - -namespace TagLib { - - //! A generic, implicitly shared map. - - /*! - * This implements a standard map container that associates a key with a value - * and has fast key-based lookups. This map is also implicitly shared making - * it suitable for pass-by-value usage. - */ - - template <class Key, class T> class Map - { - public: -#ifndef DO_NOT_DOCUMENT -#ifdef WANT_CLASS_INSTANTIATION_OF_MAP - // Some STL implementations get snippy over the use of the - // class keyword to distinguish different templates; Sun Studio - // in particular finds multiple specializations in certain rare - // cases and complains about that. GCC doesn't seem to mind, - // and uses the typedefs further below without the class keyword. - // Not all the specializations of Map can use the class keyword - // (when T is not actually a class type), so don't apply this - // generally. - typedef typename std::map<class Key, class T>::iterator Iterator; - typedef typename std::map<class Key, class T>::const_iterator ConstIterator; -#else - typedef typename std::map<Key, T>::iterator Iterator; - typedef typename std::map<Key, T>::const_iterator ConstIterator; -#endif -#endif - - /*! - * Constructs an empty Map. - */ - Map(); - - /*! - * Make a shallow, implicitly shared, copy of \a m. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - Map(const Map<Key, T> &m); - - /*! - * Destroys this instance of the Map. - */ - virtual ~Map(); - - /*! - * Returns an STL style iterator to the beginning of the map. See - * std::map::iterator for the semantics. - */ - Iterator begin(); - - /*! - * Returns an STL style iterator to the beginning of the map. See - * std::map::const_iterator for the semantics. - */ - ConstIterator begin() const; - - /*! - * Returns an STL style iterator to the end of the map. See - * std::map::iterator for the semantics. - */ - Iterator end(); - - /*! - * Returns an STL style iterator to the end of the map. See - * std::map::const_iterator for the semantics. - */ - ConstIterator end() const; - - /*! - * Inserts \a value under \a key in the map. If a value for \a key already - * exists it will be overwritten. - */ - Map<Key, T> &insert(const Key &key, const T &value); - - /*! - * Removes all of the elements from elements from the map. This however - * will not delete pointers if the mapped type is a pointer type. - */ - Map<Key, T> &clear(); - - /*! - * The number of elements in the map. - * - * \see isEmpty() - */ - uint size() const; - - /*! - * Returns true if the map is empty. - * - * \see size() - */ - bool isEmpty() const; - - /*! - * Find the first occurrence of \a key. - */ - Iterator find(const Key &key); - - /*! - * Find the first occurrence of \a key. - */ - ConstIterator find(const Key &key) const; - - /*! - * Returns true if the map contains an instance of \a key. - */ - bool contains(const Key &key) const; - - /*! - * Erase the item at \a it from the list. - */ - Map<Key, T> &erase(Iterator it); - - /*! - * Erase the item with \a key from the list. - */ - Map<Key, T> &erase(const Key &key); - - /*! - * Returns a reference to the value associated with \a key. - * - * \note This has undefined behavior if the key is not present in the map. - */ - const T &operator[](const Key &key) const; - - /*! - * Returns a reference to the value associated with \a key. - * - * \note This has undefined behavior if the key is not present in the map. - */ - T &operator[](const Key &key); - - /*! - * Make a shallow, implicitly shared, copy of \a m. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - Map<Key, T> &operator=(const Map<Key, T> &m); - - protected: - /* - * If this List is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: -#ifndef DO_NOT_DOCUMENT - template <class KeyP, class TP> class MapPrivate; - MapPrivate<Key, T> *d; -#endif - }; - -} - -// Since GCC doesn't support the "export" keyword, we have to include the -// implementation. - -#include "tmap.tcc" - -#endif diff --git a/src/mytaglib/tmap.tcc b/src/mytaglib/tmap.tcc deleted file mode 100644 index 0f2b993..0000000 --- a/src/mytaglib/tmap.tcc +++ /dev/null @@ -1,196 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -namespace TagLib { - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -template <class Key, class T> -template <class KeyP, class TP> -class Map<Key, T>::MapPrivate : public RefCounter -{ -public: - MapPrivate() : RefCounter() {} -#ifdef WANT_CLASS_INSTANTIATION_OF_MAP - MapPrivate(const std::map<class KeyP, class TP>& m) : RefCounter(), map(m) {} - std::map<class KeyP, class TP> map; -#else - MapPrivate(const std::map<KeyP, TP>& m) : RefCounter(), map(m) {} - std::map<KeyP, TP> map; -#endif -}; - -template <class Key, class T> -Map<Key, T>::Map() -{ - d = new MapPrivate<Key, T>; -} - -template <class Key, class T> -Map<Key, T>::Map(const Map<Key, T> &m) : d(m.d) -{ - d->ref(); -} - -template <class Key, class T> -Map<Key, T>::~Map() -{ - if(d->deref()) - delete(d); -} - -template <class Key, class T> -typename Map<Key, T>::Iterator Map<Key, T>::begin() -{ - detach(); - return d->map.begin(); -} - -template <class Key, class T> -typename Map<Key, T>::ConstIterator Map<Key, T>::begin() const -{ - return d->map.begin(); -} - -template <class Key, class T> -typename Map<Key, T>::Iterator Map<Key, T>::end() -{ - detach(); - return d->map.end(); -} - -template <class Key, class T> -typename Map<Key, T>::ConstIterator Map<Key, T>::end() const -{ - return d->map.end(); -} - -template <class Key, class T> -Map<Key, T> &Map<Key, T>::insert(const Key &key, const T &value) -{ - detach(); - d->map[key] = value; - return *this; -} - -template <class Key, class T> -Map<Key, T> &Map<Key, T>::clear() -{ - detach(); - d->map.clear(); - return *this; -} - -template <class Key, class T> -bool Map<Key, T>::isEmpty() const -{ - return d->map.empty(); -} - -template <class Key, class T> -typename Map<Key, T>::Iterator Map<Key, T>::find(const Key &key) -{ - detach(); - return d->map.find(key); -} - -template <class Key, class T> -typename Map<Key,T>::ConstIterator Map<Key, T>::find(const Key &key) const -{ - return d->map.find(key); -} - -template <class Key, class T> -bool Map<Key, T>::contains(const Key &key) const -{ - return d->map.find(key) != d->map.end(); -} - -template <class Key, class T> -Map<Key, T> &Map<Key,T>::erase(Iterator it) -{ - detach(); - d->map.erase(it); - return *this; -} - -template <class Key, class T> -Map<Key, T> &Map<Key,T>::erase(const Key &key) -{ - detach(); - Iterator it = d->map.find(key); - if(it != d->map.end()) - d->map.erase(it); - return *this; -} - -template <class Key, class T> -TagLib::uint Map<Key, T>::size() const -{ - return d->map.size(); -} - -template <class Key, class T> -const T &Map<Key, T>::operator[](const Key &key) const -{ - return d->map[key]; -} - -template <class Key, class T> -T &Map<Key, T>::operator[](const Key &key) -{ - detach(); - return d->map[key]; -} - -template <class Key, class T> -Map<Key, T> &Map<Key, T>::operator=(const Map<Key, T> &m) -{ - if(&m == this) - return *this; - - if(d->deref()) - delete(d); - d = m.d; - d->ref(); - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -template <class Key, class T> -void Map<Key, T>::detach() -{ - if(d->count() > 1) { - d->deref(); - d = new MapPrivate<Key, T>(d->map); - } -} - -} // namespace TagLib diff --git a/src/mytaglib/trueaudiofile.h b/src/mytaglib/trueaudiofile.h deleted file mode 100644 index 32cbf4b..0000000 --- a/src/mytaglib/trueaudiofile.h +++ /dev/null @@ -1,180 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TRUEAUDIOFILE_H -#define TAGLIB_TRUEAUDIOFILE_H - -#include "tfile.h" -#include "trueaudioproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v2 { class Tag; class FrameFactory; } - namespace ID3v1 { class Tag; } - - //! An implementation of TrueAudio metadata - - /*! - * This is implementation of TrueAudio metadata. - * - * This supports ID3v1 and ID3v2 tags as well as reading stream - * properties from the file. - */ - - namespace TrueAudio { - - //! An implementation of TagLib::File with TrueAudio specific methods - - /*! - * This implements and provides an interface for TrueAudio files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to TrueAudio files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches ID3v2 tags. - ID3v2 = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Contructs an TrueAudio file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Contructs an TrueAudio file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. The frames will be created using - * \a frameFactory. - */ - File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Returns the TrueAudio::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Set the ID3v2::FrameFactory to something other than the default. - * - * \see ID3v2FrameFactory - */ - void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v2 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v2 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist. If there is already an APE tag, the - * new ID3v1 tag will be placed after it. - * - * \note The Tag <b>is still</b> owned by the TrueAudio::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist. If there is already an APE tag, the - * new ID3v1 tag will be placed after it. - * - * \note The Tag <b>is still</b> owned by the TrueAudio::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v2::Tag *ID3v2Tag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findID3v1(); - long findID3v2(); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/trueaudioproperties.h b/src/mytaglib/trueaudioproperties.h deleted file mode 100644 index f66fd2e..0000000 --- a/src/mytaglib/trueaudioproperties.h +++ /dev/null @@ -1,93 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TRUEAUDIOPROPERTIES_H -#define TAGLIB_TRUEAUDIOPROPERTIES_H - -#include "audioproperties.h" - -namespace TagLib { - - namespace TrueAudio { - - class File; - - static const uint HeaderSize = 18; - - //! An implementation of audio property reading for TrueAudio - - /*! - * This reads the data from an TrueAudio stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of TrueAudio::Properties with the data read from the - * ByteVector \a data. - */ - Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this TrueAudio::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns number of bits per sample. - */ - int bitsPerSample() const; - - /*! - * Returns the major version number. - */ - int ttaVersion() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/tstring.h b/src/mytaglib/tstring.h deleted file mode 100644 index 693d043..0000000 --- a/src/mytaglib/tstring.h +++ /dev/null @@ -1,483 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_STRING_H -#define TAGLIB_STRING_H - -#include "taglib_export.h" -#include "taglib.h" -#include "tbytevector.h" - -#include <string> -#include <ostream> - -/*! - * \relates TagLib::String - * - * Converts a QString to a TagLib::String without a requirement to link to Qt. - * - * \note consider conversion via usual char-by-char for loop to avoid UTF16->UTF8->UTF16 - * conversion happening in the background - */ -#define QStringToTString(s) TagLib::String(s.utf8().data(), TagLib::String::UTF8) - -/*! - * \relates TagLib::String - * - * Converts a TagLib::String to a QString without a requirement to link to Qt. - * - * \note consider conversion via usual char-by-char for loop to avoid UTF16->UTF8->UTF16 - * conversion happening in the background - * - */ -#define TStringToQString(s) QString::fromUtf8(s.toCString(true)) - -namespace TagLib { - - //! A \e wide string class suitable for unicode. - - /*! - * This is an implicitly shared \e wide string. For storage it uses - * TagLib::wstring, but as this is an <i>implementation detail</i> this of - * course could change. Strings are stored internally as UTF-16BE. (Without - * the BOM (Byte Order Mark) - * - * The use of implicit sharing means that copying a string is cheap, the only - * \e cost comes into play when the copy is modified. Prior to that the string - * just has a pointer to the data of the \e parent String. This also makes - * this class suitable as a function return type. - * - * In addition to adding implicit sharing, this class keeps track of four - * possible encodings, which are the four supported by the ID3v2 standard. - */ - - class TAGLIB_EXPORT String - { - public: - -#ifndef DO_NOT_DOCUMENT - typedef std::basic_string<wchar>::iterator Iterator; - typedef std::basic_string<wchar>::const_iterator ConstIterator; -#endif - - /** - * The four types of string encodings supported by the ID3v2 specification. - * ID3v1 is assumed to be Latin1 and Ogg Vorbis comments use UTF8. - */ - enum Type { - /*! - * IS08859-1, or <i>Latin1</i> encoding. 8 bit characters. - */ - Latin1 = 0, - /*! - * UTF16 with a <i>byte order mark</i>. 16 bit characters. - */ - UTF16 = 1, - /*! - * UTF16 <i>big endian</i>. 16 bit characters. This is the encoding used - * internally by TagLib. - */ - UTF16BE = 2, - /*! - * UTF8 encoding. Characters are usually 8 bits but can be up to 32. - */ - UTF8 = 3, - /*! - * UTF16 <i>little endian</i>. 16 bit characters. - */ - UTF16LE = 4 - }; - - /*! - * Constructs an empty String. - */ - String(); - - /*! - * Make a shallow, implicitly shared, copy of \a s. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - String(const String &s); - - /*! - * Makes a deep copy of the data in \a s. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(const std::string &s, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a s. - */ - String(const wstring &s, Type t = UTF16BE); - - /*! - * Makes a deep copy of the data in \a s. - */ - String(const wchar_t *s, Type t = UTF16BE); - - /*! - * Makes a deep copy of the data in \a c. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(char c, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a c. - */ - String(wchar_t c, Type t = Latin1); - - - /*! - * Makes a deep copy of the data in \a s. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(const char *s, Type t = Latin1); - - /*! - * Makes a deep copy of the data in \a s. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - String(const ByteVector &v, Type t = Latin1); - - /*! - * Destroys this String instance. - */ - virtual ~String(); - - /*! - * If \a unicode if false (the default) this will return a \e Latin1 encoded - * std::string. If it is true the returned std::wstring will be UTF-8 - * encoded. - */ - std::string to8Bit(bool unicode = false) const; - - /*! - * Returns a wstring version of the TagLib string as a wide string. - */ - wstring toWString() const; - - /*! - * Creates and returns a C-String based on the data. This string is still - * owned by the String (class) and as such should not be deleted by the user. - * - * If \a unicode if false (the default) this string will be encoded in - * \e Latin1. If it is true the returned C-String will be UTF-8 encoded. - * - * This string remains valid until the String instance is destroyed or - * another export method is called. - * - * \warning This however has the side effect that this C-String will remain - * in memory <b>in addition to</b> other memory that is consumed by the - * String instance. So, this method should not be used on large strings or - * where memory is critical. - */ - const char *toCString(bool unicode = false) const; - - /*! - * Returns an iterator pointing to the beginning of the string. - */ - Iterator begin(); - - /*! - * Returns a const iterator pointing to the beginning of the string. - */ - ConstIterator begin() const; - - /*! - * Returns an iterator pointing to the end of the string (the position - * after the last character). - */ - Iterator end(); - - /*! - * Returns a const iterator pointing to the end of the string (the position - * after the last character). - */ - ConstIterator end() const; - - /*! - * Finds the first occurrence of pattern \a s in this string starting from - * \a offset. If the pattern is not found, -1 is returned. - */ - int find(const String &s, int offset = 0) const; - - /*! - * Finds the last occurrence of pattern \a s in this string, searched backwards, - * either from the end of the string or starting from \a offset. If the pattern - * is not found, -1 is returned. - */ - int rfind(const String &s, int offset = -1) const; - - /*! - * Returns true if the strings starts with the substring \a s. - */ - bool startsWith(const String &s) const; - - /*! - * Extract a substring from this string starting at \a position and - * continuing for \a n characters. - */ - String substr(uint position, uint n = 0xffffffff) const; - - /*! - * Append \a s to the current string and return a reference to the current - * string. - */ - String &append(const String &s); - - /*! - * Returns an upper case version of the string. - * - * \warning This only works for the characters in US-ASCII, i.e. A-Z. - */ - String upper() const; - - /*! - * Returns the size of the string. - */ - uint size() const; - - /*! - * Returns the length of the string. Equivalent to size(). - */ - uint length() const; - - /*! - * Returns true if the string is empty. - * - * \see isNull() - */ - bool isEmpty() const; - - /*! - * Returns true if this string is null -- i.e. it is a copy of the - * String::null string. - * - * \note A string can be empty and not null. - * \see isEmpty() - */ - bool isNull() const; - - /*! - * Returns a ByteVector containing the string's data. If \a t is Latin1 or - * UTF8, this will return a vector of 8 bit characters, otherwise it will use - * 16 bit characters. - */ - ByteVector data(Type t) const; - - /*! - * Convert the string to an integer. - * - * Returns the integer if the conversion was successfull or 0 if the - * string does not represent a number. - */ - // BIC: merge with the method below - int toInt() const; - - /*! - * Convert the string to an integer. - * - * If the conversion was successfull, it sets the value of \a *ok to - * true and returns the integer. Otherwise it sets \a *ok to false - * and the result is undefined. - */ - int toInt(bool *ok) const; - - /*! - * Returns a string with the leading and trailing whitespace stripped. - */ - String stripWhiteSpace() const; - - /*! - * Returns true if the file only uses characters required by Latin1. - */ - bool isLatin1() const; - - /*! - * Returns true if the file only uses characters required by (7-bit) ASCII. - */ - bool isAscii() const; - - /*! - * Converts the base-10 integer \a n to a string. - */ - static String number(int n); - - /*! - * Returns a reference to the character at position \a i. - */ - wchar &operator[](int i); - - /*! - * Returns a const reference to the character at position \a i. - */ - const wchar &operator[](int i) const; - - /*! - * Compares each character of the String with each character of \a s and - * returns true if the strings match. - */ - bool operator==(const String &s) const; - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const String &s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const wchar_t* s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(const char* s); - - /*! - * Appends \a s to the end of the String. - */ - String &operator+=(wchar_t c); - - /*! - * Appends \a c to the end of the String. - */ - String &operator+=(char c); - - /*! - * Performs a shallow, implicitly shared, copy of \a s, overwriting the - * String's current data. - */ - String &operator=(const String &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const std::string &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const wstring &s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const wchar_t *s); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(char c); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(wchar_t c); - - /*! - * Performs a deep copy of the data in \a s. - */ - String &operator=(const char *s); - - /*! - * Performs a deep copy of the data in \a v. - */ - String &operator=(const ByteVector &v); - - /*! - * To be able to use this class in a Map, this operator needed to be - * implemented. Returns true if \a s is less than this string in a bytewise - * comparison. - */ - bool operator<(const String &s) const; - - /*! - * A null string provided for convenience. - */ - static String null; - - protected: - /*! - * If this String is being shared via implicit sharing, do a deep copy of the - * data and separate from the shared members. This should be called by all - * non-const subclass members. - */ - void detach(); - - private: - /*! - * This checks to see if the string is in \e UTF-16 (with BOM) or \e UTF-8 - * format and if so converts it to \e UTF-16BE for internal use. \e Latin1 - * does not require conversion since it is a subset of \e UTF-16BE and - * \e UTF16-BE requires no conversion since it is used internally. - */ - void prepare(Type t); - - class StringPrivate; - StringPrivate *d; - }; - -} - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT const TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2); - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT const TagLib::String operator+(const char *s1, const TagLib::String &s2); - -/*! - * \relates TagLib::String - * - * Concatenates \a s1 and \a s2 and returns the result as a string. - */ -TAGLIB_EXPORT const TagLib::String operator+(const TagLib::String &s1, const char *s2); - - -/*! - * \relates TagLib::String - * - * Send the string to an output stream. - */ -TAGLIB_EXPORT std::ostream &operator<<(std::ostream &s, const TagLib::String &str); - -#endif diff --git a/src/mytaglib/tstringlist.h b/src/mytaglib/tstringlist.h deleted file mode 100644 index 3ef131d..0000000 --- a/src/mytaglib/tstringlist.h +++ /dev/null @@ -1,115 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_STRINGLIST_H -#define TAGLIB_STRINGLIST_H - -#include "tstring.h" -#include "tlist.h" -#include "tbytevectorlist.h" -#include "taglib_export.h" - -#include <ostream> - -namespace TagLib { - - //! A list of strings - - /*! - * This is a spcialization of the List class with some members convention for - * string operations. - */ - - class TAGLIB_EXPORT StringList : public List<String> - { - public: - - /*! - * Constructs an empty StringList. - */ - StringList(); - - /*! - * Make a shallow, implicitly shared, copy of \a l. Because this is - * implicitly shared, this method is lightweight and suitable for - * pass-by-value usage. - */ - StringList(const StringList &l); - - /*! - * Constructs a StringList with \a s as a member. - */ - StringList(const String &s); - - /*! - * Makes a deep copy of the data in \a vl. - * - * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when - * used with other codecs it will simply print a warning and exit. - */ - StringList(const ByteVectorList &vl, String::Type t = String::Latin1); - - /*! - * Destroys this StringList instance. - */ - virtual ~StringList(); - - /*! - * Concatenate the list of strings into one string separated by \a separator. - */ - String toString(const String &separator = " ") const; - - /*! - * Appends \a s to the end of the list and returns a reference to the - * list. - */ - StringList &append(const String &s); - - /*! - * Appends all of the values in \a l to the end of the list and returns a - * reference to the list. - */ - StringList &append(const StringList &l); - - /*! - * Splits the String \a s into several strings at \a pattern. This will not include - * the pattern in the returned strings. - */ - static StringList split(const String &s, const String &pattern); - - private: - class StringListPrivate; - StringListPrivate *d; - }; - -} - -/*! - * \related TagLib::StringList - * Send the StringList to an output stream. - */ -std::ostream &operator<<(std::ostream &s, const TagLib::StringList &l); - -#endif diff --git a/src/mytaglib/unicode.h b/src/mytaglib/unicode.h deleted file mode 100644 index cf7eb3c..0000000 --- a/src/mytaglib/unicode.h +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef TAGLIB_UNICODE_H -#define TAGLIB_UNICODE_H - -/******************************************************************************* - * * - * THIS FILE IS INCLUDED IN TAGLIB, BUT IS NOT COPYRIGHTED BY THE TAGLIB * - * AUTHORS, NOT PART OF THE TAGLIB API AND COULD GO AWAY AT ANY POINT IN TIME. * - * AS SUCH IT SHOULD BE CONSIERED FOR INTERNAL USE ONLY. * - * * - *******************************************************************************/ - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -/* - * Copyright 2001 Unicode, Inc. - * - * Disclaimer - * - * This source code is provided as is by Unicode, Inc. No claims are - * made as to fitness for any particular purpose. No warranties of any - * kind are expressed or implied. The recipient agrees to determine - * applicability of information provided. If this file has been - * purchased on magnetic or optical media from Unicode, Inc., the - * sole remedy for any claim will be exchange of defective media - * within 90 days of receipt. - * - * Limitations on Rights to Redistribute This Code - * - * Unicode, Inc. hereby grants the right to freely use the information - * supplied in this file in the creation of products supporting the - * Unicode Standard, and to make copies of this file in any form - * for internal or external distribution as long as this notice - * remains attached. - */ - -/* - * This file has been modified by Scott Wheeler <wheeler@kde.org> to remove - * the UTF32 conversion functions and to place the appropriate functions - * in their own C++ namespace. - */ - -/* --------------------------------------------------------------------- - - Conversions between UTF32, UTF-16, and UTF-8. Header file. - - Several functions are included here, forming a complete set of - conversions between the three formats. UTF-7 is not included - here, but is handled in a separate source file. - - Each of these routines takes pointers to input buffers and output - buffers. The input buffers are const. - - Each routine converts the text between *sourceStart and sourceEnd, - putting the result into the buffer between *targetStart and - targetEnd. Note: the end pointers are *after* the last item: e.g. - *(sourceEnd - 1) is the last item. - - The return result indicates whether the conversion was successful, - and if not, whether the problem was in the source or target buffers. - (Only the first encountered problem is indicated.) - - After the conversion, *sourceStart and *targetStart are both - updated to point to the end of last text successfully converted in - the respective buffers. - - Input parameters: - sourceStart - pointer to a pointer to the source buffer. - The contents of this are modified on return so that - it points at the next thing to be converted. - targetStart - similarly, pointer to pointer to the target buffer. - sourceEnd, targetEnd - respectively pointers to the ends of the - two buffers, for overflow checking only. - - These conversion functions take a ConversionFlags argument. When this - flag is set to strict, both irregular sequences and isolated surrogates - will cause an error. When the flag is set to lenient, both irregular - sequences and isolated surrogates are converted. - - Whether the flag is strict or lenient, all illegal sequences will cause - an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>, - or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code - must check for illegal sequences. - - When the flag is set to lenient, characters over 0x10FFFF are converted - to the replacement character; otherwise (when the flag is set to strict) - they constitute an error. - - Output parameters: - The value "sourceIllegal" is returned from some routines if the input - sequence is malformed. When "sourceIllegal" is returned, the source - value will point to the illegal value that caused the problem. E.g., - in UTF-8 when a sequence is malformed, it points to the start of the - malformed sequence. - - Author: Mark E. Davis, 1994. - Rev History: Rick McGowan, fixes & updates May 2001. - Fixes & updates, Sept 2001. - ------------------------------------------------------------------------- */ - -/* --------------------------------------------------------------------- - The following 4 definitions are compiler-specific. - The C standard does not guarantee that wchar_t has at least - 16 bits, so wchar_t is no less portable than unsigned short! - All should be unsigned values to avoid sign extension during - bit mask & shift operations. ------------------------------------------------------------------------- */ - -/* Some fundamental constants */ -#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD -#define UNI_MAX_BMP (UTF32)0x0000FFFF -#define UNI_MAX_UTF16 (UTF32)0x0010FFFF -#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF - -namespace Unicode { - -typedef unsigned long UTF32; /* at least 32 bits */ -typedef unsigned short UTF16; /* at least 16 bits */ -typedef unsigned char UTF8; /* typically 8 bits */ -typedef unsigned char Boolean; /* 0 or 1 */ - -typedef enum { - conversionOK = 0, /* conversion successful */ - sourceExhausted = 1, /* partial character in source, but hit end */ - targetExhausted = 2, /* insuff. room in target for conversion */ - sourceIllegal = 3 /* source sequence is illegal/malformed */ -} ConversionResult; - -typedef enum { - strictConversion = 0, - lenientConversion -} ConversionFlags; - -ConversionResult ConvertUTF8toUTF16 ( - const UTF8** sourceStart, const UTF8* sourceEnd, - UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); - -ConversionResult ConvertUTF16toUTF8 ( - const UTF16** sourceStart, const UTF16* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); - -Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); - -} // namespace Unicode - -/* --------------------------------------------------------------------- */ - -#endif -#endif diff --git a/src/mytaglib/uniquefileidentifierframe.h b/src/mytaglib/uniquefileidentifierframe.h deleted file mode 100644 index 1292b39..0000000 --- a/src/mytaglib/uniquefileidentifierframe.h +++ /dev/null @@ -1,113 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNIQUEFILEIDENTIFIERFRAME -#define TAGLIB_UNIQUEFILEIDENTIFIERFRAME - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - /*! - * This is an implementation of ID3v2 unique file identifier frames. This - * frame is used to identify the file in an arbitrary database identified - * by the owner field. - */ - - //! An implementation of ID3v2 unique identifier frames - - class TAGLIB_EXPORT UniqueFileIdentifierFrame : public ID3v2::Frame - { - friend class FrameFactory; - - public: - /*! - * Creates a uniqe file identifier frame based on \a data. - */ - UniqueFileIdentifierFrame(const ByteVector &data); - - /*! - * Creates a unique file identifier frame with the owner \a owner and - * the identification \a id. - */ - UniqueFileIdentifierFrame(const String &owner, const ByteVector &id); - - /*! - * Destroys the frame. - */ - ~UniqueFileIdentifierFrame(); - - /*! - * Returns the owner for the frame; essentially this is the key for - * determining which identification scheme this key belongs to. This - * will usually either be an email address or URL for the person or tool - * used to create the unique identifier. - * - * \see setOwner() - */ - String owner() const; - - /*! - * Returns the unique identifier. Though sometimes this is a text string - * it also may be binary data and as much should be assumed when handling - * it. - */ - ByteVector identifier() const; - - /*! - * Sets the owner of the identification scheme to \a s. - * - * \see owner() - */ - void setOwner(const String &s); - - /*! - * Sets the unique file identifier to \a v. - * - * \see identifier() - */ - void setIdentifier(const ByteVector &v); - - virtual String toString() const; - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - UniqueFileIdentifierFrame(const UniqueFileIdentifierFrame &); - UniqueFileIdentifierFrame &operator=(UniqueFileIdentifierFrame &); - - UniqueFileIdentifierFrame(const ByteVector &data, Header *h); - - class UniqueFileIdentifierFramePrivate; - UniqueFileIdentifierFramePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/unknownframe.h b/src/mytaglib/unknownframe.h deleted file mode 100644 index 6559f4e..0000000 --- a/src/mytaglib/unknownframe.h +++ /dev/null @@ -1,79 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNKNOWNFRAME_H -#define TAGLIB_UNKNOWNFRAME_H - -#include "id3v2frame.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace ID3v2 { - - //! A frame type \e unknown to TagLib. - - /*! - * This class represents a frame type not known (or more often simply - * unimplemented) in TagLib. This is here provide a basic API for - * manipulating the binary data of unknown frames and to provide a means - * of rendering such \e unknown frames. - * - * Please note that a cleaner way of handling frame types that TagLib - * does not understand is to subclass ID3v2::Frame and ID3v2::FrameFactory - * to have your frame type supported through the standard ID3v2 mechanism. - */ - - class TAGLIB_EXPORT UnknownFrame : public Frame - { - friend class FrameFactory; - - public: - UnknownFrame(const ByteVector &data); - virtual ~UnknownFrame(); - - virtual String toString() const; - - /*! - * Returns the field data (everything but the header) for this frame. - */ - ByteVector data() const; - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - UnknownFrame(const ByteVector &data, Header *h); - UnknownFrame(const UnknownFrame &); - UnknownFrame &operator=(const UnknownFrame &); - - class UnknownFramePrivate; - UnknownFramePrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/unsynchronizedlyricsframe.h b/src/mytaglib/unsynchronizedlyricsframe.h deleted file mode 100644 index 0f8260e..0000000 --- a/src/mytaglib/unsynchronizedlyricsframe.h +++ /dev/null @@ -1,157 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H -#define TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 unsynchronized lyrics frame - /*! - * An implementation of ID3v2 unsynchronized lyrics. - */ - class TAGLIB_EXPORT UnsynchronizedLyricsFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * Construct an empty unsynchronized lyrics frame that will use the text encoding - * \a encoding. - */ - explicit UnsynchronizedLyricsFrame(String::Type encoding = String::Latin1); - - /*! - * Construct a unsynchronized lyrics frame based on the data in \a data. - */ - explicit UnsynchronizedLyricsFrame(const ByteVector &data); - - /*! - * Destroys this UnsynchronizedLyricsFrame instance. - */ - virtual ~UnsynchronizedLyricsFrame(); - - /*! - * Returns the text of this unsynchronized lyrics frame. - * - * \see text() - */ - virtual String toString() const; - - /*! - * Returns the language encoding as a 3 byte encoding as specified by - * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>. - * - * \note Most taggers simply ignore this value. - * - * \see setLanguage() - */ - ByteVector language() const; - - /*! - * Returns the description of this unsynchronized lyrics frame. - * - * \note Most taggers simply ignore this value. - * - * \see setDescription() - */ - String description() const; - - /*! - * Returns the text of this unsynchronized lyrics frame. - * - * \see setText() - */ - String text() const; - - /*! - * Set the language using the 3 byte language code from - * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to - * \a languageCode. - * - * \see language() - */ - void setLanguage(const ByteVector &languageCode); - - /*! - * Sets the description of the unsynchronized lyrics frame to \a s. - * - * \see decription() - */ - void setDescription(const String &s); - - /*! - * Sets the text portion of the unsynchronized lyrics frame to \a s. - * - * \see text() - */ - virtual void setText(const String &s); - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - protected: - // Reimplementations. - - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - private: - /*! - * The constructor used by the FrameFactory. - */ - UnsynchronizedLyricsFrame(const ByteVector &data, Header *h); - UnsynchronizedLyricsFrame(const UnsynchronizedLyricsFrame &); - UnsynchronizedLyricsFrame &operator=(const UnsynchronizedLyricsFrame &); - - class UnsynchronizedLyricsFramePrivate; - UnsynchronizedLyricsFramePrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/urllinkframe.h b/src/mytaglib/urllinkframe.h deleted file mode 100644 index f89faad..0000000 --- a/src/mytaglib/urllinkframe.h +++ /dev/null @@ -1,172 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_URLLINKFRAME_H -#define TAGLIB_URLLINKFRAME_H - -#include "id3v2frame.h" - -namespace TagLib { - - namespace ID3v2 { - - //! ID3v2 URL frame - /*! - * An implementation of ID3v2 URL link frames. - */ - class TAGLIB_EXPORT UrlLinkFrame : public Frame - { - friend class FrameFactory; - - public: - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit UrlLinkFrame(const ByteVector &data); - - /*! - * Destroys this UrlLinkFrame instance. - */ - virtual ~UrlLinkFrame(); - - /*! - * Returns the URL. - */ - virtual String url() const; - - /*! - * Sets the URL to \a s. - */ - virtual void setUrl(const String &s); - - // Reimplementations. - - virtual void setText(const String &s); - virtual String toString() const; - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - UrlLinkFrame(const ByteVector &data, Header *h); - - private: - UrlLinkFrame(const UrlLinkFrame &); - UrlLinkFrame &operator=(const UrlLinkFrame &); - - class UrlLinkFramePrivate; - UrlLinkFramePrivate *d; - }; - - //! ID3v2 User defined URL frame - - /*! - * This is a specialization of URL link frames that allows for - * user defined entries. Each entry has a description in addition to the - * normal list of fields that a URL link frame has. - * - * This description identifies the frame and must be unique. - */ - class TAGLIB_EXPORT UserUrlLinkFrame : public UrlLinkFrame - { - friend class FrameFactory; - - public: - /*! - * Constructs an empty user defined URL link frame. For this to be - * a useful frame both a description and text must be set. - */ - explicit UserUrlLinkFrame(String::Type encoding = String::Latin1); - - /*! - * This is a dual purpose constructor. \a data can either be binary data - * that should be parsed or (at a minimum) the frame ID. - */ - explicit UserUrlLinkFrame(const ByteVector &data); - - /*! - * Destroys this UserUrlLinkFrame instance. - */ - virtual ~UserUrlLinkFrame(); - - // Reimplementations. - - virtual String toString() const; - - /*! - * Returns the text encoding that will be used in rendering this frame. - * This defaults to the type that was either specified in the constructor - * or read from the frame when parsed. - * - * \see setTextEncoding() - * \see render() - */ - String::Type textEncoding() const; - - /*! - * Sets the text encoding to be used when rendering this frame to - * \a encoding. - * - * \see textEncoding() - * \see render() - */ - void setTextEncoding(String::Type encoding); - - /*! - * Returns the description for this frame. - */ - String description() const; - - /*! - * Sets the description of the frame to \a s. \a s must be unique. - */ - void setDescription(const String &s); - - protected: - virtual void parseFields(const ByteVector &data); - virtual ByteVector renderFields() const; - - /*! - * The constructor used by the FrameFactory. - */ - UserUrlLinkFrame(const ByteVector &data, Header *h); - - private: - UserUrlLinkFrame(const UserUrlLinkFrame &); - UserUrlLinkFrame &operator=(const UserUrlLinkFrame &); - - class UserUrlLinkFramePrivate; - UserUrlLinkFramePrivate *d; - }; - - } -} -#endif diff --git a/src/mytaglib/vorbisfile.h b/src/mytaglib/vorbisfile.h deleted file mode 100644 index 3e33c11..0000000 --- a/src/mytaglib/vorbisfile.h +++ /dev/null @@ -1,118 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISFILE_H -#define TAGLIB_VORBISFILE_H - -#include "taglib_export.h" -#include "oggfile.h" -#include "xiphcomment.h" - -#include "vorbisproperties.h" - -namespace TagLib { - -/* - * This is just to make this appear to be in the Ogg namespace in the - * documentation. The typedef below will make this work with the current code. - * In the next BIC version of TagLib this will be really moved into the Ogg - * namespace. - */ - -#ifdef DOXYGEN - namespace Ogg { -#endif - - //! A namespace containing classes for Vorbis metadata - - namespace Vorbis { - - - //! An implementation of Ogg::File with Vorbis specific methods - - /*! - * This is the central class in the Ogg Vorbis metadata processing collection - * of classes. It's built upon Ogg::File which handles processing of the Ogg - * logical bitstream and breaking it down into pages which are handled by - * the codec implementations, in this case Vorbis specifically. - */ - - class TAGLIB_EXPORT File : public Ogg::File - { - public: - /*! - * Contructs a Vorbis file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the XiphComment for this file. XiphComment implements the tag - * interface, so this serves as the reimplementation of - * TagLib::File::tag(). - */ - virtual Ogg::XiphComment *tag() const; - - /*! - * Returns the Vorbis::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - virtual bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - class FilePrivate; - FilePrivate *d; - }; - } - -/* - * To keep compatibility with the current version put Vorbis in the Ogg namespace - * only in the docs and provide a typedef to make it work. In the next BIC - * version this will be removed and it will only exist in the Ogg namespace. - */ - -#ifdef DOXYGEN - } -#else - namespace Ogg { namespace Vorbis { typedef TagLib::Vorbis::File File; } } -#endif - -} - -#endif diff --git a/src/mytaglib/vorbisproperties.h b/src/mytaglib/vorbisproperties.h deleted file mode 100644 index de46985..0000000 --- a/src/mytaglib/vorbisproperties.h +++ /dev/null @@ -1,125 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISPROPERTIES_H -#define TAGLIB_VORBISPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - -/* - * This is just to make this appear to be in the Ogg namespace in the - * documentation. The typedef below will make this work with the current code. - * In the next BIC version of TagLib this will be really moved into the Ogg - * namespace. - */ - -#ifdef DOXYGEN - namespace Ogg { -#endif - - namespace Vorbis { - - class File; - - //! An implementation of audio property reading for Ogg Vorbis - - /*! - * This reads the data from an Ogg Vorbis stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of Vorbis::Properties with the data read from the - * Vorbis::File \a file. - */ - Properties(File *file, ReadStyle style = Average); - - /*! - * Destroys this VorbisProperties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns the Vorbis version, currently "0" (as specified by the spec). - */ - int vorbisVersion() const; - - /*! - * Returns the maximum bitrate as read from the Vorbis identification - * header. - */ - int bitrateMaximum() const; - - /*! - * Returns the nominal bitrate as read from the Vorbis identification - * header. - */ - int bitrateNominal() const; - - /*! - * Returns the minimum bitrate as read from the Vorbis identification - * header. - */ - int bitrateMinimum() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - -/* - * To keep compatibility with the current version put Vorbis in the Ogg namespace - * only in the docs and provide a typedef to make it work. In the next BIC - * version this will be removed and it will only exist in the Ogg namespace. - */ - -#ifdef DOXYGEN - } -#else - namespace Ogg { namespace Vorbis { typedef TagLib::AudioProperties AudioProperties; } } -#endif - -} - -#endif diff --git a/src/mytaglib/wavfile.h b/src/mytaglib/wavfile.h deleted file mode 100644 index b44668c..0000000 --- a/src/mytaglib/wavfile.h +++ /dev/null @@ -1,102 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_WAVFILE_H -#define TAGLIB_WAVFILE_H - -#include "rifffile.h" -#include "id3v2tag.h" -#include "wavproperties.h" - -namespace TagLib { - - namespace RIFF { - - //! An implementation of WAV metadata - - /*! - * This is implementation of WAV metadata. - * - * This supports an ID3v2 tag as well as reading stream from the ID3 RIFF - * chunk as well as properties from the file. - */ - - namespace WAV { - - //! An implementation of TagLib::File with WAV specific methods - - /*! - * This implements and provides an interface for WAV files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to WAV files. - */ - - class TAGLIB_EXPORT File : public TagLib::RIFF::File - { - public: - /*! - * Contructs an WAV file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. - */ - virtual ID3v2::Tag *tag() const; - - /*! - * Returns the WAV::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - - class FilePrivate; - FilePrivate *d; - }; - } - } -} - -#endif diff --git a/src/mytaglib/wavpackfile.h b/src/mytaglib/wavpackfile.h deleted file mode 100644 index 3415a32..0000000 --- a/src/mytaglib/wavpackfile.h +++ /dev/null @@ -1,164 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_WVFILE_H -#define TAGLIB_WVFILE_H - -#include "tfile.h" -#include "taglib_export.h" -#include "wavpackproperties.h" - -namespace TagLib { - - class Tag; - - namespace ID3v1 { class Tag; } - namespace APE { class Tag; } - - //! An implementation of WavPack metadata - - /*! - * This is implementation of WavPack metadata. - * - * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream - * properties from the file. - */ - - namespace WavPack { - - //! An implementation of TagLib::File with WavPack specific methods - - /*! - * This implements and provides an interface for WavPack files to the - * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing - * the abstract TagLib::File API as well as providing some additional - * information specific to WavPack files. - */ - - class TAGLIB_EXPORT File : public TagLib::File - { - public: - /*! - * This set of flags is used for various operations and is suitable for - * being OR-ed together. - */ - enum TagTypes { - //! Empty set. Matches no tag types. - NoTags = 0x0000, - //! Matches ID3v1 tags. - ID3v1 = 0x0001, - //! Matches APE tags. - APE = 0x0002, - //! Matches all tag types. - AllTags = 0xffff - }; - - /*! - * Contructs an WavPack file from \a file. If \a readProperties is true the - * file's audio properties will also be read using \a propertiesStyle. If - * false, \a propertiesStyle is ignored. - */ - File(FileName file, bool readProperties = true, - Properties::ReadStyle propertiesStyle = Properties::Average); - - /*! - * Destroys this instance of the File. - */ - virtual ~File(); - - /*! - * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag - * or a combination of the two. - */ - virtual TagLib::Tag *tag() const; - - /*! - * Returns the MPC::Properties for this file. If no audio properties - * were read then this will return a null pointer. - */ - virtual Properties *audioProperties() const; - - /*! - * Saves the file. - */ - virtual bool save(); - - /*! - * Returns a pointer to the ID3v1 tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid ID3v1 tag. If \a create is true it will create - * an ID3v1 tag if one does not exist. If there is already an APE tag, the - * new ID3v1 tag will be placed after it. - * - * \note The Tag <b>is still</b> owned by the APE::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - ID3v1::Tag *ID3v1Tag(bool create = false); - - /*! - * Returns a pointer to the APE tag of the file. - * - * If \a create is false (the default) this will return a null pointer - * if there is no valid APE tag. If \a create is true it will create - * a APE tag if one does not exist. - * - * \note The Tag <b>is still</b> owned by the APE::File and should not be - * deleted by the user. It will be deleted when the file (object) is - * destroyed. - */ - APE::Tag *APETag(bool create = false); - - /*! - * This will remove the tags that match the OR-ed together TagTypes from the - * file. By default it removes all tags. - * - * \note This will also invalidate pointers to the tags - * as their memory will be freed. - * \note In order to make the removal permanent save() still needs to be called - */ - void strip(int tags = AllTags); - - private: - File(const File &); - File &operator=(const File &); - - void read(bool readProperties, Properties::ReadStyle propertiesStyle); - void scan(); - long findID3v1(); - long findAPE(); - - class FilePrivate; - FilePrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/wavpackproperties.h b/src/mytaglib/wavpackproperties.h deleted file mode 100644 index 74d18ea..0000000 --- a/src/mytaglib/wavpackproperties.h +++ /dev/null @@ -1,104 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš LalinskĂ˝ - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_WVPROPERTIES_H -#define TAGLIB_WVPROPERTIES_H - -#include "taglib_export.h" -#include "audioproperties.h" - -namespace TagLib { - - namespace WavPack { - - class File; - - static const uint HeaderSize = 32; - - //! An implementation of audio property reading for WavPack - - /*! - * This reads the data from an WavPack stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of WavPack::Properties with the data read from the - * ByteVector \a data. - * - * \deprecated This constructor will be dropped in favor of the one below - * in a future version. - */ - Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); - - /*! - * Create an instance of WavPack::Properties. - */ - // BIC: merge with the above constructor - Properties(File *file, long streamLength, ReadStyle style = Average); - - /*! - * Destroys this WavPack::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - /*! - * Returns number of bits per sample. - */ - int bitsPerSample() const; - - /*! - * Returns WavPack version. - */ - int version() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(); - unsigned int seekFinalIndex(); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/wavproperties.h b/src/mytaglib/wavproperties.h deleted file mode 100644 index bf87ffe..0000000 --- a/src/mytaglib/wavproperties.h +++ /dev/null @@ -1,91 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_WAVPROPERTIES_H -#define TAGLIB_WAVPROPERTIES_H - -#include "taglib.h" -#include "audioproperties.h" - -namespace TagLib { - - class ByteVector; - - namespace RIFF { - - namespace WAV { - - class File; - - //! An implementation of audio property reading for WAV - - /*! - * This reads the data from an WAV stream found in the AudioProperties - * API. - */ - - class TAGLIB_EXPORT Properties : public AudioProperties - { - public: - /*! - * Create an instance of WAV::Properties with the data read from the - * ByteVector \a data. - */ - Properties(const ByteVector &data, ReadStyle style); - - /*! - * Create an instance of WAV::Properties with the data read from the - * ByteVector \a data and the length calculated using \a streamLength. - */ - Properties(const ByteVector &data, uint streamLength, ReadStyle style); - - /*! - * Destroys this WAV::Properties instance. - */ - virtual ~Properties(); - - // Reimplementations. - - virtual int length() const; - virtual int bitrate() const; - virtual int sampleRate() const; - virtual int channels() const; - - int sampleWidth() const; - - private: - Properties(const Properties &); - Properties &operator=(const Properties &); - - void read(const ByteVector &data); - - class PropertiesPrivate; - PropertiesPrivate *d; - }; - } - } -} - -#endif diff --git a/src/mytaglib/xingheader.h b/src/mytaglib/xingheader.h deleted file mode 100644 index ffe7494..0000000 --- a/src/mytaglib/xingheader.h +++ /dev/null @@ -1,100 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Ismael Orenstein - email : orenstein@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_XINGHEADER_H -#define TAGLIB_XINGHEADER_H - -#include "mpegheader.h" -#include "taglib_export.h" - -namespace TagLib { - - class ByteVector; - - namespace MPEG { - - //! An implementation of the Xing VBR headers - - /*! - * This is a minimalistic implementation of the Xing VBR headers. Xing - * headers are often added to VBR (variable bit rate) MP3 streams to make it - * easy to compute the length and quality of a VBR stream. Our implementation - * is only concerned with the total size of the stream (so that we can - * calculate the total playing time and the average bitrate). It uses - * <a href="http://home.pcisys.net/~melanson/codecs/mp3extensions.txt">this text</a> - * and the XMMS sources as references. - */ - - class TAGLIB_EXPORT XingHeader - { - public: - /*! - * Parses a Xing header based on \a data. The data must be at least 16 - * bytes long (anything longer than this is discarded). - */ - XingHeader(const ByteVector &data); - - /*! - * Destroy this XingHeader instance. - */ - virtual ~XingHeader(); - - /*! - * Returns true if the data was parsed properly and if there is a valid - * Xing header present. - */ - bool isValid() const; - - /*! - * Returns the total number of frames. - */ - uint totalFrames() const; - - /*! - * Returns the total size of stream in bytes. - */ - uint totalSize() const; - - /*! - * Returns the offset for the start of this Xing header, given the - * version and channels of the frame - */ - // BIC: rename to offset() - static int xingHeaderOffset(TagLib::MPEG::Header::Version v, - TagLib::MPEG::Header::ChannelMode c); - - private: - XingHeader(const XingHeader &); - XingHeader &operator=(const XingHeader &); - - void parse(const ByteVector &data); - - class XingHeaderPrivate; - XingHeaderPrivate *d; - }; - } -} - -#endif diff --git a/src/mytaglib/xiphcomment.h b/src/mytaglib/xiphcomment.h deleted file mode 100644 index b105dd6..0000000 --- a/src/mytaglib/xiphcomment.h +++ /dev/null @@ -1,202 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_VORBISCOMMENT_H -#define TAGLIB_VORBISCOMMENT_H - -#include "tag.h" -#include "tlist.h" -#include "tmap.h" -#include "tstring.h" -#include "tstringlist.h" -#include "tbytevector.h" -#include "taglib_export.h" - -namespace TagLib { - - namespace Ogg { - - /*! - * A mapping between a list of field names, or keys, and a list of values - * associated with that field. - * - * \see XiphComment::fieldListMap() - */ - typedef Map<String, StringList> FieldListMap; - - //! Ogg Vorbis comment implementation - - /*! - * This class is an implementation of the Ogg Vorbis comment specification, - * to be found in section 5 of the Ogg Vorbis specification. Because this - * format is also used in other (currently unsupported) Xiph.org formats, it - * has been made part of a generic implementation rather than being limited - * to strictly Vorbis. - * - * Vorbis comments are a simple vector of keys and values, called fields. - * Multiple values for a given key are supported. - * - * \see fieldListMap() - */ - - class TAGLIB_EXPORT XiphComment : public TagLib::Tag - { - public: - /*! - * Constructs an empty Vorbis comment. - */ - XiphComment(); - - /*! - * Constructs a Vorbis comment from \a data. - */ - XiphComment(const ByteVector &data); - - /*! - * Destroys this instance of the XiphComment. - */ - virtual ~XiphComment(); - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual uint year() const; - virtual uint track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(uint i); - virtual void setTrack(uint i); - - virtual bool isEmpty() const; - - /*! - * Returns the number of fields present in the comment. - */ - uint fieldCount() const; - - /*! - * Returns a reference to the map of field lists. Because Xiph comments - * support multiple fields with the same key, a pure Map would not work. - * As such this is a Map of string lists, keyed on the comment field name. - * - * The standard set of Xiph/Vorbis fields (which may or may not be - * contained in any specific comment) is: - * - * <ul> - * <li>TITLE</li> - * <li>VERSION</li> - * <li>ALBUM</li> - * <li>ARTIST</li> - * <li>PERFORMER</li> - * <li>COPYRIGHT</li> - * <li>ORGANIZATION</li> - * <li>DESCRIPTION</li> - * <li>GENRE</li> - * <li>DATE</li> - * <li>LOCATION</li> - * <li>CONTACT</li> - * <li>ISRC</li> - * </ul> - * - * For a more detailed description of these fields, please see the Ogg - * Vorbis specification, section 5.2.2.1. - * - * \note The Ogg Vorbis comment specification does allow these key values - * to be either upper or lower case. However, it is conventional for them - * to be upper case. As such, TagLib, when parsing a Xiph/Vorbis comment, - * converts all fields to uppercase. When you are using this data - * structure, you will need to specify the field name in upper case. - * - * \warning You should not modify this data structure directly, instead - * use addField() and removeField(). - */ - const FieldListMap &fieldListMap() const; - - /*! - * Returns the vendor ID of the Ogg Vorbis encoder. libvorbis 1.0 as the - * most common case always returns "Xiph.Org libVorbis I 20020717". - */ - String vendorID() const; - - /*! - * Add the field specified by \a key with the data \a value. If \a replace - * is true, then all of the other fields with the same key will be removed - * first. - * - * If the field value is empty, the field will be removed. - */ - void addField(const String &key, const String &value, bool replace = true); - - /*! - * Remove the field specified by \a key with the data \a value. If - * \a value is null, all of the fields with the given key will be removed. - */ - void removeField(const String &key, const String &value = String::null); - - /*! - * Returns true if the field is contained within the comment. - * - * \note This is safer than checking for membership in the FieldListMap. - */ - bool contains(const String &key) const; - - /*! - * Renders the comment to a ByteVector suitable for inserting into a file. - */ - ByteVector render() const; // BIC: remove and merge with below - - /*! - * Renders the comment to a ByteVector suitable for inserting into a file. - * - * If \a addFramingBit is true the standard Vorbis comment framing bit will - * be appended. However some formats (notably FLAC) do not work with this - * in place. - */ - ByteVector render(bool addFramingBit) const; - - protected: - /*! - * Reads the tag from the file specified in the constructor and fills the - * FieldListMap. - */ - void parse(const ByteVector &data); - - private: - XiphComment(const XiphComment &); - XiphComment &operator=(const XiphComment &); - - class XiphCommentPrivate; - XiphCommentPrivate *d; - }; - } -} - -#endif From a63d6a41b2403b61a940290807abe36c4664d5de Mon Sep 17 00:00:00 2001 From: olf <Olf0@users.noreply.github.com> Date: Tue, 5 Dec 2023 19:29:19 +0100 Subject: [PATCH 3/3] Delete lib directory Obsoleted by PR #19 by @dcaliste --- lib/i486/libmytaglib.so | Bin 1092924 -> 0 bytes lib/i486/libmytaglib.so.1 | Bin 1092924 -> 0 bytes lib/libmytaglib.so | Bin 930703 -> 0 bytes lib/libmytaglib.so.1 | Bin 930703 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/i486/libmytaglib.so delete mode 100644 lib/i486/libmytaglib.so.1 delete mode 100644 lib/libmytaglib.so delete mode 100644 lib/libmytaglib.so.1 diff --git a/lib/i486/libmytaglib.so b/lib/i486/libmytaglib.so deleted file mode 100644 index ffbb4c58996510b1e6902bd6e5168708df6e9a7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1092924 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%0D1;|a#6 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ν~2E;2I91rdtZ<7R}k(6xoo} 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%0D~>>+>sL!&Uf;*!gyI1Zgk+XJdF? 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 diff --git a/lib/i486/libmytaglib.so.1 b/lib/i486/libmytaglib.so.1 deleted file mode 100644 index ffbb4c58996510b1e6902bd6e5168708df6e9a7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1092924 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%0D1;|a#6 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ν~2E;2I91rdtZ<7R}k(6xoo} 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%0D~>>+>sL!&Uf;*!gyI1Zgk+XJdF? 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 diff --git a/lib/libmytaglib.so b/lib/libmytaglib.so deleted file mode 100644 index d450e135a4045d60ac10dd697c0960926a1172a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 930703 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%0DE4Zah>!-d<S-odKM8k?GMypnbm~X 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 Jp~5eJ`EU7j4OsvH diff --git a/lib/libmytaglib.so.1 b/lib/libmytaglib.so.1 deleted file mode 100644 index d450e135a4045d60ac10dd697c0960926a1172a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 930703 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%0DE4Zah>!-d<S-odKM8k?GMypnbm~X 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 Jp~5eJ`EU7j4OsvH