/*************************************************************************** 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 "tag_c.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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); } //////////////////////////////////////////////////////////////////////////////// // 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)); } 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); }