diff --git a/Frameworks/Opus/Opus.xcodeproj/project.pbxproj b/Frameworks/Opus/Opus.xcodeproj/project.pbxproj index 451085abe..9bdafddef 100644 --- a/Frameworks/Opus/Opus.xcodeproj/project.pbxproj +++ b/Frameworks/Opus/Opus.xcodeproj/project.pbxproj @@ -1184,6 +1184,11 @@ HAVE_CONFIG_H, "$(inherited)", ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ../../Frameworks/Ogg/include, + ); INFOPLIST_FILE = "Opus/Opus-Info.plist"; INSTALL_PATH = "@loader_path/../Frameworks"; OTHER_LDFLAGS = ( @@ -1211,6 +1216,11 @@ FRAMEWORK_VERSION = A; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREPROCESSOR_DEFINITIONS = HAVE_CONFIG_H; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ../../Frameworks/Ogg/include, + ); INFOPLIST_FILE = "Opus/Opus-Info.plist"; INSTALL_PATH = "@loader_path/../Frameworks"; OTHER_LDFLAGS = ( diff --git a/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Distribution.xcscheme b/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Distribution.xcscheme index 11b73b52e..9d6cba27c 100644 --- a/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Distribution.xcscheme +++ b/Frameworks/Sparkle/Sparkle.xcodeproj/xcshareddata/xcschemes/Distribution.xcscheme @@ -1,6 +1,6 @@ textEncoding = String::Type(data[0]); + d->textEncoding = String::Type(data[0]&3); // split the byte array into chunks based on the string type (two byte delimiter // for unicode encodings) diff --git a/Frameworks/TagLib/taglib/taglib/toolkit/tstring.cpp b/Frameworks/TagLib/taglib/taglib/toolkit/tstring.cpp index 57d17fea2..b20b2b625 100644 --- a/Frameworks/TagLib/taglib/taglib/toolkit/tstring.cpp +++ b/Frameworks/TagLib/taglib/taglib/toolkit/tstring.cpp @@ -32,7 +32,12 @@ #include #include +#include + + namespace TagLib { + char default_ascii_encoding[] = "latin1"; + char ascii_encoding[256] = ""; inline unsigned short byteSwap(unsigned short x) { @@ -161,17 +166,61 @@ String::String(char c, Type t) prepare(t); } + String::String(const ByteVector &v, Type t) { d = new StringPrivate; if(v.isEmpty()) return; - - if(t == Latin1 || t == UTF8) { - - int length = 0; - d->data.resize(v.size()); + + iconv_t encoder = (iconv_t)-1; + if ( t == Latin1 ) { + encoder = iconv_open("utf-8",(*ascii_encoding)?ascii_encoding:default_ascii_encoding); + if ( encoder == (iconv_t)-1 ) + encoder = iconv_open("utf-8",default_ascii_encoding); + } + + if ( t == Latin1 && encoder != (iconv_t)-1 ) { + size_t srclen = v.size(); + char *src = new char[srclen+1]; + size_t dstlen = v.size()*6; + char *dst = new char[dstlen+1]; + int n=0; + + char *src_param = src; + char *dst_param = dst; + size_t src_remaining = srclen; + size_t dst_remaining = dstlen; + + for(ByteVector::ConstIterator it = v.begin(); it != v.end() && (*it); ++it) + src[n++] = *it; + src[n++] = 0; + + iconv(encoder, &src_param, &src_remaining, &dst_param, &dst_remaining); + t = UTF8; + + int length = 0; + + d->data.resize(dstlen); + wstring::iterator targetIt = d->data.begin(); + for ( int i=0; idata.resize(length); + + delete[] src; + delete[] dst; + + iconv_close(encoder); + + t = UTF8; + } else if ( t == UTF8 || ( t == Latin1 && encoder == (iconv_t)-1) ) { // UTF8 string or encoder failed to start + int length = 0; + d->data.resize(v.size()*2); wstring::iterator targetIt = d->data.begin(); for(ByteVector::ConstIterator it = v.begin(); it != v.end() && (*it); ++it) { *targetIt = uchar(*it); @@ -183,7 +232,19 @@ String::String(const ByteVector &v, Type t) else { d->data.resize(v.size() / 2); wstring::iterator targetIt = d->data.begin(); - + + // Cure some faulty UTF16 headers without endianness: insert endianness byte into the beginning of the dst string. + if ( v.size() > 1 ) { + wchar w = combine(v.data()[0], v.data()[1]); + if ( w != 0xfeff && w != 0xfffe ) { + d->data.resize(v.size()/2 + 1); + targetIt = d->data.begin(); + *targetIt = 0xfffe; + ++targetIt; + // String append will continue in the loop below. + } + } + for(ByteVector::ConstIterator it = v.begin(); it != v.end() && it + 1 != v.end() && combine(*it, *(it + 1)); it += 2) diff --git a/Frameworks/TagLib/taglib/taglib/toolkit/tstring.h b/Frameworks/TagLib/taglib/taglib/toolkit/tstring.h index 2e1931f51..665e4a64c 100644 --- a/Frameworks/TagLib/taglib/taglib/toolkit/tstring.h +++ b/Frameworks/TagLib/taglib/taglib/toolkit/tstring.h @@ -55,6 +55,7 @@ #define TStringToQString(s) QString::fromUtf8(s.toCString(true)) namespace TagLib { + extern char ascii_encoding[]; //! A \e wide string class suitable for unicode. diff --git a/Frameworks/Vorbis/macosx/Vorbis.xcodeproj/project.pbxproj b/Frameworks/Vorbis/macosx/Vorbis.xcodeproj/project.pbxproj index 63d076a20..226e028e4 100644 --- a/Frameworks/Vorbis/macosx/Vorbis.xcodeproj/project.pbxproj +++ b/Frameworks/Vorbis/macosx/Vorbis.xcodeproj/project.pbxproj @@ -746,7 +746,10 @@ GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - HEADER_SEARCH_PATHS = ../lib; + HEADER_SEARCH_PATHS = ( + ../lib, + ../../../Frameworks/Ogg/include, + ); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ""; @@ -775,7 +778,10 @@ FRAMEWORK_SEARCH_PATHS = /Library/Frameworks; FRAMEWORK_VERSION = A; GCC_ENABLE_FIX_AND_CONTINUE = NO; - HEADER_SEARCH_PATHS = ../lib; + HEADER_SEARCH_PATHS = ( + ../lib, + ../../../Frameworks/Ogg/include, + ); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ""; diff --git a/Frameworks/Vorbis/macosx/VorbisNoDot.xcodeproj/project.pbxproj b/Frameworks/Vorbis/macosx/VorbisNoDot.xcodeproj/project.pbxproj index 3bcfa6d54..7e6485d1a 100644 --- a/Frameworks/Vorbis/macosx/VorbisNoDot.xcodeproj/project.pbxproj +++ b/Frameworks/Vorbis/macosx/VorbisNoDot.xcodeproj/project.pbxproj @@ -746,7 +746,10 @@ GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - HEADER_SEARCH_PATHS = ../lib; + HEADER_SEARCH_PATHS = ( + ../lib, + ../../../Frameworks/Ogg/include, + ); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "@loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ""; @@ -775,7 +778,10 @@ FRAMEWORK_SEARCH_PATHS = /Library/Frameworks; FRAMEWORK_VERSION = A; GCC_ENABLE_FIX_AND_CONTINUE = NO; - HEADER_SEARCH_PATHS = ../lib; + HEADER_SEARCH_PATHS = ( + ../lib, + ../../../Frameworks/Ogg/include, + ); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "@loader_path/Frameworks"; LIBRARY_SEARCH_PATHS = ""; diff --git a/Frameworks/vgmstream/vgmstream.xcodeproj/project.pbxproj b/Frameworks/vgmstream/vgmstream.xcodeproj/project.pbxproj index 355c97adc..44726c509 100644 --- a/Frameworks/vgmstream/vgmstream.xcodeproj/project.pbxproj +++ b/Frameworks/vgmstream/vgmstream.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 48C2650F1A5D420800A0A3D6 /* vorbisfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 48C2650E1A5D420800A0A3D6 /* vorbisfile.h */; }; 830F884019C9102F00420FB0 /* Vorbis.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 830F883919C9101900420FB0 /* Vorbis.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 830F885C19C9124C00420FB0 /* Vorbis.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830F883919C9101900420FB0 /* Vorbis.framework */; }; 8313E3E61902020400B4B6F1 /* mpg123.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8313E3431901FBDD00B4B6F1 /* mpg123.framework */; }; @@ -328,6 +329,18 @@ 83F5F8831908D0A400C8E65F /* fsb5.c in Sources */ = {isa = PBXBuildFile; fileRef = 83F5F8821908D0A400C8E65F /* fsb5.c */; }; /* End PBXBuildFile section */ +/* Begin PBXBuildRule section */ + 48C265101A5D424500A0A3D6 /* PBXBuildRule */ = { + isa = PBXBuildRule; + compilerSpec = com.apple.compilers.proxy.script; + fileType = sourcecode.swift; + isEditable = 1; + outputFiles = ( + ); + script = "# $(SWIFT_EXEC)\n"; + }; +/* End PBXBuildRule section */ + /* Begin PBXContainerItemProxy section */ 830F883219C9101900420FB0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -395,6 +408,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 48C2650E1A5D420800A0A3D6 /* vorbisfile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = vorbisfile.h; path = ../Vorbis/include/vorbis/vorbisfile.h; sourceTree = ""; }; 8313E33D1901FBDC00B4B6F1 /* mpg123.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = mpg123.xcodeproj; path = ../mpg123/mpg123.xcodeproj; sourceTree = ""; }; 8315231718BDECA1009AE289 /* VorbisNoDot.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = VorbisNoDot.xcodeproj; path = ../Vorbis/macosx/VorbisNoDot.xcodeproj; sourceTree = ""; }; 834D3A6D19F47C98001C54F6 /* g1l.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = g1l.c; sourceTree = ""; }; @@ -751,6 +765,7 @@ 836F6B2F18BDB8880095E648 = { isa = PBXGroup; children = ( + 48C2650E1A5D420800A0A3D6 /* vorbisfile.h */, 836F6B4218BDB8880095E648 /* vgmstream */, 836F6B3B18BDB8880095E648 /* Frameworks */, 836F6B3A18BDB8880095E648 /* Products */, @@ -1158,6 +1173,7 @@ 836F6F2718BDC2190095E648 /* g72x_state.h in Headers */, 836F705418BDC2190095E648 /* streamfile.h in Headers */, 836F705918BDC2190095E648 /* vgmstream.h in Headers */, + 48C2650F1A5D420800A0A3D6 /* vorbisfile.h in Headers */, 836F705718BDC2190095E648 /* util.h in Headers */, 836F6F9A18BDC2190095E648 /* meta.h in Headers */, 836F6F4D18BDC2190095E648 /* layout.h in Headers */, @@ -1179,6 +1195,7 @@ 83979B0C18BDD93100192D2F /* CopyFiles */, ); buildRules = ( + 48C265101A5D424500A0A3D6 /* PBXBuildRule */, ); dependencies = ( 830F883319C9101900420FB0 /* PBXTargetDependency */, @@ -1696,8 +1713,15 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Cog-egaqitgoybntfwaoqzgiynizucrq/Build/Products/Debug", + ../mpg123, ); FRAMEWORK_VERSION = A; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ../Vorbis/include, + ../Ogg/include, + ); INFOPLIST_FILE = "vgmstream/vgmstream-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = framework; @@ -1713,8 +1737,15 @@ FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(USER_LIBRARY_DIR)/Developer/Xcode/DerivedData/Cog-egaqitgoybntfwaoqzgiynizucrq/Build/Products/Debug", + ../mpg123, ); FRAMEWORK_VERSION = A; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ../Vorbis/include, + ../Ogg/include, + ); INFOPLIST_FILE = "vgmstream/vgmstream-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = framework; diff --git a/Playlist/PlaylistController.m b/Playlist/PlaylistController.m index 7a9a2c470..078a9a985 100644 --- a/Playlist/PlaylistController.m +++ b/Playlist/PlaylistController.m @@ -500,19 +500,14 @@ { RepeatMode repeat = [self repeat]; - if (i < 0) - { - if (repeat != RepeatNone) + if (i < 0 || i >= [[self arrangedObjects] count] ) { + if ( repeat != RepeatNone ) + return nil; + + while ( i < 0 ) i += [[self arrangedObjects] count]; - else - return nil; - } - else if (i >= [[self arrangedObjects] count]) - { - if (repeat != RepeatNone) - i -= [[self arrangedObjects] count]; - else - return nil; + if ( i >= [[self arrangedObjects] count]) + i %= [[self arrangedObjects] count]; } return [[self arrangedObjects] objectAtIndex:i]; diff --git a/Plugins/BASSMODS/BASSMODS.xcodeproj/project.pbxproj b/Plugins/BASSMODS/BASSMODS.xcodeproj/project.pbxproj index 5994d4086..24c17f539 100644 --- a/Plugins/BASSMODS/BASSMODS.xcodeproj/project.pbxproj +++ b/Plugins/BASSMODS/BASSMODS.xcodeproj/project.pbxproj @@ -310,7 +310,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", - /Users/Chris/Source/Repos/cog/ThirdParty/BASS, + "$(PROJECT_DIR)/../../ThirdParty/BASS", ); PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -329,7 +329,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", - /Users/Chris/Source/Repos/cog/ThirdParty/BASS, + "$(PROJECT_DIR)/../../ThirdParty/BASS", ); PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -356,6 +356,7 @@ 839BCFE61965133E00947767 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Plugins/Opus/Opus.xcodeproj/project.pbxproj b/Plugins/Opus/Opus.xcodeproj/project.pbxproj index acf980be1..9654d6a24 100644 --- a/Plugins/Opus/Opus.xcodeproj/project.pbxproj +++ b/Plugins/Opus/Opus.xcodeproj/project.pbxproj @@ -322,6 +322,11 @@ COMBINE_HIDPI_IMAGES = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Opus/Opus-Prefix.pch"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ../../Frameworks/Ogg/include, + ); INFOPLIST_FILE = "Opus/Opus-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -338,6 +343,11 @@ COMBINE_HIDPI_IMAGES = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Opus/Opus-Prefix.pch"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + ../../Frameworks/Ogg/include, + ); INFOPLIST_FILE = "Opus/Opus-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Plugins/TagLib/TagLib.xcodeproj/project.pbxproj b/Plugins/TagLib/TagLib.xcodeproj/project.pbxproj index ebde18956..cbb4babe6 100644 --- a/Plugins/TagLib/TagLib.xcodeproj/project.pbxproj +++ b/Plugins/TagLib/TagLib.xcodeproj/project.pbxproj @@ -273,13 +273,18 @@ buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = TagLib_Prefix.pch; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "../../Frameworks/TagLib/taglib/**", + ); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Bundles"; PRODUCT_NAME = TagLib; @@ -293,10 +298,15 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + FRAMEWORK_SEARCH_PATHS = ""; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = TagLib_Prefix.pch; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "../../Frameworks/TagLib/taglib/**", + ); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Bundles"; PRODUCT_NAME = TagLib; diff --git a/Plugins/TagLib/TagLibMetadataReader.m b/Plugins/TagLib/TagLibMetadataReader.m index 72772f135..cc6a6712a 100644 --- a/Plugins/TagLib/TagLibMetadataReader.m +++ b/Plugins/TagLib/TagLibMetadataReader.m @@ -7,12 +7,12 @@ // #import "TagLibMetadataReader.h" -#import -#import -#import -#import -#import -#import +#import +#import +#import +#import +#import +#import @implementation TagLibMetadataReader @@ -24,6 +24,41 @@ NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + if ( !*TagLib::ascii_encoding ) { + NSStringEncoding enc = [NSString defaultCStringEncoding]; + CFStringEncoding cfenc = CFStringConvertNSStringEncodingToEncoding(enc); + NSString *ref = (NSString *)CFStringConvertEncodingToIANACharSetName(cfenc); + UInt32 cp = CFStringConvertEncodingToWindowsCodepage(cfenc); + + // Most tags are using windows codepage, so remap OS X codepage to Windows one. + + static struct { + UInt32 from, to; + } codepage_remaps[] = { + { 10001, 932 }, // Japanese Shift-JIS + { 10002, 950 }, // Traditional Chinese + { 10003, 949 }, // Korean + { 10004, 1256 }, // Arabic + { 10005, 1255 }, // Hebrew + { 10006, 1253 }, // Greek + { 10007, 1251 }, // Cyrillic + { 10008, 936 }, // Simplified Chinese + { 10029, 1250 }, // Central European (latin2) + }; + + int i; + int max = sizeof(codepage_remaps)/sizeof(codepage_remaps[0]); + for ( i=0; i