Compare commits
No commits in common. "master" and "gh-pages" have entirely different histories.
|
|
@ -1,26 +0,0 @@
|
||||||
*.com
|
|
||||||
*.class
|
|
||||||
*.dll
|
|
||||||
*.exe
|
|
||||||
*.o
|
|
||||||
*.so
|
|
||||||
*.7z
|
|
||||||
*.dmg
|
|
||||||
*.gz
|
|
||||||
*.iso
|
|
||||||
*.jar
|
|
||||||
*.rar
|
|
||||||
*.tar
|
|
||||||
*.zip
|
|
||||||
*.log
|
|
||||||
*.sql
|
|
||||||
*.sqlite
|
|
||||||
.DS_Store
|
|
||||||
.DS_Store?
|
|
||||||
._*
|
|
||||||
.Spotlight-V100
|
|
||||||
.Trashes
|
|
||||||
Icon?
|
|
||||||
ehthumbs.db
|
|
||||||
Thumbs.db
|
|
||||||
xcuserdata
|
|
||||||
|
|
@ -1,524 +0,0 @@
|
||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 46;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
A1115935188D686000641365 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1115934188D686000641365 /* Foundation.framework */; };
|
|
||||||
A1115937188D686000641365 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1115936188D686000641365 /* CoreGraphics.framework */; };
|
|
||||||
A1115939188D686000641365 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1115938188D686000641365 /* UIKit.framework */; };
|
|
||||||
A111593F188D686000641365 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A111593D188D686000641365 /* InfoPlist.strings */; };
|
|
||||||
A1115941188D686000641365 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A1115940188D686000641365 /* main.m */; };
|
|
||||||
A1115945188D686000641365 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A1115944188D686000641365 /* AppDelegate.m */; };
|
|
||||||
A1115947188D686000641365 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A1115946188D686000641365 /* Images.xcassets */; };
|
|
||||||
A111594E188D686000641365 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A111594D188D686000641365 /* XCTest.framework */; };
|
|
||||||
A111594F188D686000641365 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1115934188D686000641365 /* Foundation.framework */; };
|
|
||||||
A1115950188D686000641365 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1115938188D686000641365 /* UIKit.framework */; };
|
|
||||||
A1115958188D686000641365 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A1115956188D686000641365 /* InfoPlist.strings */; };
|
|
||||||
A111595A188D686000641365 /* ExampleAppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A1115959188D686000641365 /* ExampleAppTests.m */; };
|
|
||||||
A1115964188D691500641365 /* libStreamingKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A1115963188D691500641365 /* libStreamingKit.a */; };
|
|
||||||
A1115967188D6AEE00641365 /* AudioPlayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = A1115966188D6AEE00641365 /* AudioPlayerView.m */; };
|
|
||||||
A111596C188D6C8100641365 /* sample.m4a in Resources */ = {isa = PBXBuildFile; fileRef = A111596B188D6C8100641365 /* sample.m4a */; };
|
|
||||||
A111596F188D6DB100641365 /* SampleQueueId.m in Sources */ = {isa = PBXBuildFile; fileRef = A111596E188D6DB100641365 /* SampleQueueId.m */; };
|
|
||||||
A142571D189079BE005F0129 /* airplane.aac in Resources */ = {isa = PBXBuildFile; fileRef = A142571C18907861005F0129 /* airplane.aac */; };
|
|
||||||
A17FFB6318A0028300BAA7FF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A17FFB6218A0028300BAA7FF /* AudioToolbox.framework */; };
|
|
||||||
A17FFB6918A002E400BAA7FF /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1F5E491189EB3F20070B03F /* AVFoundation.framework */; };
|
|
||||||
A1EBEE64188DE34500681B04 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1EBEE63188DE34500681B04 /* SystemConfiguration.framework */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
|
||||||
A1115951188D686000641365 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = A1115929188D686000641365 /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = A1115930188D686000641365;
|
|
||||||
remoteInfo = ExampleApp;
|
|
||||||
};
|
|
||||||
/* End PBXContainerItemProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
A1115931188D686000641365 /* ExampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A1115934188D686000641365 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
|
||||||
A1115936188D686000641365 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
|
||||||
A1115938188D686000641365 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
|
||||||
A111593C188D686000641365 /* ExampleApp-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ExampleApp-Info.plist"; sourceTree = "<group>"; };
|
|
||||||
A111593E188D686000641365 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
A1115940188D686000641365 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
|
||||||
A1115942188D686000641365 /* ExampleApp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ExampleApp-Prefix.pch"; sourceTree = "<group>"; };
|
|
||||||
A1115943188D686000641365 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
|
||||||
A1115944188D686000641365 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
|
|
||||||
A1115946188D686000641365 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
|
|
||||||
A111594C188D686000641365 /* ExampleAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ExampleAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A111594D188D686000641365 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
|
|
||||||
A1115955188D686000641365 /* ExampleAppTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ExampleAppTests-Info.plist"; sourceTree = "<group>"; };
|
|
||||||
A1115957188D686000641365 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
A1115959188D686000641365 /* ExampleAppTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExampleAppTests.m; sourceTree = "<group>"; };
|
|
||||||
A1115963188D691500641365 /* libStreamingKit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libStreamingKit.a; path = "../../../Library/Developer/Xcode/DerivedData/StreamingKit-dabtccqthoyywldsgcvllbcjcmma/Build/Products/Debug-iphoneos/libStreamingKit.a"; sourceTree = "<group>"; };
|
|
||||||
A1115965188D6AEE00641365 /* AudioPlayerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioPlayerView.h; sourceTree = "<group>"; };
|
|
||||||
A1115966188D6AEE00641365 /* AudioPlayerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioPlayerView.m; sourceTree = "<group>"; };
|
|
||||||
A111596B188D6C8100641365 /* sample.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; name = sample.m4a; path = Resources/sample.m4a; sourceTree = "<group>"; };
|
|
||||||
A111596D188D6DB100641365 /* SampleQueueId.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleQueueId.h; sourceTree = "<group>"; };
|
|
||||||
A111596E188D6DB100641365 /* SampleQueueId.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SampleQueueId.m; sourceTree = "<group>"; };
|
|
||||||
A142571C18907861005F0129 /* airplane.aac */ = {isa = PBXFileReference; lastKnownFileType = file; path = airplane.aac; sourceTree = "<group>"; };
|
|
||||||
A17FFB6218A0028300BAA7FF /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
|
||||||
A1EBEE63188DE34500681B04 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
|
||||||
A1F5E48F189EB3CB0070B03F /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
|
|
||||||
A1F5E491189EB3F20070B03F /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
A111592E188D686000641365 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A17FFB6918A002E400BAA7FF /* AVFoundation.framework in Frameworks */,
|
|
||||||
A17FFB6318A0028300BAA7FF /* AudioToolbox.framework in Frameworks */,
|
|
||||||
A1EBEE64188DE34500681B04 /* SystemConfiguration.framework in Frameworks */,
|
|
||||||
A1115964188D691500641365 /* libStreamingKit.a in Frameworks */,
|
|
||||||
A1115937188D686000641365 /* CoreGraphics.framework in Frameworks */,
|
|
||||||
A1115939188D686000641365 /* UIKit.framework in Frameworks */,
|
|
||||||
A1115935188D686000641365 /* Foundation.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1115949188D686000641365 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A111594E188D686000641365 /* XCTest.framework in Frameworks */,
|
|
||||||
A1115950188D686000641365 /* UIKit.framework in Frameworks */,
|
|
||||||
A111594F188D686000641365 /* Foundation.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
A1115928188D686000641365 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A111593A188D686000641365 /* ExampleApp */,
|
|
||||||
A1115953188D686000641365 /* ExampleAppTests */,
|
|
||||||
A1115933188D686000641365 /* Frameworks */,
|
|
||||||
A1115932188D686000641365 /* Products */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1115932188D686000641365 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1115931188D686000641365 /* ExampleApp.app */,
|
|
||||||
A111594C188D686000641365 /* ExampleAppTests.xctest */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1115933188D686000641365 /* Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A17FFB6218A0028300BAA7FF /* AudioToolbox.framework */,
|
|
||||||
A1F5E491189EB3F20070B03F /* AVFoundation.framework */,
|
|
||||||
A1F5E48F189EB3CB0070B03F /* AudioUnit.framework */,
|
|
||||||
A1EBEE63188DE34500681B04 /* SystemConfiguration.framework */,
|
|
||||||
A1115963188D691500641365 /* libStreamingKit.a */,
|
|
||||||
A1115934188D686000641365 /* Foundation.framework */,
|
|
||||||
A1115936188D686000641365 /* CoreGraphics.framework */,
|
|
||||||
A1115938188D686000641365 /* UIKit.framework */,
|
|
||||||
A111594D188D686000641365 /* XCTest.framework */,
|
|
||||||
);
|
|
||||||
name = Frameworks;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A111593A188D686000641365 /* ExampleApp */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A111596A188D6C4B00641365 /* Resources */,
|
|
||||||
A1115943188D686000641365 /* AppDelegate.h */,
|
|
||||||
A1115944188D686000641365 /* AppDelegate.m */,
|
|
||||||
A1115965188D6AEE00641365 /* AudioPlayerView.h */,
|
|
||||||
A1115966188D6AEE00641365 /* AudioPlayerView.m */,
|
|
||||||
A111596D188D6DB100641365 /* SampleQueueId.h */,
|
|
||||||
A111596E188D6DB100641365 /* SampleQueueId.m */,
|
|
||||||
A1115946188D686000641365 /* Images.xcassets */,
|
|
||||||
A111593B188D686000641365 /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = ExampleApp;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A111593B188D686000641365 /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A111593C188D686000641365 /* ExampleApp-Info.plist */,
|
|
||||||
A111593D188D686000641365 /* InfoPlist.strings */,
|
|
||||||
A1115940188D686000641365 /* main.m */,
|
|
||||||
A1115942188D686000641365 /* ExampleApp-Prefix.pch */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1115953188D686000641365 /* ExampleAppTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1115959188D686000641365 /* ExampleAppTests.m */,
|
|
||||||
A1115954188D686000641365 /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = ExampleAppTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1115954188D686000641365 /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1115955188D686000641365 /* ExampleAppTests-Info.plist */,
|
|
||||||
A1115956188D686000641365 /* InfoPlist.strings */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A111596A188D6C4B00641365 /* Resources */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A142571C18907861005F0129 /* airplane.aac */,
|
|
||||||
A111596B188D6C8100641365 /* sample.m4a */,
|
|
||||||
);
|
|
||||||
name = Resources;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
A1115930188D686000641365 /* ExampleApp */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A111595D188D686000641365 /* Build configuration list for PBXNativeTarget "ExampleApp" */;
|
|
||||||
buildPhases = (
|
|
||||||
A111592D188D686000641365 /* Sources */,
|
|
||||||
A111592E188D686000641365 /* Frameworks */,
|
|
||||||
A111592F188D686000641365 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = ExampleApp;
|
|
||||||
productName = ExampleApp;
|
|
||||||
productReference = A1115931188D686000641365 /* ExampleApp.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
A111594B188D686000641365 /* ExampleAppTests */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A1115960188D686000641365 /* Build configuration list for PBXNativeTarget "ExampleAppTests" */;
|
|
||||||
buildPhases = (
|
|
||||||
A1115948188D686000641365 /* Sources */,
|
|
||||||
A1115949188D686000641365 /* Frameworks */,
|
|
||||||
A111594A188D686000641365 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
A1115952188D686000641365 /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = ExampleAppTests;
|
|
||||||
productName = ExampleAppTests;
|
|
||||||
productReference = A111594C188D686000641365 /* ExampleAppTests.xctest */;
|
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
A1115929188D686000641365 /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
LastUpgradeCheck = 0710;
|
|
||||||
ORGANIZATIONNAME = "Thong Nguyen";
|
|
||||||
TargetAttributes = {
|
|
||||||
A111594B188D686000641365 = {
|
|
||||||
TestTargetID = A1115930188D686000641365;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = A111592C188D686000641365 /* Build configuration list for PBXProject "ExampleApp" */;
|
|
||||||
compatibilityVersion = "Xcode 3.2";
|
|
||||||
developmentRegion = English;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
);
|
|
||||||
mainGroup = A1115928188D686000641365;
|
|
||||||
productRefGroup = A1115932188D686000641365 /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
A1115930188D686000641365 /* ExampleApp */,
|
|
||||||
A111594B188D686000641365 /* ExampleAppTests */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
A111592F188D686000641365 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A111593F188D686000641365 /* InfoPlist.strings in Resources */,
|
|
||||||
A111596C188D6C8100641365 /* sample.m4a in Resources */,
|
|
||||||
A1115947188D686000641365 /* Images.xcassets in Resources */,
|
|
||||||
A142571D189079BE005F0129 /* airplane.aac in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A111594A188D686000641365 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1115958188D686000641365 /* InfoPlist.strings in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
A111592D188D686000641365 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1115945188D686000641365 /* AppDelegate.m in Sources */,
|
|
||||||
A1115941188D686000641365 /* main.m in Sources */,
|
|
||||||
A111596F188D6DB100641365 /* SampleQueueId.m in Sources */,
|
|
||||||
A1115967188D6AEE00641365 /* AudioPlayerView.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1115948188D686000641365 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A111595A188D686000641365 /* ExampleAppTests.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
|
||||||
A1115952188D686000641365 /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = A1115930188D686000641365 /* ExampleApp */;
|
|
||||||
targetProxy = A1115951188D686000641365 /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
/* End PBXTargetDependency section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
A111593D188D686000641365 /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A111593E188D686000641365 /* en */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1115956188D686000641365 /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A1115957188D686000641365 /* en */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
A111595B188D686000641365 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
ENABLE_TESTABILITY = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
|
||||||
"$(SRCROOT)/../StreamingKit/StreamingKit",
|
|
||||||
);
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A111595C188D686000641365 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = YES;
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
|
||||||
"$(SRCROOT)/../StreamingKit/StreamingKit",
|
|
||||||
);
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
VALIDATE_PRODUCT = YES;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A111595E188D686000641365 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "ExampleApp/ExampleApp-Prefix.pch";
|
|
||||||
INFOPLIST_FILE = "ExampleApp/ExampleApp-Info.plist";
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
|
|
||||||
LLVM_LTO = YES;
|
|
||||||
OTHER_LDFLAGS = "-ObjC";
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "abstractpath.com.${PRODUCT_NAME:rfc1034identifier}";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
WRAPPER_EXTENSION = app;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A111595F188D686000641365 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "ExampleApp/ExampleApp-Prefix.pch";
|
|
||||||
INFOPLIST_FILE = "ExampleApp/ExampleApp-Info.plist";
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
|
|
||||||
LLVM_LTO = YES;
|
|
||||||
OTHER_LDFLAGS = "-ObjC";
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "abstractpath.com.${PRODUCT_NAME:rfc1034identifier}";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
WRAPPER_EXTENSION = app;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A1115961188D686000641365 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ExampleApp.app/ExampleApp";
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
|
||||||
"$(inherited)",
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
);
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "ExampleApp/ExampleApp-Prefix.pch";
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = "ExampleAppTests/ExampleAppTests-Info.plist";
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "abstractpath.com.${PRODUCT_NAME:rfc1034identifier}";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
TEST_HOST = "$(BUNDLE_LOADER)";
|
|
||||||
WRAPPER_EXTENSION = xctest;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1115962188D686000641365 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ExampleApp.app/ExampleApp";
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
|
||||||
"$(inherited)",
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
);
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "ExampleApp/ExampleApp-Prefix.pch";
|
|
||||||
INFOPLIST_FILE = "ExampleAppTests/ExampleAppTests-Info.plist";
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "abstractpath.com.${PRODUCT_NAME:rfc1034identifier}";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
TEST_HOST = "$(BUNDLE_LOADER)";
|
|
||||||
WRAPPER_EXTENSION = xctest;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
A111592C188D686000641365 /* Build configuration list for PBXProject "ExampleApp" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A111595B188D686000641365 /* Debug */,
|
|
||||||
A111595C188D686000641365 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A111595D188D686000641365 /* Build configuration list for PBXNativeTarget "ExampleApp" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A111595E188D686000641365 /* Debug */,
|
|
||||||
A111595F188D686000641365 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A1115960188D686000641365 /* Build configuration list for PBXNativeTarget "ExampleAppTests" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1115961188D686000641365 /* Debug */,
|
|
||||||
A1115962188D686000641365 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = A1115929188D686000641365 /* Project object */;
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
//
|
|
||||||
// AppDelegate.h
|
|
||||||
// ExampleApp
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 20/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
#import "STKAudioPlayer.h"
|
|
||||||
#import "AudioPlayerView.h"
|
|
||||||
|
|
||||||
@interface AppDelegate : UIResponder <UIApplicationDelegate, AudioPlayerViewDelegate>
|
|
||||||
|
|
||||||
@property (strong, nonatomic) UIWindow *window;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,109 +0,0 @@
|
||||||
//
|
|
||||||
// AppDelegate.m
|
|
||||||
// ExampleApp
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 20/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "AppDelegate.h"
|
|
||||||
#import "STKAudioPlayer.h"
|
|
||||||
#import "AudioPlayerView.h"
|
|
||||||
#import "STKAutoRecoveringHTTPDataSource.h"
|
|
||||||
#import "SampleQueueId.h"
|
|
||||||
#import <AVFoundation/AVFoundation.h>
|
|
||||||
|
|
||||||
@interface AppDelegate()
|
|
||||||
{
|
|
||||||
STKAudioPlayer* audioPlayer;
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation AppDelegate
|
|
||||||
|
|
||||||
-(BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
|
|
||||||
{
|
|
||||||
NSError* error;
|
|
||||||
|
|
||||||
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
|
|
||||||
[[AVAudioSession sharedInstance] setActive:YES error:&error];
|
|
||||||
|
|
||||||
Float32 bufferLength = 0.1;
|
|
||||||
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(bufferLength), &bufferLength);
|
|
||||||
|
|
||||||
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
|
||||||
self.window.rootViewController = [[UIViewController alloc] init];
|
|
||||||
|
|
||||||
self.window.backgroundColor = [UIColor whiteColor];
|
|
||||||
|
|
||||||
audioPlayer = [[STKAudioPlayer alloc] initWithOptions:(STKAudioPlayerOptions){ .flushQueueOnSeek = YES, .enableVolumeMixer = NO, .equalizerBandFrequencies = {50, 100, 200, 400, 800, 1600, 2600, 16000} }];
|
|
||||||
audioPlayer.meteringEnabled = YES;
|
|
||||||
audioPlayer.volume = 1;
|
|
||||||
|
|
||||||
AudioPlayerView* audioPlayerView = [[AudioPlayerView alloc] initWithFrame:self.window.bounds andAudioPlayer:audioPlayer];
|
|
||||||
|
|
||||||
audioPlayerView.delegate = self;
|
|
||||||
|
|
||||||
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
|
|
||||||
[self becomeFirstResponder];
|
|
||||||
|
|
||||||
[self.window makeKeyAndVisible];
|
|
||||||
|
|
||||||
[self.window.rootViewController.view addSubview:audioPlayerView];
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) canBecomeFirstResponder
|
|
||||||
{
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayerViewPlayFromHTTPSelected:(AudioPlayerView*)audioPlayerView
|
|
||||||
{
|
|
||||||
NSURL* url = [NSURL URLWithString:@"http://www.abstractpath.com/files/audiosamples/sample.mp3"];
|
|
||||||
|
|
||||||
STKDataSource* dataSource = [STKAudioPlayer dataSourceFromURL:url];
|
|
||||||
|
|
||||||
[audioPlayer setDataSource:dataSource withQueueItemId:[[SampleQueueId alloc] initWithUrl:url andCount:0]];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayerViewPlayFromIcecastSelected:(AudioPlayerView *)audioPlayerView
|
|
||||||
{
|
|
||||||
NSURL* url = [NSURL URLWithString:@"http://shoutmedia.abc.net.au:10326"];
|
|
||||||
|
|
||||||
STKDataSource* dataSource = [STKAudioPlayer dataSourceFromURL:url];
|
|
||||||
|
|
||||||
[audioPlayer setDataSource:dataSource withQueueItemId:[[SampleQueueId alloc] initWithUrl:url andCount:0]];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayerViewQueueShortFileSelected:(AudioPlayerView*)audioPlayerView
|
|
||||||
{
|
|
||||||
NSString* path = [[NSBundle mainBundle] pathForResource:@"airplane" ofType:@"aac"];
|
|
||||||
NSURL* url = [NSURL fileURLWithPath:path];
|
|
||||||
|
|
||||||
STKDataSource* dataSource = [STKAudioPlayer dataSourceFromURL:url];
|
|
||||||
|
|
||||||
[audioPlayer queueDataSource:dataSource withQueueItemId:[[SampleQueueId alloc] initWithUrl:url andCount:0]];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayerViewPlayFromLocalFileSelected:(AudioPlayerView*)audioPlayerView
|
|
||||||
{
|
|
||||||
NSString* path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"m4a"];
|
|
||||||
NSURL* url = [NSURL fileURLWithPath:path];
|
|
||||||
|
|
||||||
STKDataSource* dataSource = [STKAudioPlayer dataSourceFromURL:url];
|
|
||||||
|
|
||||||
[audioPlayer setDataSource:dataSource withQueueItemId:[[SampleQueueId alloc] initWithUrl:url andCount:0]];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayerViewQueuePcmWaveFileSelected:(AudioPlayerView*)audioPlayerView
|
|
||||||
{
|
|
||||||
NSURL* url = [NSURL URLWithString:@"http://www.abstractpath.com/files/audiosamples/perfectly.wav"];
|
|
||||||
|
|
||||||
STKDataSource* dataSource = [STKAudioPlayer dataSourceFromURL:url];
|
|
||||||
|
|
||||||
[audioPlayer queueDataSource:dataSource withQueueItemId:[[SampleQueueId alloc] initWithUrl:url andCount:0]];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
#import "STKAudioPlayer.h"
|
|
||||||
|
|
||||||
@class AudioPlayerView;
|
|
||||||
|
|
||||||
@protocol AudioPlayerViewDelegate<NSObject>
|
|
||||||
-(void) audioPlayerViewPlayFromHTTPSelected:(AudioPlayerView*)audioPlayerView;
|
|
||||||
-(void) audioPlayerViewPlayFromIcecastSelected:(AudioPlayerView*)audioPlayerView;
|
|
||||||
-(void) audioPlayerViewQueueShortFileSelected:(AudioPlayerView*)audioPlayerView;
|
|
||||||
-(void) audioPlayerViewPlayFromLocalFileSelected:(AudioPlayerView*)audioPlayerView;
|
|
||||||
-(void) audioPlayerViewQueuePcmWaveFileSelected:(AudioPlayerView*)audioPlayerView;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface AudioPlayerView : UIView<STKAudioPlayerDelegate>
|
|
||||||
{
|
|
||||||
@private
|
|
||||||
NSTimer* timer;
|
|
||||||
UILabel* label;
|
|
||||||
UILabel* statusLabel;
|
|
||||||
UISlider* slider;
|
|
||||||
UISwitch* enableEqSwitch;
|
|
||||||
UISwitch* repeatSwitch;
|
|
||||||
UIButton* muteButton;
|
|
||||||
UIButton* playButton;
|
|
||||||
UIButton* stopButton;
|
|
||||||
UIButton* playFromHTTPButton;
|
|
||||||
UIButton* playFromIcecastButton;
|
|
||||||
UIButton* queueShortFileButton;
|
|
||||||
UIButton* queuePcmWaveFileFromHTTPButton;
|
|
||||||
UIButton* playFromLocalFileButton;
|
|
||||||
UIView* meter;
|
|
||||||
}
|
|
||||||
|
|
||||||
@property (readwrite, retain) STKAudioPlayer* audioPlayer;
|
|
||||||
@property (readwrite, unsafe_unretained) id<AudioPlayerViewDelegate> delegate;
|
|
||||||
|
|
||||||
- (id)initWithFrame:(CGRect)frame andAudioPlayer:(STKAudioPlayer*)audioPlayer;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,378 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "AudioPlayerView.h"
|
|
||||||
#import "SampleQueueId.h"
|
|
||||||
|
|
||||||
///
|
|
||||||
/// This sample media player will play a local or an HTTP stream in repeat (gapless)
|
|
||||||
///
|
|
||||||
|
|
||||||
@interface AudioPlayerView()
|
|
||||||
-(void) setupTimer;
|
|
||||||
-(void) updateControls;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation AudioPlayerView
|
|
||||||
@synthesize audioPlayer, delegate;
|
|
||||||
|
|
||||||
- (id)initWithFrame:(CGRect)frame andAudioPlayer:(STKAudioPlayer*)audioPlayerIn
|
|
||||||
{
|
|
||||||
self = [super initWithFrame:frame];
|
|
||||||
|
|
||||||
if (self)
|
|
||||||
{
|
|
||||||
self.audioPlayer = audioPlayerIn;
|
|
||||||
|
|
||||||
CGSize size = CGSizeMake(220, 50);
|
|
||||||
|
|
||||||
playFromHTTPButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
|
||||||
playFromHTTPButton.frame = CGRectMake((frame.size.width - size.width) / 2, frame.size.height * 0.10, size.width, size.height);
|
|
||||||
[playFromHTTPButton addTarget:self action:@selector(playFromHTTPButtonTouched) forControlEvents:UIControlEventTouchUpInside];
|
|
||||||
[playFromHTTPButton setTitle:@"Play from HTTP" forState:UIControlStateNormal];
|
|
||||||
|
|
||||||
playFromIcecastButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
|
||||||
playFromIcecastButton.frame = CGRectMake((frame.size.width - size.width) / 2, frame.size.height * 0.10 + 35, size.width, size.height);
|
|
||||||
[playFromIcecastButton addTarget:self action:@selector(playFromIcecasButtonTouched) forControlEvents:UIControlEventTouchUpInside];
|
|
||||||
[playFromIcecastButton setTitle:@"Play from Icecast" forState:UIControlStateNormal];
|
|
||||||
|
|
||||||
playFromLocalFileButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
|
||||||
playFromLocalFileButton.frame = CGRectMake((frame.size.width - size.width) / 2, frame.size.height * 0.10 + 70, size.width, size.height);
|
|
||||||
[playFromLocalFileButton addTarget:self action:@selector(playFromLocalFileButtonTouched) forControlEvents:UIControlEventTouchUpInside];
|
|
||||||
[playFromLocalFileButton setTitle:@"Play from Local File" forState:UIControlStateNormal];
|
|
||||||
|
|
||||||
queueShortFileButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
|
||||||
queueShortFileButton.frame = CGRectMake((frame.size.width - size.width) / 2, frame.size.height * 0.10 + 105, size.width, size.height);
|
|
||||||
[queueShortFileButton addTarget:self action:@selector(queueShortFileButtonTouched) forControlEvents:UIControlEventTouchUpInside];
|
|
||||||
[queueShortFileButton setTitle:@"Queue short file" forState:UIControlStateNormal];
|
|
||||||
|
|
||||||
queuePcmWaveFileFromHTTPButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
|
||||||
queuePcmWaveFileFromHTTPButton.frame = CGRectMake((frame.size.width - size.width) / 2, frame.size.height * 0.10 + 140, size.width, size.height);
|
|
||||||
[queuePcmWaveFileFromHTTPButton addTarget:self action:@selector(queuePcmWaveFileButtonTouched) forControlEvents:UIControlEventTouchUpInside];
|
|
||||||
[queuePcmWaveFileFromHTTPButton setTitle:@"Queue PCM/WAVE from HTTP" forState:UIControlStateNormal];
|
|
||||||
|
|
||||||
size = CGSizeMake(90, 40);
|
|
||||||
|
|
||||||
playButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
|
||||||
playButton.frame = CGRectMake(30, 400, size.width, size.height);
|
|
||||||
[playButton addTarget:self action:@selector(playButtonPressed) forControlEvents:UIControlEventTouchUpInside];
|
|
||||||
|
|
||||||
stopButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
|
||||||
stopButton.frame = CGRectMake((frame.size.width - size.width) - 30, 400, size.width, size.height);
|
|
||||||
[stopButton addTarget:self action:@selector(stopButtonPressed) forControlEvents:UIControlEventTouchUpInside];
|
|
||||||
[stopButton setTitle:@"Stop" forState:UIControlStateNormal];
|
|
||||||
|
|
||||||
muteButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
|
||||||
muteButton.frame = CGRectMake((frame.size.width - size.width) - 30, 430, size.width, size.height);
|
|
||||||
[muteButton addTarget:self action:@selector(muteButtonPressed) forControlEvents:UIControlEventTouchUpInside];
|
|
||||||
[muteButton setTitle:@"Mute" forState:UIControlStateNormal];
|
|
||||||
|
|
||||||
slider = [[UISlider alloc] initWithFrame:CGRectMake(20, 320, queuePcmWaveFileFromHTTPButton.frame.origin.y + queuePcmWaveFileFromHTTPButton.frame.size.height + 20, 20)];
|
|
||||||
slider.continuous = YES;
|
|
||||||
[slider addTarget:self action:@selector(sliderChanged) forControlEvents:UIControlEventValueChanged];
|
|
||||||
|
|
||||||
size = CGSizeMake(80, 50);
|
|
||||||
|
|
||||||
repeatSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(30, frame.size.height * 0.15 + 180, size.width, size.height)];
|
|
||||||
|
|
||||||
enableEqSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(frame.size.width - size.width - 30, frame.size.height * 0.15 + 180, size.width, size.height)];
|
|
||||||
enableEqSwitch.on = audioPlayer.equalizerEnabled;
|
|
||||||
|
|
||||||
[enableEqSwitch addTarget:self action:@selector(onEnableEqSwitch) forControlEvents:UIControlEventAllTouchEvents];
|
|
||||||
|
|
||||||
label = [[UILabel alloc] initWithFrame:CGRectMake(0, slider.frame.origin.y + slider.frame.size.height + 40, frame.size.width, 25)];
|
|
||||||
|
|
||||||
label.textAlignment = NSTextAlignmentCenter;
|
|
||||||
|
|
||||||
statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, slider.frame.origin.y + slider.frame.size.height + label.frame.size.height + 50, frame.size.width, 50)];
|
|
||||||
|
|
||||||
statusLabel.textAlignment = NSTextAlignmentCenter;
|
|
||||||
|
|
||||||
meter = [[UIView alloc] initWithFrame:CGRectMake(0, 450, 0, 20)];
|
|
||||||
|
|
||||||
meter.backgroundColor = [UIColor greenColor];
|
|
||||||
|
|
||||||
[self addSubview:slider];
|
|
||||||
[self addSubview:playButton];
|
|
||||||
[self addSubview:playFromHTTPButton];
|
|
||||||
[self addSubview:playFromIcecastButton];
|
|
||||||
[self addSubview:playFromLocalFileButton];
|
|
||||||
[self addSubview:queueShortFileButton];
|
|
||||||
[self addSubview:queuePcmWaveFileFromHTTPButton];
|
|
||||||
[self addSubview:repeatSwitch];
|
|
||||||
[self addSubview:label];
|
|
||||||
[self addSubview:statusLabel];
|
|
||||||
[self addSubview:stopButton];
|
|
||||||
[self addSubview:meter];
|
|
||||||
[self addSubview:muteButton];
|
|
||||||
[self addSubview:enableEqSwitch];
|
|
||||||
|
|
||||||
[self setupTimer];
|
|
||||||
[self updateControls];
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) onEnableEqSwitch
|
|
||||||
{
|
|
||||||
audioPlayer.equalizerEnabled = self->enableEqSwitch.on;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) sliderChanged
|
|
||||||
{
|
|
||||||
if (!audioPlayer)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSLog(@"Slider Changed: %f", slider.value);
|
|
||||||
|
|
||||||
[audioPlayer seekToTime:slider.value];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) setupTimer
|
|
||||||
{
|
|
||||||
timer = [NSTimer timerWithTimeInterval:0.001 target:self selector:@selector(tick) userInfo:nil repeats:YES];
|
|
||||||
|
|
||||||
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) tick
|
|
||||||
{
|
|
||||||
if (!audioPlayer)
|
|
||||||
{
|
|
||||||
slider.value = 0;
|
|
||||||
label.text = @"";
|
|
||||||
statusLabel.text = @"";
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (audioPlayer.currentlyPlayingQueueItemId == nil)
|
|
||||||
{
|
|
||||||
slider.value = 0;
|
|
||||||
slider.minimumValue = 0;
|
|
||||||
slider.maximumValue = 0;
|
|
||||||
|
|
||||||
label.text = @"";
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (audioPlayer.duration != 0)
|
|
||||||
{
|
|
||||||
slider.minimumValue = 0;
|
|
||||||
slider.maximumValue = audioPlayer.duration;
|
|
||||||
slider.value = audioPlayer.progress;
|
|
||||||
|
|
||||||
label.text = [NSString stringWithFormat:@"%@ - %@", [self formatTimeFromSeconds:audioPlayer.progress], [self formatTimeFromSeconds:audioPlayer.duration]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
slider.value = 0;
|
|
||||||
slider.minimumValue = 0;
|
|
||||||
slider.maximumValue = 0;
|
|
||||||
|
|
||||||
label.text = [NSString stringWithFormat:@"Live stream %@", [self formatTimeFromSeconds:audioPlayer.progress]];
|
|
||||||
}
|
|
||||||
|
|
||||||
statusLabel.text = audioPlayer.state == STKAudioPlayerStateBuffering ? @"buffering" : @"";
|
|
||||||
|
|
||||||
CGFloat newWidth = 320 * (([audioPlayer averagePowerInDecibelsForChannel:1] + 60) / 60);
|
|
||||||
|
|
||||||
meter.frame = CGRectMake(0, 460, newWidth, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) playFromHTTPButtonTouched
|
|
||||||
{
|
|
||||||
[self.delegate audioPlayerViewPlayFromHTTPSelected:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) playFromIcecasButtonTouched
|
|
||||||
{
|
|
||||||
[self.delegate audioPlayerViewPlayFromIcecastSelected:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) playFromLocalFileButtonTouched
|
|
||||||
{
|
|
||||||
[self.delegate audioPlayerViewPlayFromLocalFileSelected:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) queueShortFileButtonTouched
|
|
||||||
{
|
|
||||||
[self.delegate audioPlayerViewQueueShortFileSelected:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) queuePcmWaveFileButtonTouched
|
|
||||||
{
|
|
||||||
[self.delegate audioPlayerViewQueuePcmWaveFileSelected:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) muteButtonPressed
|
|
||||||
{
|
|
||||||
audioPlayer.muted = !audioPlayer.muted;
|
|
||||||
|
|
||||||
if (audioPlayer.muted)
|
|
||||||
{
|
|
||||||
[muteButton setTitle:@"Unmute" forState:UIControlStateNormal];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[muteButton setTitle:@"Mute" forState:UIControlStateNormal];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) stopButtonPressed
|
|
||||||
{
|
|
||||||
[audioPlayer stop];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) playButtonPressed
|
|
||||||
{
|
|
||||||
if (!audioPlayer)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (audioPlayer.state == STKAudioPlayerStatePaused)
|
|
||||||
{
|
|
||||||
[audioPlayer resume];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[audioPlayer pause];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSString*) formatTimeFromSeconds:(int)totalSeconds
|
|
||||||
{
|
|
||||||
|
|
||||||
int seconds = totalSeconds % 60;
|
|
||||||
int minutes = (totalSeconds / 60) % 60;
|
|
||||||
int hours = totalSeconds / 3600;
|
|
||||||
|
|
||||||
return [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) updateControls
|
|
||||||
{
|
|
||||||
if (audioPlayer == nil)
|
|
||||||
{
|
|
||||||
[playButton setTitle:@"" forState:UIControlStateNormal];
|
|
||||||
}
|
|
||||||
else if (audioPlayer.state == STKAudioPlayerStatePaused)
|
|
||||||
{
|
|
||||||
[playButton setTitle:@"Resume" forState:UIControlStateNormal];
|
|
||||||
}
|
|
||||||
else if (audioPlayer.state & STKAudioPlayerStatePlaying)
|
|
||||||
{
|
|
||||||
[playButton setTitle:@"Pause" forState:UIControlStateNormal];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[playButton setTitle:@"" forState:UIControlStateNormal];
|
|
||||||
}
|
|
||||||
|
|
||||||
[self tick];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) setAudioPlayer:(STKAudioPlayer*)value
|
|
||||||
{
|
|
||||||
if (audioPlayer)
|
|
||||||
{
|
|
||||||
audioPlayer.delegate = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
audioPlayer = value;
|
|
||||||
audioPlayer.delegate = self;
|
|
||||||
|
|
||||||
[self updateControls];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(STKAudioPlayer*) audioPlayer
|
|
||||||
{
|
|
||||||
return audioPlayer;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer stateChanged:(STKAudioPlayerState)state previousState:(STKAudioPlayerState)previousState
|
|
||||||
{
|
|
||||||
[self updateControls];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer unexpectedError:(STKAudioPlayerErrorCode)errorCode
|
|
||||||
{
|
|
||||||
[self updateControls];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didStartPlayingQueueItemId:(NSObject*)queueItemId
|
|
||||||
{
|
|
||||||
SampleQueueId* queueId = (SampleQueueId*)queueItemId;
|
|
||||||
|
|
||||||
NSLog(@"Started: %@", [queueId.url description]);
|
|
||||||
|
|
||||||
[self updateControls];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didFinishBufferingSourceWithQueueItemId:(NSObject*)queueItemId
|
|
||||||
{
|
|
||||||
[self updateControls];
|
|
||||||
|
|
||||||
// This queues on the currently playing track to be buffered and played immediately after (gapless)
|
|
||||||
|
|
||||||
if (repeatSwitch.on)
|
|
||||||
{
|
|
||||||
SampleQueueId* queueId = (SampleQueueId*)queueItemId;
|
|
||||||
|
|
||||||
NSLog(@"Requeuing: %@", [queueId.url description]);
|
|
||||||
|
|
||||||
[self->audioPlayer queueDataSource:[STKAudioPlayer dataSourceFromURL:queueId.url] withQueueItemId:[[SampleQueueId alloc] initWithUrl:queueId.url andCount:queueId.count + 1]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didFinishPlayingQueueItemId:(NSObject*)queueItemId withReason:(STKAudioPlayerStopReason)stopReason andProgress:(double)progress andDuration:(double)duration
|
|
||||||
{
|
|
||||||
[self updateControls];
|
|
||||||
|
|
||||||
SampleQueueId* queueId = (SampleQueueId*)queueItemId;
|
|
||||||
|
|
||||||
NSLog(@"Finished: %@", [queueId.url description]);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer *)audioPlayer logInfo:(NSString *)line
|
|
||||||
{
|
|
||||||
NSLog(@"%@", line);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>en</string>
|
|
||||||
<key>CFBundleDisplayName</key>
|
|
||||||
<string>${PRODUCT_NAME}</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>${PRODUCT_NAME}</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>LSRequiresIPhoneOS</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIBackgroundModes</key>
|
|
||||||
<array>
|
|
||||||
<string>audio</string>
|
|
||||||
</array>
|
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
|
||||||
<array>
|
|
||||||
<string>armv7</string>
|
|
||||||
</array>
|
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
//
|
|
||||||
// Prefix header
|
|
||||||
//
|
|
||||||
// The contents of this file are implicitly included at the beginning of every source file.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Availability.h>
|
|
||||||
|
|
||||||
#ifndef __IPHONE_3_0
|
|
||||||
#warning "This project uses features only available in iOS SDK 3.0 and later."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __OBJC__
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "60x60",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"size" : "60x60",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "29x29",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "40x40",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "76x76",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"size" : "76x76",
|
|
||||||
"scale" : "2x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
{
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,98 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"subtype" : "736h",
|
|
||||||
"filename" : "TX6sV.png",
|
|
||||||
"minimum-system-version" : "8.0",
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "landscape",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "8.0",
|
|
||||||
"subtype" : "736h",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"subtype" : "667h",
|
|
||||||
"filename" : "dBEHd.png",
|
|
||||||
"minimum-system-version" : "8.0",
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"subtype" : "retina4",
|
|
||||||
"filename" : "TX6sV-2.png",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "landscape",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "landscape",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"minimum-system-version" : "7.0",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"orientation" : "portrait",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "TX6sV-1.png",
|
|
||||||
"extent" : "full-screen",
|
|
||||||
"subtype" : "retina4",
|
|
||||||
"scale" : "2x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
|
@ -1,17 +0,0 @@
|
||||||
//
|
|
||||||
// SampleQueueId.h
|
|
||||||
// ExampleApp
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 20/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
|
|
||||||
@interface SampleQueueId : NSObject
|
|
||||||
@property (readwrite) int count;
|
|
||||||
@property (readwrite) NSURL* url;
|
|
||||||
|
|
||||||
-(id) initWithUrl:(NSURL*)url andCount:(int)count;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
//
|
|
||||||
// SampleQueueId.m
|
|
||||||
// ExampleApp
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 20/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "SampleQueueId.h"
|
|
||||||
|
|
||||||
@implementation SampleQueueId
|
|
||||||
|
|
||||||
-(id) initWithUrl:(NSURL*)url andCount:(int)count
|
|
||||||
{
|
|
||||||
if (self = [super init])
|
|
||||||
{
|
|
||||||
self.url = url;
|
|
||||||
self.count = count;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) isEqual:(id)object
|
|
||||||
{
|
|
||||||
if (object == nil)
|
|
||||||
{
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([object class] != [SampleQueueId class])
|
|
||||||
{
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
return [((SampleQueueId*)object).url isEqual: self.url] && ((SampleQueueId*)object).count == self.count;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSString*) description
|
|
||||||
{
|
|
||||||
return [self.url description];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
/* Localized versions of Info.plist keys */
|
|
||||||
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
//
|
|
||||||
// main.m
|
|
||||||
// ExampleApp
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 20/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
|
|
||||||
#import "AppDelegate.h"
|
|
||||||
|
|
||||||
int main(int argc, char * argv[])
|
|
||||||
{
|
|
||||||
@autoreleasepool
|
|
||||||
{
|
|
||||||
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>en</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>BNDL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
//
|
|
||||||
// ExampleAppTests.m
|
|
||||||
// ExampleAppTests
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 20/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <XCTest/XCTest.h>
|
|
||||||
|
|
||||||
@interface ExampleAppTests : XCTestCase
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation ExampleAppTests
|
|
||||||
|
|
||||||
- (void)setUp
|
|
||||||
{
|
|
||||||
[super setUp];
|
|
||||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)tearDown
|
|
||||||
{
|
|
||||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
||||||
[super tearDown];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testExample
|
|
||||||
{
|
|
||||||
XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
/* Localized versions of Info.plist keys */
|
|
||||||
|
|
||||||
|
|
@ -1,537 +0,0 @@
|
||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 46;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
A17FFB6818A002BC00BAA7FF /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499ED189E793700E2A2E2 /* AudioUnit.framework */; };
|
|
||||||
A1A499A5189E765800E2A2E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499A4189E765800E2A2E2 /* Cocoa.framework */; };
|
|
||||||
A1A499AF189E765800E2A2E2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A1A499AD189E765800E2A2E2 /* InfoPlist.strings */; };
|
|
||||||
A1A499B1189E765800E2A2E2 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A1A499B0189E765800E2A2E2 /* main.m */; };
|
|
||||||
A1A499B5189E765800E2A2E2 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = A1A499B3189E765800E2A2E2 /* Credits.rtf */; };
|
|
||||||
A1A499B8189E765800E2A2E2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A1A499B7189E765800E2A2E2 /* AppDelegate.m */; };
|
|
||||||
A1A499BB189E765800E2A2E2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = A1A499B9189E765800E2A2E2 /* MainMenu.xib */; };
|
|
||||||
A1A499BD189E765800E2A2E2 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A1A499BC189E765800E2A2E2 /* Images.xcassets */; };
|
|
||||||
A1A499C4189E765800E2A2E2 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499C3189E765800E2A2E2 /* XCTest.framework */; };
|
|
||||||
A1A499C5189E765800E2A2E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499A4189E765800E2A2E2 /* Cocoa.framework */; };
|
|
||||||
A1A499CD189E765800E2A2E2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A1A499CB189E765800E2A2E2 /* InfoPlist.strings */; };
|
|
||||||
A1A499CF189E765800E2A2E2 /* ExampleAppMacTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A1A499CE189E765800E2A2E2 /* ExampleAppMacTests.m */; };
|
|
||||||
A1A499EC189E793300E2A2E2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499A9189E765800E2A2E2 /* Foundation.framework */; };
|
|
||||||
A1A499F0189E793D00E2A2E2 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499EF189E793D00E2A2E2 /* CoreAudio.framework */; };
|
|
||||||
A1A499F2189E799400E2A2E2 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499F1189E799400E2A2E2 /* AudioToolbox.framework */; };
|
|
||||||
A1A499F3189E799F00E2A2E2 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499ED189E793700E2A2E2 /* AudioUnit.framework */; };
|
|
||||||
A1A499F5189E79CB00E2A2E2 /* CoreAudioKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499F4189E79CB00E2A2E2 /* CoreAudioKit.framework */; };
|
|
||||||
A1A499F9189E7A3500E2A2E2 /* libStreamingKitMac.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499F8189E7A3500E2A2E2 /* libStreamingKitMac.a */; };
|
|
||||||
A1A499FA189E7A5600E2A2E2 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499F1189E799400E2A2E2 /* AudioToolbox.framework */; };
|
|
||||||
A1A499FC189E7A6D00E2A2E2 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A499FB189E7A6D00E2A2E2 /* SystemConfiguration.framework */; };
|
|
||||||
A1A49A01189E82EC00E2A2E2 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A49A00189E82EC00E2A2E2 /* QuartzCore.framework */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
|
||||||
A1A499C6189E765800E2A2E2 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = A1A49999189E765800E2A2E2 /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = A1A499A0189E765800E2A2E2;
|
|
||||||
remoteInfo = ExampleAppMac;
|
|
||||||
};
|
|
||||||
/* End PBXContainerItemProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
A17FFB6618A002AD00BAA7FF /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499A1189E765800E2A2E2 /* ExampleAppMac.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleAppMac.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A1A499A4189E765800E2A2E2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499A7189E765800E2A2E2 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499A8189E765800E2A2E2 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499A9189E765800E2A2E2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499AC189E765800E2A2E2 /* ExampleAppMac-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ExampleAppMac-Info.plist"; sourceTree = "<group>"; };
|
|
||||||
A1A499AE189E765800E2A2E2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
A1A499B0189E765800E2A2E2 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
|
||||||
A1A499B2189E765800E2A2E2 /* ExampleAppMac-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ExampleAppMac-Prefix.pch"; sourceTree = "<group>"; };
|
|
||||||
A1A499B4189E765800E2A2E2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
|
|
||||||
A1A499B6189E765800E2A2E2 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
|
||||||
A1A499B7189E765800E2A2E2 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
|
|
||||||
A1A499BA189E765800E2A2E2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
|
||||||
A1A499BC189E765800E2A2E2 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
|
|
||||||
A1A499C2189E765800E2A2E2 /* ExampleAppMacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ExampleAppMacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A1A499C3189E765800E2A2E2 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
|
|
||||||
A1A499CA189E765800E2A2E2 /* ExampleAppMacTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ExampleAppMacTests-Info.plist"; sourceTree = "<group>"; };
|
|
||||||
A1A499CC189E765800E2A2E2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
A1A499CE189E765800E2A2E2 /* ExampleAppMacTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExampleAppMacTests.m; sourceTree = "<group>"; };
|
|
||||||
A1A499EA189E76BD00E2A2E2 /* libStreamingKitMac.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libStreamingKitMac.a; path = ../StreamingKit/build/Debug/libStreamingKitMac.a; sourceTree = "<group>"; };
|
|
||||||
A1A499ED189E793700E2A2E2 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499EF189E793D00E2A2E2 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499F1189E799400E2A2E2 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499F4189E79CB00E2A2E2 /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499F8189E7A3500E2A2E2 /* libStreamingKitMac.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libStreamingKitMac.a; path = ../StreamingKit/build/Debug/libStreamingKitMac.a; sourceTree = "<group>"; };
|
|
||||||
A1A499FB189E7A6D00E2A2E2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A499FE189E82DD00E2A2E2 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A49A00189E82EC00E2A2E2 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
A1A4999E189E765800E2A2E2 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A17FFB6818A002BC00BAA7FF /* AudioUnit.framework in Frameworks */,
|
|
||||||
A1A49A01189E82EC00E2A2E2 /* QuartzCore.framework in Frameworks */,
|
|
||||||
A1A499FC189E7A6D00E2A2E2 /* SystemConfiguration.framework in Frameworks */,
|
|
||||||
A1A499FA189E7A5600E2A2E2 /* AudioToolbox.framework in Frameworks */,
|
|
||||||
A1A499F9189E7A3500E2A2E2 /* libStreamingKitMac.a in Frameworks */,
|
|
||||||
A1A499F0189E793D00E2A2E2 /* CoreAudio.framework in Frameworks */,
|
|
||||||
A1A499EC189E793300E2A2E2 /* Foundation.framework in Frameworks */,
|
|
||||||
A1A499A5189E765800E2A2E2 /* Cocoa.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1A499BF189E765800E2A2E2 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A499F5189E79CB00E2A2E2 /* CoreAudioKit.framework in Frameworks */,
|
|
||||||
A1A499F3189E799F00E2A2E2 /* AudioUnit.framework in Frameworks */,
|
|
||||||
A1A499F2189E799400E2A2E2 /* AudioToolbox.framework in Frameworks */,
|
|
||||||
A1A499C5189E765800E2A2E2 /* Cocoa.framework in Frameworks */,
|
|
||||||
A1A499C4189E765800E2A2E2 /* XCTest.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
A1A49998189E765800E2A2E2 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499AA189E765800E2A2E2 /* ExampleAppMac */,
|
|
||||||
A1A499C8189E765800E2A2E2 /* ExampleAppMacTests */,
|
|
||||||
A1A499A3189E765800E2A2E2 /* Frameworks */,
|
|
||||||
A1A499A2189E765800E2A2E2 /* Products */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499A2189E765800E2A2E2 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499A1189E765800E2A2E2 /* ExampleAppMac.app */,
|
|
||||||
A1A499C2189E765800E2A2E2 /* ExampleAppMacTests.xctest */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499A3189E765800E2A2E2 /* Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A17FFB6618A002AD00BAA7FF /* AVFoundation.framework */,
|
|
||||||
A1A49A00189E82EC00E2A2E2 /* QuartzCore.framework */,
|
|
||||||
A1A499FE189E82DD00E2A2E2 /* CoreGraphics.framework */,
|
|
||||||
A1A499FB189E7A6D00E2A2E2 /* SystemConfiguration.framework */,
|
|
||||||
A1A499F8189E7A3500E2A2E2 /* libStreamingKitMac.a */,
|
|
||||||
A1A499F4189E79CB00E2A2E2 /* CoreAudioKit.framework */,
|
|
||||||
A1A499F1189E799400E2A2E2 /* AudioToolbox.framework */,
|
|
||||||
A1A499EF189E793D00E2A2E2 /* CoreAudio.framework */,
|
|
||||||
A1A499ED189E793700E2A2E2 /* AudioUnit.framework */,
|
|
||||||
A1A499EA189E76BD00E2A2E2 /* libStreamingKitMac.a */,
|
|
||||||
A1A499A4189E765800E2A2E2 /* Cocoa.framework */,
|
|
||||||
A1A499C3189E765800E2A2E2 /* XCTest.framework */,
|
|
||||||
A1A499A6189E765800E2A2E2 /* Other Frameworks */,
|
|
||||||
);
|
|
||||||
name = Frameworks;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499A6189E765800E2A2E2 /* Other Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499A7189E765800E2A2E2 /* AppKit.framework */,
|
|
||||||
A1A499A8189E765800E2A2E2 /* CoreData.framework */,
|
|
||||||
A1A499A9189E765800E2A2E2 /* Foundation.framework */,
|
|
||||||
);
|
|
||||||
name = "Other Frameworks";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499AA189E765800E2A2E2 /* ExampleAppMac */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499B6189E765800E2A2E2 /* AppDelegate.h */,
|
|
||||||
A1A499B7189E765800E2A2E2 /* AppDelegate.m */,
|
|
||||||
A1A499B9189E765800E2A2E2 /* MainMenu.xib */,
|
|
||||||
A1A499BC189E765800E2A2E2 /* Images.xcassets */,
|
|
||||||
A1A499AB189E765800E2A2E2 /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = ExampleAppMac;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499AB189E765800E2A2E2 /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499AC189E765800E2A2E2 /* ExampleAppMac-Info.plist */,
|
|
||||||
A1A499AD189E765800E2A2E2 /* InfoPlist.strings */,
|
|
||||||
A1A499B0189E765800E2A2E2 /* main.m */,
|
|
||||||
A1A499B2189E765800E2A2E2 /* ExampleAppMac-Prefix.pch */,
|
|
||||||
A1A499B3189E765800E2A2E2 /* Credits.rtf */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499C8189E765800E2A2E2 /* ExampleAppMacTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499CE189E765800E2A2E2 /* ExampleAppMacTests.m */,
|
|
||||||
A1A499C9189E765800E2A2E2 /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = ExampleAppMacTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499C9189E765800E2A2E2 /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499CA189E765800E2A2E2 /* ExampleAppMacTests-Info.plist */,
|
|
||||||
A1A499CB189E765800E2A2E2 /* InfoPlist.strings */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
A1A499A0189E765800E2A2E2 /* ExampleAppMac */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A1A499D2189E765800E2A2E2 /* Build configuration list for PBXNativeTarget "ExampleAppMac" */;
|
|
||||||
buildPhases = (
|
|
||||||
A1A4999D189E765800E2A2E2 /* Sources */,
|
|
||||||
A1A4999E189E765800E2A2E2 /* Frameworks */,
|
|
||||||
A1A4999F189E765800E2A2E2 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = ExampleAppMac;
|
|
||||||
productName = ExampleAppMac;
|
|
||||||
productReference = A1A499A1189E765800E2A2E2 /* ExampleAppMac.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
A1A499C1189E765800E2A2E2 /* ExampleAppMacTests */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A1A499D5189E765800E2A2E2 /* Build configuration list for PBXNativeTarget "ExampleAppMacTests" */;
|
|
||||||
buildPhases = (
|
|
||||||
A1A499BE189E765800E2A2E2 /* Sources */,
|
|
||||||
A1A499BF189E765800E2A2E2 /* Frameworks */,
|
|
||||||
A1A499C0189E765800E2A2E2 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
A1A499C7189E765800E2A2E2 /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = ExampleAppMacTests;
|
|
||||||
productName = ExampleAppMacTests;
|
|
||||||
productReference = A1A499C2189E765800E2A2E2 /* ExampleAppMacTests.xctest */;
|
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
A1A49999189E765800E2A2E2 /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
LastUpgradeCheck = 0500;
|
|
||||||
ORGANIZATIONNAME = "Thong Nguyen";
|
|
||||||
TargetAttributes = {
|
|
||||||
A1A499C1189E765800E2A2E2 = {
|
|
||||||
TestTargetID = A1A499A0189E765800E2A2E2;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = A1A4999C189E765800E2A2E2 /* Build configuration list for PBXProject "ExampleAppMac" */;
|
|
||||||
compatibilityVersion = "Xcode 3.2";
|
|
||||||
developmentRegion = English;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
);
|
|
||||||
mainGroup = A1A49998189E765800E2A2E2;
|
|
||||||
productRefGroup = A1A499A2189E765800E2A2E2 /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
A1A499A0189E765800E2A2E2 /* ExampleAppMac */,
|
|
||||||
A1A499C1189E765800E2A2E2 /* ExampleAppMacTests */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
A1A4999F189E765800E2A2E2 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A499AF189E765800E2A2E2 /* InfoPlist.strings in Resources */,
|
|
||||||
A1A499BD189E765800E2A2E2 /* Images.xcassets in Resources */,
|
|
||||||
A1A499B5189E765800E2A2E2 /* Credits.rtf in Resources */,
|
|
||||||
A1A499BB189E765800E2A2E2 /* MainMenu.xib in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1A499C0189E765800E2A2E2 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A499CD189E765800E2A2E2 /* InfoPlist.strings in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
A1A4999D189E765800E2A2E2 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A499B8189E765800E2A2E2 /* AppDelegate.m in Sources */,
|
|
||||||
A1A499B1189E765800E2A2E2 /* main.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1A499BE189E765800E2A2E2 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A499CF189E765800E2A2E2 /* ExampleAppMacTests.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
|
||||||
A1A499C7189E765800E2A2E2 /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = A1A499A0189E765800E2A2E2 /* ExampleAppMac */;
|
|
||||||
targetProxy = A1A499C6189E765800E2A2E2 /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
/* End PBXTargetDependency section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
A1A499AD189E765800E2A2E2 /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A1A499AE189E765800E2A2E2 /* en */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499B3189E765800E2A2E2 /* Credits.rtf */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A1A499B4189E765800E2A2E2 /* en */,
|
|
||||||
);
|
|
||||||
name = Credits.rtf;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499B9189E765800E2A2E2 /* MainMenu.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A1A499BA189E765800E2A2E2 /* Base */,
|
|
||||||
);
|
|
||||||
name = MainMenu.xib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499CB189E765800E2A2E2 /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A1A499CC189E765800E2A2E2 /* en */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
A1A499D0189E765800E2A2E2 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1A499D1189E765800E2A2E2 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
COPY_PHASE_STRIP = YES;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.9;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A1A499D3189E765800E2A2E2 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "ExampleAppMac/ExampleAppMac-Prefix.pch";
|
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
|
||||||
"$(SRCROOT)/../StreamingKit/StreamingKit",
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = "ExampleAppMac/ExampleAppMac-Info.plist";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = "";
|
|
||||||
OTHER_LDFLAGS = "-ObjC";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
WRAPPER_EXTENSION = app;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1A499D4189E765800E2A2E2 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "ExampleAppMac/ExampleAppMac-Prefix.pch";
|
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
|
||||||
"$(SRCROOT)/../StreamingKit/StreamingKit",
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = "ExampleAppMac/ExampleAppMac-Info.plist";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = "";
|
|
||||||
OTHER_LDFLAGS = "-ObjC";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
WRAPPER_EXTENSION = app;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A1A499D6189E765800E2A2E2 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ExampleAppMac.app/Contents/MacOS/ExampleAppMac";
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "ExampleAppMac/ExampleAppMac-Prefix.pch";
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = "ExampleAppMacTests/ExampleAppMacTests-Info.plist";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
TEST_HOST = "$(BUNDLE_LOADER)";
|
|
||||||
WRAPPER_EXTENSION = xctest;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1A499D7189E765800E2A2E2 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ExampleAppMac.app/Contents/MacOS/ExampleAppMac";
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "ExampleAppMac/ExampleAppMac-Prefix.pch";
|
|
||||||
INFOPLIST_FILE = "ExampleAppMacTests/ExampleAppMacTests-Info.plist";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
TEST_HOST = "$(BUNDLE_LOADER)";
|
|
||||||
WRAPPER_EXTENSION = xctest;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
A1A4999C189E765800E2A2E2 /* Build configuration list for PBXProject "ExampleAppMac" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1A499D0189E765800E2A2E2 /* Debug */,
|
|
||||||
A1A499D1189E765800E2A2E2 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A1A499D2189E765800E2A2E2 /* Build configuration list for PBXNativeTarget "ExampleAppMac" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1A499D3189E765800E2A2E2 /* Debug */,
|
|
||||||
A1A499D4189E765800E2A2E2 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A1A499D5189E765800E2A2E2 /* Build configuration list for PBXNativeTarget "ExampleAppMacTests" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1A499D6189E765800E2A2E2 /* Debug */,
|
|
||||||
A1A499D7189E765800E2A2E2 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = A1A49999189E765800E2A2E2 /* Project object */;
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "self:ExampleAppMac.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDESourceControlProjectFavoriteDictionaryKey</key>
|
|
||||||
<false/>
|
|
||||||
<key>IDESourceControlProjectIdentifier</key>
|
|
||||||
<string>B1180E29-F9F8-4232-A985-F8E21716EF14</string>
|
|
||||||
<key>IDESourceControlProjectName</key>
|
|
||||||
<string>ExampleAppMac</string>
|
|
||||||
<key>IDESourceControlProjectOriginsDictionary</key>
|
|
||||||
<dict>
|
|
||||||
<key>DD310C30-B3D0-4BD7-9565-9F29F09CC4F8</key>
|
|
||||||
<string>https://github.com/tumtumtum/StreamingKit.git</string>
|
|
||||||
</dict>
|
|
||||||
<key>IDESourceControlProjectPath</key>
|
|
||||||
<string>ExampleAppMac/ExampleAppMac.xcodeproj/project.xcworkspace</string>
|
|
||||||
<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
|
|
||||||
<dict>
|
|
||||||
<key>DD310C30-B3D0-4BD7-9565-9F29F09CC4F8</key>
|
|
||||||
<string>../../..</string>
|
|
||||||
</dict>
|
|
||||||
<key>IDESourceControlProjectURL</key>
|
|
||||||
<string>https://github.com/tumtumtum/StreamingKit.git</string>
|
|
||||||
<key>IDESourceControlProjectVersion</key>
|
|
||||||
<integer>110</integer>
|
|
||||||
<key>IDESourceControlProjectWCCIdentifier</key>
|
|
||||||
<string>DD310C30-B3D0-4BD7-9565-9F29F09CC4F8</string>
|
|
||||||
<key>IDESourceControlProjectWCConfigurations</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
|
|
||||||
<string>public.vcs.git</string>
|
|
||||||
<key>IDESourceControlWCCIdentifierKey</key>
|
|
||||||
<string>DD310C30-B3D0-4BD7-9565-9F29F09CC4F8</string>
|
|
||||||
<key>IDESourceControlWCCName</key>
|
|
||||||
<string>StreamingKit</string>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
//
|
|
||||||
// AppDelegate.h
|
|
||||||
// ExampleAppMac
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 02/02/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
#import "STKAudioPlayer.h"
|
|
||||||
|
|
||||||
@interface AppDelegate : NSObject <NSApplicationDelegate, STKAudioPlayerDelegate>
|
|
||||||
|
|
||||||
@property (assign) IBOutlet NSWindow *window;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,129 +0,0 @@
|
||||||
//
|
|
||||||
// AppDelegate.m
|
|
||||||
// ExampleAppMac
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 02/02/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "AppDelegate.h"
|
|
||||||
#import "STKAudioPlayer.h"
|
|
||||||
|
|
||||||
@interface AppDelegate()
|
|
||||||
{
|
|
||||||
NSView* meter;
|
|
||||||
NSSlider* slider;
|
|
||||||
STKAudioPlayer* audioPlayer;
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation AppDelegate
|
|
||||||
|
|
||||||
-(void) applicationDidFinishLaunching:(NSNotification *)aNotification
|
|
||||||
{
|
|
||||||
CGRect frame = [self.window.contentView frame];
|
|
||||||
|
|
||||||
NSButton* playFromHTTPButton = [[NSButton alloc] initWithFrame:CGRectMake(10, 10, frame.size.width - 20, 100)];
|
|
||||||
|
|
||||||
[playFromHTTPButton setTitle:@"Play from HTTP"];
|
|
||||||
[playFromHTTPButton setAction:@selector(playFromHTTP)];
|
|
||||||
|
|
||||||
slider = [[NSSlider alloc] initWithFrame:CGRectMake(10, 140, frame.size.width - 20, 20)];
|
|
||||||
[slider setAction:@selector(sliderChanged:)];
|
|
||||||
|
|
||||||
meter = [[NSView alloc] initWithFrame:CGRectMake(10, 200, 0, 20)];
|
|
||||||
[meter setLayer:[CALayer new]];
|
|
||||||
[meter setWantsLayer:YES];
|
|
||||||
meter.layer.backgroundColor = [NSColor greenColor].CGColor;
|
|
||||||
|
|
||||||
[[self.window contentView] addSubview:slider];
|
|
||||||
[[self.window contentView] addSubview:playFromHTTPButton];
|
|
||||||
[[self.window contentView] addSubview:meter];
|
|
||||||
|
|
||||||
audioPlayer = [[STKAudioPlayer alloc] initWithOptions:(STKAudioPlayerOptions){ .enableVolumeMixer = NO, .equalizerBandFrequencies = {50, 100, 200, 400, 800, 1600, 2600, 16000} } ];
|
|
||||||
audioPlayer.delegate = self;
|
|
||||||
audioPlayer.meteringEnabled = YES;
|
|
||||||
audioPlayer.volume = 0.1;
|
|
||||||
|
|
||||||
[self performSelector:@selector(test) withObject:nil afterDelay:4];
|
|
||||||
[self performSelector:@selector(test) withObject:nil afterDelay:8];
|
|
||||||
|
|
||||||
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(tick:) userInfo:nil repeats:YES];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) test
|
|
||||||
{
|
|
||||||
audioPlayer.equalizerEnabled = !audioPlayer.equalizerEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) playFromHTTP
|
|
||||||
{
|
|
||||||
[audioPlayer play:@"http://www.abstractpath.com/files/audiosamples/sample.mp3"];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) tick:(NSTimer*)timer
|
|
||||||
{
|
|
||||||
if (!audioPlayer)
|
|
||||||
{
|
|
||||||
slider.doubleValue = 0;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CGFloat meterWidth = 0;
|
|
||||||
|
|
||||||
if (audioPlayer.currentlyPlayingQueueItemId != nil)
|
|
||||||
{
|
|
||||||
slider.minValue = 0;
|
|
||||||
slider.maxValue = audioPlayer.duration;
|
|
||||||
slider.doubleValue = audioPlayer.progress;
|
|
||||||
|
|
||||||
meterWidth = [self.window.contentView frame].size.width - 20;
|
|
||||||
meterWidth *= (([audioPlayer averagePowerInDecibelsForChannel:0] + 60) / 60);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
slider.doubleValue = 0;
|
|
||||||
slider.minValue = 0;
|
|
||||||
slider.maxValue = 0;
|
|
||||||
|
|
||||||
meterWidth = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
CGRect frame = meter.frame;
|
|
||||||
|
|
||||||
frame.size.width = meterWidth;
|
|
||||||
|
|
||||||
meter.frame = frame;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) sliderChanged:(NSSlider*)sliderIn
|
|
||||||
{
|
|
||||||
[audioPlayer seekToTime:sliderIn.doubleValue];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) updateControls
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didStartPlayingQueueItemId:(NSObject*)queueItemId
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didFinishBufferingSourceWithQueueItemId:(NSObject*)queueItemId
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer stateChanged:(STKAudioPlayerState)state previousState:(STKAudioPlayerState)previousState
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didFinishPlayingQueueItemId:(NSObject*)queueItemId withReason:(STKAudioPlayerStopReason)stopReason andProgress:(double)progress andDuration:(double)duration
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer unexpectedError:(STKAudioPlayerErrorCode)errorCode
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,467 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4439" systemVersion="13A451" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
|
||||||
<dependencies>
|
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4439"/>
|
|
||||||
</dependencies>
|
|
||||||
<objects>
|
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
|
||||||
<connections>
|
|
||||||
<action selector="orderFrontStandardAboutPanel:" destination="58" id="142"/>
|
|
||||||
<outlet property="delegate" destination="494" id="495"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder">
|
|
||||||
<connections>
|
|
||||||
<action selector="alignCenter:" destination="499" id="518"/>
|
|
||||||
<action selector="alignJustified:" destination="500" id="523"/>
|
|
||||||
<action selector="alignLeft:" destination="498" id="524"/>
|
|
||||||
<action selector="alignRight:" destination="501" id="521"/>
|
|
||||||
<action selector="arrangeInFront:" destination="5" id="39"/>
|
|
||||||
<action selector="capitalizeWord:" destination="466" id="467"/>
|
|
||||||
<action selector="centerSelectionInVisibleArea:" destination="210" id="245"/>
|
|
||||||
<action selector="checkSpelling:" destination="201" id="225"/>
|
|
||||||
<action selector="clearRecentDocuments:" destination="126" id="127"/>
|
|
||||||
<action selector="copy:" destination="197" id="224"/>
|
|
||||||
<action selector="copyFont:" destination="403" id="428"/>
|
|
||||||
<action selector="copyRuler:" destination="506" id="522"/>
|
|
||||||
<action selector="cut:" destination="199" id="228"/>
|
|
||||||
<action selector="delete:" destination="202" id="235"/>
|
|
||||||
<action selector="hide:" destination="134" id="367"/>
|
|
||||||
<action selector="hideOtherApplications:" destination="145" id="368"/>
|
|
||||||
<action selector="loosenKerning:" destination="419" id="435"/>
|
|
||||||
<action selector="lowerBaseline:" destination="410" id="427"/>
|
|
||||||
<action selector="lowercaseWord:" destination="465" id="468"/>
|
|
||||||
<action selector="makeBaseWritingDirectionLeftToRight:" destination="511" id="526"/>
|
|
||||||
<action selector="makeBaseWritingDirectionNatural:" destination="510" id="525"/>
|
|
||||||
<action selector="makeBaseWritingDirectionRightToLeft:" destination="512" id="527"/>
|
|
||||||
<action selector="makeTextWritingDirectionLeftToRight:" destination="516" id="529"/>
|
|
||||||
<action selector="makeTextWritingDirectionNatural:" destination="515" id="528"/>
|
|
||||||
<action selector="makeTextWritingDirectionRightToLeft:" destination="517" id="530"/>
|
|
||||||
<action selector="newDocument:" destination="82" id="373"/>
|
|
||||||
<action selector="openDocument:" destination="72" id="374"/>
|
|
||||||
<action selector="orderFrontColorPanel:" destination="401" id="433"/>
|
|
||||||
<action selector="orderFrontSubstitutionsPanel:" destination="457" id="458"/>
|
|
||||||
<action selector="paste:" destination="203" id="226"/>
|
|
||||||
<action selector="pasteAsPlainText:" destination="485" id="486"/>
|
|
||||||
<action selector="pasteFont:" destination="404" id="436"/>
|
|
||||||
<action selector="pasteRuler:" destination="507" id="519"/>
|
|
||||||
<action selector="performClose:" destination="73" id="193"/>
|
|
||||||
<action selector="performFindPanelAction:" destination="209" id="241"/>
|
|
||||||
<action selector="performFindPanelAction:" destination="208" id="487"/>
|
|
||||||
<action selector="performFindPanelAction:" destination="213" id="488"/>
|
|
||||||
<action selector="performFindPanelAction:" destination="221" id="489"/>
|
|
||||||
<action selector="performFindPanelAction:" destination="534" id="535"/>
|
|
||||||
<action selector="performMiniaturize:" destination="23" id="37"/>
|
|
||||||
<action selector="performZoom:" destination="239" id="240"/>
|
|
||||||
<action selector="print:" destination="78" id="86"/>
|
|
||||||
<action selector="raiseBaseline:" destination="409" id="426"/>
|
|
||||||
<action selector="redo:" destination="215" id="231"/>
|
|
||||||
<action selector="revertDocumentToSaved:" destination="112" id="364"/>
|
|
||||||
<action selector="runPageLayout:" destination="77" id="87"/>
|
|
||||||
<action selector="runToolbarCustomizationPalette:" destination="298" id="365"/>
|
|
||||||
<action selector="saveDocument:" destination="75" id="362"/>
|
|
||||||
<action selector="selectAll:" destination="198" id="232"/>
|
|
||||||
<action selector="showGuessPanel:" destination="204" id="230"/>
|
|
||||||
<action selector="showHelp:" destination="492" id="493"/>
|
|
||||||
<action selector="startSpeaking:" destination="196" id="233"/>
|
|
||||||
<action selector="stopSpeaking:" destination="195" id="227"/>
|
|
||||||
<action selector="subscript:" destination="408" id="429"/>
|
|
||||||
<action selector="superscript:" destination="407" id="430"/>
|
|
||||||
<action selector="tightenKerning:" destination="418" id="431"/>
|
|
||||||
<action selector="toggleAutomaticDashSubstitution:" destination="460" id="461"/>
|
|
||||||
<action selector="toggleAutomaticLinkDetection:" destination="354" id="357"/>
|
|
||||||
<action selector="toggleAutomaticQuoteSubstitution:" destination="351" id="356"/>
|
|
||||||
<action selector="toggleAutomaticSpellingCorrection:" destination="454" id="456"/>
|
|
||||||
<action selector="toggleAutomaticTextReplacement:" destination="462" id="463"/>
|
|
||||||
<action selector="toggleContinuousSpellChecking:" destination="219" id="222"/>
|
|
||||||
<action selector="toggleGrammarChecking:" destination="346" id="347"/>
|
|
||||||
<action selector="toggleRuler:" destination="505" id="520"/>
|
|
||||||
<action selector="toggleSmartInsertDelete:" destination="350" id="355"/>
|
|
||||||
<action selector="toggleToolbarShown:" destination="297" id="366"/>
|
|
||||||
<action selector="turnOffKerning:" destination="417" id="441"/>
|
|
||||||
<action selector="turnOffLigatures:" destination="413" id="440"/>
|
|
||||||
<action selector="underline:" destination="392" id="432"/>
|
|
||||||
<action selector="undo:" destination="207" id="223"/>
|
|
||||||
<action selector="unhideAllApplications:" destination="150" id="370"/>
|
|
||||||
<action selector="unscript:" destination="406" id="437"/>
|
|
||||||
<action selector="uppercaseWord:" destination="452" id="464"/>
|
|
||||||
<action selector="useAllLigatures:" destination="414" id="434"/>
|
|
||||||
<action selector="useStandardKerning:" destination="416" id="438"/>
|
|
||||||
<action selector="useStandardLigatures:" destination="412" id="439"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<customObject id="-3" userLabel="Application">
|
|
||||||
<connections>
|
|
||||||
<action selector="terminate:" destination="136" id="449"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<menu title="AMainMenu" systemMenu="main" id="29">
|
|
||||||
<items>
|
|
||||||
<menuItem title="ExampleAppMac" id="56">
|
|
||||||
<menu key="submenu" title="ExampleAppMac" systemMenu="apple" id="57">
|
|
||||||
<items>
|
|
||||||
<menuItem title="About ExampleAppMac" id="58">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="236">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Preferences…" keyEquivalent="," id="129"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="143">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Services" id="131">
|
|
||||||
<menu key="submenu" title="Services" systemMenu="services" id="130"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="144">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Hide ExampleAppMac" keyEquivalent="h" id="134"/>
|
|
||||||
<menuItem title="Hide Others" keyEquivalent="h" id="145">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Show All" id="150"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="149">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Quit ExampleAppMac" keyEquivalent="q" id="136"/>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="File" id="83">
|
|
||||||
<menu key="submenu" title="File" id="81">
|
|
||||||
<items>
|
|
||||||
<menuItem title="New" keyEquivalent="n" id="82"/>
|
|
||||||
<menuItem title="Open…" keyEquivalent="o" id="72"/>
|
|
||||||
<menuItem title="Open Recent" id="124">
|
|
||||||
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="125">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Clear Menu" id="126"/>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="79">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Close" keyEquivalent="w" id="73"/>
|
|
||||||
<menuItem title="Save…" keyEquivalent="s" id="75"/>
|
|
||||||
<menuItem title="Revert to Saved" id="112">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="74">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Page Setup..." keyEquivalent="P" id="77">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Print…" keyEquivalent="p" id="78"/>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Edit" id="217">
|
|
||||||
<menu key="submenu" title="Edit" id="205">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Undo" keyEquivalent="z" id="207"/>
|
|
||||||
<menuItem title="Redo" keyEquivalent="Z" id="215">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="206">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Cut" keyEquivalent="x" id="199"/>
|
|
||||||
<menuItem title="Copy" keyEquivalent="c" id="197"/>
|
|
||||||
<menuItem title="Paste" keyEquivalent="v" id="203"/>
|
|
||||||
<menuItem title="Paste and Match Style" keyEquivalent="V" id="485">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Delete" id="202"/>
|
|
||||||
<menuItem title="Select All" keyEquivalent="a" id="198"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="214">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Find" id="218">
|
|
||||||
<menu key="submenu" title="Find" id="220">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Find…" tag="1" keyEquivalent="f" id="209"/>
|
|
||||||
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="534">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="208"/>
|
|
||||||
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="213">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="221"/>
|
|
||||||
<menuItem title="Jump to Selection" keyEquivalent="j" id="210"/>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Spelling and Grammar" id="216">
|
|
||||||
<menu key="submenu" title="Spelling and Grammar" id="200">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="204"/>
|
|
||||||
<menuItem title="Check Document Now" keyEquivalent=";" id="201"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="453"/>
|
|
||||||
<menuItem title="Check Spelling While Typing" id="219"/>
|
|
||||||
<menuItem title="Check Grammar With Spelling" id="346"/>
|
|
||||||
<menuItem title="Correct Spelling Automatically" id="454">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Substitutions" id="348">
|
|
||||||
<menu key="submenu" title="Substitutions" id="349">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Show Substitutions" id="457">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="459"/>
|
|
||||||
<menuItem title="Smart Copy/Paste" tag="1" keyEquivalent="f" id="350"/>
|
|
||||||
<menuItem title="Smart Quotes" tag="2" keyEquivalent="g" id="351"/>
|
|
||||||
<menuItem title="Smart Dashes" id="460">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Smart Links" tag="3" keyEquivalent="G" id="354">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Text Replacement" id="462">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Transformations" id="450">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Transformations" id="451">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Make Upper Case" id="452">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Make Lower Case" id="465">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Capitalize" id="466">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Speech" id="211">
|
|
||||||
<menu key="submenu" title="Speech" id="212">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Start Speaking" id="196"/>
|
|
||||||
<menuItem title="Stop Speaking" id="195"/>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Format" id="375">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Format" id="376">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Font" id="377">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Font" systemMenu="font" id="388">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Show Fonts" keyEquivalent="t" id="389"/>
|
|
||||||
<menuItem title="Bold" tag="2" keyEquivalent="b" id="390"/>
|
|
||||||
<menuItem title="Italic" tag="1" keyEquivalent="i" id="391"/>
|
|
||||||
<menuItem title="Underline" keyEquivalent="u" id="392"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="393"/>
|
|
||||||
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="394"/>
|
|
||||||
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="395"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="396"/>
|
|
||||||
<menuItem title="Kern" id="397">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Kern" id="415">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Use Default" id="416">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Use None" id="417">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Tighten" id="418">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Loosen" id="419">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Ligatures" id="398">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Ligatures" id="411">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Use Default" id="412">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Use None" id="413">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Use All" id="414">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Baseline" id="399">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Baseline" id="405">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Use Default" id="406">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Superscript" id="407">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Subscript" id="408">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Raise" id="409">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Lower" id="410">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="400"/>
|
|
||||||
<menuItem title="Show Colors" keyEquivalent="C" id="401"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="402"/>
|
|
||||||
<menuItem title="Copy Style" keyEquivalent="c" id="403">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Paste Style" keyEquivalent="v" id="404">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Text" id="496">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Text" id="497">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Align Left" keyEquivalent="{" id="498"/>
|
|
||||||
<menuItem title="Center" keyEquivalent="|" id="499"/>
|
|
||||||
<menuItem title="Justify" id="500">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Align Right" keyEquivalent="}" id="501"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="502"/>
|
|
||||||
<menuItem title="Writing Direction" id="503">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Writing Direction" id="508">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Paragraph" enabled="NO" id="509">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem id="510">
|
|
||||||
<string key="title"> Default</string>
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem id="511">
|
|
||||||
<string key="title"> Left to Right</string>
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem id="512">
|
|
||||||
<string key="title"> Right to Left</string>
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="513"/>
|
|
||||||
<menuItem title="Selection" enabled="NO" id="514">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem id="515">
|
|
||||||
<string key="title"> Default</string>
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem id="516">
|
|
||||||
<string key="title"> Left to Right</string>
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem id="517">
|
|
||||||
<string key="title"> Right to Left</string>
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem isSeparatorItem="YES" id="504"/>
|
|
||||||
<menuItem title="Show Ruler" id="505">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Copy Ruler" keyEquivalent="c" id="506">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Paste Ruler" keyEquivalent="v" id="507">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="View" id="295">
|
|
||||||
<menu key="submenu" title="View" id="296">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Show Toolbar" keyEquivalent="t" id="297">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Customize Toolbar…" id="298"/>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Window" id="19">
|
|
||||||
<menu key="submenu" title="Window" systemMenu="window" id="24">
|
|
||||||
<items>
|
|
||||||
<menuItem title="Minimize" keyEquivalent="m" id="23"/>
|
|
||||||
<menuItem title="Zoom" id="239"/>
|
|
||||||
<menuItem isSeparatorItem="YES" id="92">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Bring All to Front" id="5"/>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
<menuItem title="Help" id="490">
|
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
|
||||||
<menu key="submenu" title="Help" systemMenu="help" id="491">
|
|
||||||
<items>
|
|
||||||
<menuItem title="ExampleAppMac Help" keyEquivalent="?" id="492"/>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
</menuItem>
|
|
||||||
</items>
|
|
||||||
</menu>
|
|
||||||
<window title="ExampleAppMac" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="371">
|
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
|
||||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
|
||||||
<rect key="contentRect" x="335" y="390" width="480" height="360"/>
|
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1418"/>
|
|
||||||
<view key="contentView" id="372">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
</view>
|
|
||||||
</window>
|
|
||||||
<customObject id="494" customClass="AppDelegate">
|
|
||||||
<connections>
|
|
||||||
<outlet property="window" destination="371" id="532"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<customObject id="420" customClass="NSFontManager">
|
|
||||||
<connections>
|
|
||||||
<action selector="addFontTrait:" destination="390" id="421"/>
|
|
||||||
<action selector="addFontTrait:" destination="391" id="422"/>
|
|
||||||
<action selector="modifyFont:" destination="395" id="423"/>
|
|
||||||
<action selector="modifyFont:" destination="394" id="425"/>
|
|
||||||
<action selector="orderFrontFontPanel:" destination="389" id="424"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
</objects>
|
|
||||||
</document>
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>en</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string></string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>com.abstractpath.${PRODUCT_NAME:rfc1034identifier}</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>${PRODUCT_NAME}</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1</string>
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
|
|
||||||
<key>NSHumanReadableCopyright</key>
|
|
||||||
<string>Copyright © 2014 Thong Nguyen. All rights reserved.</string>
|
|
||||||
<key>NSMainNibFile</key>
|
|
||||||
<string>MainMenu</string>
|
|
||||||
<key>NSPrincipalClass</key>
|
|
||||||
<string>NSApplication</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
//
|
|
||||||
// Prefix header
|
|
||||||
//
|
|
||||||
// The contents of this file are implicitly included at the beginning of every source file.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifdef __OBJC__
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "16x16",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "16x16",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "32x32",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "32x32",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "128x128",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "128x128",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "256x256",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "256x256",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "512x512",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "mac",
|
|
||||||
"size" : "512x512",
|
|
||||||
"scale" : "2x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
|
|
||||||
{\colortbl;\red255\green255\blue255;}
|
|
||||||
\paperw9840\paperh8400
|
|
||||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
|
|
||||||
|
|
||||||
\f0\b\fs24 \cf0 Engineering:
|
|
||||||
\b0 \
|
|
||||||
Some people\
|
|
||||||
\
|
|
||||||
|
|
||||||
\b Human Interface Design:
|
|
||||||
\b0 \
|
|
||||||
Some other people\
|
|
||||||
\
|
|
||||||
|
|
||||||
\b Testing:
|
|
||||||
\b0 \
|
|
||||||
Hopefully not nobody\
|
|
||||||
\
|
|
||||||
|
|
||||||
\b Documentation:
|
|
||||||
\b0 \
|
|
||||||
Whoever\
|
|
||||||
\
|
|
||||||
|
|
||||||
\b With special thanks to:
|
|
||||||
\b0 \
|
|
||||||
Mom\
|
|
||||||
}
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
/* Localized versions of Info.plist keys */
|
|
||||||
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
//
|
|
||||||
// main.m
|
|
||||||
// ExampleAppMac
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 02/02/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
|
|
||||||
int main(int argc, const char * argv[])
|
|
||||||
{
|
|
||||||
return NSApplicationMain(argc, argv);
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>en</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>com.abstractpath.${PRODUCT_NAME:rfc1034identifier}</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>BNDL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
//
|
|
||||||
// ExampleAppMacTests.m
|
|
||||||
// ExampleAppMacTests
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 02/02/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <XCTest/XCTest.h>
|
|
||||||
|
|
||||||
@interface ExampleAppMacTests : XCTestCase
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation ExampleAppMacTests
|
|
||||||
|
|
||||||
- (void)setUp
|
|
||||||
{
|
|
||||||
[super setUp];
|
|
||||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)tearDown
|
|
||||||
{
|
|
||||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
||||||
[super tearDown];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testExample
|
|
||||||
{
|
|
||||||
XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
/* Localized versions of Info.plist keys */
|
|
||||||
|
|
||||||
32
LICENSE
|
|
@ -1,32 +0,0 @@
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Inspired by Matt Gallagher's AudioStreamer:
|
|
||||||
https://github.com/mattgallagher/AudioStreamer
|
|
||||||
|
|
||||||
Copyright (c) 2015 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen.
|
|
||||||
4. Neither the name of the <organization> nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THONG NGUYEN ''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 <COPYRIGHT HOLDER> 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.
|
|
||||||
66
README.md
|
|
@ -1,66 +0,0 @@
|
||||||
## StreamingKit
|
|
||||||
|
|
||||||
StreamingKit (formally Audjustable) is an audio playback and streaming library for iOS and Mac OSX. StreamingKit uses CoreAudio to decompress and playback audio (using hardware or software codecs) whilst providing a clean and simple object-oriented API.
|
|
||||||
|
|
||||||
The primary motivation of this project was to decouple the input data sources from the actual player logic in order to allow advanced customizable input handling such as HTTP progressive download based streaming, encryption/decryption, auto-recovery, dynamic-buffering. StreamingKit is the only streaming and playback library that supports dead-easy [gapless playback](https://github.com/tumtumtum/StreamingKit/wiki/Gapless-playback) between audio files of differing formats.
|
|
||||||
|
|
||||||
## Main Features
|
|
||||||
|
|
||||||
* Free OSS.
|
|
||||||
* Simple API.
|
|
||||||
* Easy to read source.
|
|
||||||
* Carefully multi-threaded to provide a responsive API that won't block your UI thread nor starve the audio buffers.
|
|
||||||
* Buffered and gapless playback between all format types.
|
|
||||||
* Easy to implement audio data sources (Local, HTTP, AutoRecoveringHTTP DataSources are provided).
|
|
||||||
* Easy to extend DataSource to support adaptive buffering, encryption, etc.
|
|
||||||
* Optimised for low CPU/battery usage (0% - 1% CPU usage when streaming).
|
|
||||||
* Optimised for linear data sources. Random access sources are required only for seeking.
|
|
||||||
* StreamingKit 0.2.0 uses the AudioUnit API rather than the slower AudioQueues API which allows real-time interception of the raw PCM data for features such as level metering, EQ, etc.
|
|
||||||
* Power metering
|
|
||||||
* Inbuilt equalizer/EQ (iOS 5.0 and above, OSX 10.9 Mavericks and above) with support for dynamically changing/enabling/disabling EQ while playing.
|
|
||||||
* Example apps for iOS and Mac OSX provided.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
StreamingKit is available as a [Cocoapod](http://cocoapods.org/?q=StreamingKit). You can also simply copy all the source files located inside StreamingKit/StreamingKit/* into your Xcode project.
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
There are two main classes. The `STKDataSource` class which is the abstract base class for the various compressed audio data sources. The `STKAudioPlayer` class manages and renders audio from a queue DataSources. By default `STKAudioPlayer` will automatically parse URLs and create the appropriate data source internally.
|
|
||||||
|
|
||||||
### Play an MP3 over HTTP
|
|
||||||
|
|
||||||
|
|
||||||
```objective-c
|
|
||||||
STKAudioPlayer* audioPlayer = [[STKAudioPlayer alloc] init];
|
|
||||||
|
|
||||||
[audioPlayer play:@"http://www.abstractpath.com/files/audiosamples/sample.mp3"];
|
|
||||||
```
|
|
||||||
|
|
||||||
### Gapless playback
|
|
||||||
|
|
||||||
```objective-c
|
|
||||||
STKAudioPlayer* audioPlayer = [[STKAudioPlayer alloc] init];
|
|
||||||
|
|
||||||
[audioPlayer queue:@"http://www.abstractpath.com/files/audiosamples/sample.mp3"];
|
|
||||||
[audioPlayer queue:@"http://www.abstractpath.com/files/audiosamples/airplane.aac"];
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Intercept PCM data just before its played
|
|
||||||
|
|
||||||
```objective-c
|
|
||||||
[audioPlayer appendFrameFilterWithName:@"MyCustomFilter" block:^(UInt32 channelsPerFrame, UInt32 bytesPerFrame, UInt32 frameCount, void* frames)
|
|
||||||
{
|
|
||||||
...
|
|
||||||
}];
|
|
||||||
````
|
|
||||||
|
|
||||||
|
|
||||||
## More
|
|
||||||
|
|
||||||
More documentation is available on the project [Wiki](https://github.com/tumtumtum/StreamingKit/wiki/_pages)
|
|
||||||
|
|
||||||
### Authors and Contributors
|
|
||||||
Copyright (c) 2012-2014, Thong Nguyen ([@tumtumtum](http://www.twitter.com/tumtumtum))
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
Pod::Spec.new do |s|
|
|
||||||
s.name = "StreamingKit"
|
|
||||||
s.version = "0.0.0"
|
|
||||||
s.summary = "A fast and extensible audio streamer for iOS and OSX with support for gapless playback and custom (non-HTTP) sources."
|
|
||||||
s.homepage = "https://github.com/tumtumtum/StreamingKit/"
|
|
||||||
s.license = 'MIT'
|
|
||||||
s.author = { "Thong Nguyen" => "tumtumtum@gmail.com" }
|
|
||||||
s.source = { :git => "https://github.com/tumtumtum/StreamingKit.git" }
|
|
||||||
s.platform = :ios
|
|
||||||
s.requires_arc = true
|
|
||||||
s.source_files = 'StreamingKit/StreamingKit/*.{h,m}'
|
|
||||||
s.ios.deployment_target = '4.3'
|
|
||||||
s.ios.frameworks = 'SystemConfiguration', 'CFNetwork', 'CoreFoundation', 'AudioToolbox'
|
|
||||||
s.osx.deployment_target = '10.7'
|
|
||||||
s.osx.frameworks = 'SystemConfiguration', 'CFNetwork', 'CoreFoundation', 'AudioToolbox', 'AudioUnit'
|
|
||||||
end
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
Pod::Spec.new do |s|
|
|
||||||
s.name = "StreamingKit"
|
|
||||||
s.version = "0.1.29"
|
|
||||||
s.summary = "A fast and extensible audio streamer for iOS and OSX with support for gapless playback and custom (non-HTTP) sources."
|
|
||||||
s.homepage = "https://github.com/tumtumtum/StreamingKit/"
|
|
||||||
s.license = 'MIT'
|
|
||||||
s.author = { "Thong Nguyen" => "tumtumtum@gmail.com" }
|
|
||||||
s.source = { :git => "https://github.com/tumtumtum/StreamingKit.git", :tag => s.version.to_s}
|
|
||||||
s.platform = :ios
|
|
||||||
s.requires_arc = true
|
|
||||||
s.source_files = 'StreamingKit/StreamingKit/*.{h,m}'
|
|
||||||
s.ios.deployment_target = '4.3'
|
|
||||||
s.ios.frameworks = 'SystemConfiguration', 'CFNetwork', 'CoreFoundation', 'AudioToolbox'
|
|
||||||
s.osx.deployment_target = '10.7'
|
|
||||||
s.osx.frameworks = 'SystemConfiguration', 'CFNetwork', 'CoreFoundation', 'AudioToolbox', 'AudioUnit'
|
|
||||||
end
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "group:ExampleApp/ExampleApp.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
<FileRef
|
|
||||||
location = "group:StreamingKit/../ExampleAppMac/ExampleAppMac.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
<FileRef
|
|
||||||
location = "group:StreamingKit/StreamingKit.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDESourceControlProjectFavoriteDictionaryKey</key>
|
|
||||||
<false/>
|
|
||||||
<key>IDESourceControlProjectIdentifier</key>
|
|
||||||
<string>64C9BE2D-7DAD-476A-B9AC-1C4603CD4124</string>
|
|
||||||
<key>IDESourceControlProjectName</key>
|
|
||||||
<string>StreamingKit</string>
|
|
||||||
<key>IDESourceControlProjectOriginsDictionary</key>
|
|
||||||
<dict>
|
|
||||||
<key>3E9414865BAE5433092B9D136FFC1F054EA505C2</key>
|
|
||||||
<string>https://github.com/tumtumtum/StreamingKit.git</string>
|
|
||||||
</dict>
|
|
||||||
<key>IDESourceControlProjectPath</key>
|
|
||||||
<string>StreamingKit.xcworkspace</string>
|
|
||||||
<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
|
|
||||||
<dict>
|
|
||||||
<key>3E9414865BAE5433092B9D136FFC1F054EA505C2</key>
|
|
||||||
<string>..</string>
|
|
||||||
</dict>
|
|
||||||
<key>IDESourceControlProjectURL</key>
|
|
||||||
<string>https://github.com/tumtumtum/StreamingKit.git</string>
|
|
||||||
<key>IDESourceControlProjectVersion</key>
|
|
||||||
<integer>111</integer>
|
|
||||||
<key>IDESourceControlProjectWCCIdentifier</key>
|
|
||||||
<string>3E9414865BAE5433092B9D136FFC1F054EA505C2</string>
|
|
||||||
<key>IDESourceControlProjectWCConfigurations</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
|
|
||||||
<string>public.vcs.git</string>
|
|
||||||
<key>IDESourceControlWCCIdentifierKey</key>
|
|
||||||
<string>3E9414865BAE5433092B9D136FFC1F054EA505C2</string>
|
|
||||||
<key>IDESourceControlWCCName</key>
|
|
||||||
<string>StreamingKit</string>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,864 +0,0 @@
|
||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 46;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
5B949CD21A1140E4005675A0 /* STKAudioPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = A1E7C4F1188D5E550010896F /* STKAudioPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
5B949CD31A1140E4005675A0 /* STKAutoRecoveringHTTPDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A1E7C4F3188D5E550010896F /* STKAutoRecoveringHTTPDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
5B949CD41A1140E4005675A0 /* STKCoreFoundationDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A1E7C4F5188D5E550010896F /* STKCoreFoundationDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
5B949CD51A1140E4005675A0 /* STKDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A1E7C4F7188D5E550010896F /* STKDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
5B949CD61A1140E4005675A0 /* STKDataSourceWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A1E7C4F9188D5E550010896F /* STKDataSourceWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
5B949CD71A1140E4005675A0 /* STKHTTPDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A1E7C4FB188D5E550010896F /* STKHTTPDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
5B949CD81A1140E4005675A0 /* STKLocalFileDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = A1E7C4FD188D5E550010896F /* STKLocalFileDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
5B949CD91A1140E4005675A0 /* STKQueueEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = A1BF65D0189A6582004DD08C /* STKQueueEntry.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
95F80F4E1C68EE2300DB24B3 /* STKFloatConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 95F80F4C1C68EE2300DB24B3 /* STKFloatConverter.h */; };
|
|
||||||
95F80F4F1C68EE2300DB24B3 /* STKFloatConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 95F80F4D1C68EE2300DB24B3 /* STKFloatConverter.m */; };
|
|
||||||
A1A4996B189E744400E2A2E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A4996A189E744400E2A2E2 /* Cocoa.framework */; };
|
|
||||||
A1A49975189E744500E2A2E2 /* StreamingKitMac.m in Sources */ = {isa = PBXBuildFile; fileRef = A1A49974189E744500E2A2E2 /* StreamingKitMac.m */; };
|
|
||||||
A1A4997B189E744500E2A2E2 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E7C4D9188D57F60010896F /* XCTest.framework */; };
|
|
||||||
A1A4997C189E744500E2A2E2 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A4996A189E744400E2A2E2 /* Cocoa.framework */; };
|
|
||||||
A1A4997F189E744500E2A2E2 /* libStreamingKitMac.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A49969189E744400E2A2E2 /* libStreamingKitMac.a */; };
|
|
||||||
A1A49985189E744500E2A2E2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A1A49983189E744500E2A2E2 /* InfoPlist.strings */; };
|
|
||||||
A1A49987189E744500E2A2E2 /* StreamingKitMacTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A1A49986189E744500E2A2E2 /* StreamingKitMacTests.m */; };
|
|
||||||
A1A4998E189E745900E2A2E2 /* STKAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4F2188D5E550010896F /* STKAudioPlayer.m */; };
|
|
||||||
A1A4998F189E745C00E2A2E2 /* STKAutoRecoveringHTTPDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4F4188D5E550010896F /* STKAutoRecoveringHTTPDataSource.m */; };
|
|
||||||
A1A49991189E746000E2A2E2 /* STKCoreFoundationDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4F6188D5E550010896F /* STKCoreFoundationDataSource.m */; };
|
|
||||||
A1A49992189E746300E2A2E2 /* STKDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4F8188D5E550010896F /* STKDataSource.m */; };
|
|
||||||
A1A49993189E746500E2A2E2 /* STKDataSourceWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4FA188D5E550010896F /* STKDataSourceWrapper.m */; };
|
|
||||||
A1A49994189E746900E2A2E2 /* STKHTTPDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4FC188D5E550010896F /* STKHTTPDataSource.m */; };
|
|
||||||
A1A49995189E746B00E2A2E2 /* STKLocalFileDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4FE188D5E550010896F /* STKLocalFileDataSource.m */; };
|
|
||||||
A1A49996189E746E00E2A2E2 /* STKQueueEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = A1BF65D1189A6582004DD08C /* STKQueueEntry.m */; };
|
|
||||||
A1A49997189E747000E2A2E2 /* NSMutableArray+STKAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A1BF65D4189A65C6004DD08C /* NSMutableArray+STKAudioPlayer.m */; };
|
|
||||||
A1BF65D2189A6582004DD08C /* STKQueueEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = A1BF65D1189A6582004DD08C /* STKQueueEntry.m */; };
|
|
||||||
A1BF65D5189A65C6004DD08C /* NSMutableArray+STKAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A1BF65D4189A65C6004DD08C /* NSMutableArray+STKAudioPlayer.m */; };
|
|
||||||
A1E7C4DA188D57F60010896F /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E7C4D9188D57F60010896F /* XCTest.framework */; };
|
|
||||||
A1E7C4DB188D57F60010896F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E7C4CB188D57F50010896F /* Foundation.framework */; };
|
|
||||||
A1E7C4E0188D57F60010896F /* libStreamingKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A1E7C4C8188D57F50010896F /* libStreamingKit.a */; };
|
|
||||||
A1E7C4E6188D57F60010896F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A1E7C4E4188D57F60010896F /* InfoPlist.strings */; };
|
|
||||||
A1E7C4E8188D57F60010896F /* StreamingKitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4E7188D57F60010896F /* StreamingKitTests.m */; };
|
|
||||||
A1E7C4FF188D5E550010896F /* STKAudioPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4F2188D5E550010896F /* STKAudioPlayer.m */; };
|
|
||||||
A1E7C500188D5E550010896F /* STKAutoRecoveringHTTPDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4F4188D5E550010896F /* STKAutoRecoveringHTTPDataSource.m */; };
|
|
||||||
A1E7C501188D5E550010896F /* STKCoreFoundationDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4F6188D5E550010896F /* STKCoreFoundationDataSource.m */; };
|
|
||||||
A1E7C502188D5E550010896F /* STKDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4F8188D5E550010896F /* STKDataSource.m */; };
|
|
||||||
A1E7C503188D5E550010896F /* STKDataSourceWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4FA188D5E550010896F /* STKDataSourceWrapper.m */; };
|
|
||||||
A1E7C504188D5E550010896F /* STKHTTPDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4FC188D5E550010896F /* STKHTTPDataSource.m */; };
|
|
||||||
A1E7C505188D5E550010896F /* STKLocalFileDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E7C4FE188D5E550010896F /* STKLocalFileDataSource.m */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
|
||||||
A1A4997D189E744500E2A2E2 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = A1E7C4C0188D57F50010896F /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = A1A49968189E744400E2A2E2;
|
|
||||||
remoteInfo = StreamingKitMac;
|
|
||||||
};
|
|
||||||
A1A499E6189E769A00E2A2E2 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = A1A499E1189E769A00E2A2E2 /* ExampleAppMac.xcodeproj */;
|
|
||||||
proxyType = 2;
|
|
||||||
remoteGlobalIDString = A1A499A1189E765800E2A2E2;
|
|
||||||
remoteInfo = ExampleAppMac;
|
|
||||||
};
|
|
||||||
A1A499E8189E769A00E2A2E2 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = A1A499E1189E769A00E2A2E2 /* ExampleAppMac.xcodeproj */;
|
|
||||||
proxyType = 2;
|
|
||||||
remoteGlobalIDString = A1A499C2189E765800E2A2E2;
|
|
||||||
remoteInfo = ExampleAppMacTests;
|
|
||||||
};
|
|
||||||
A1E7C4DE188D57F60010896F /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = A1E7C4C0188D57F50010896F /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = A1E7C4C7188D57F50010896F;
|
|
||||||
remoteInfo = StreamingKit;
|
|
||||||
};
|
|
||||||
/* End PBXContainerItemProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
|
||||||
A1E7C4C6188D57F50010896F /* CopyFiles */ = {
|
|
||||||
isa = PBXCopyFilesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
dstPath = "include/$(PRODUCT_NAME)";
|
|
||||||
dstSubfolderSpec = 16;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
95F80F4C1C68EE2300DB24B3 /* STKFloatConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKFloatConverter.h; sourceTree = "<group>"; };
|
|
||||||
95F80F4D1C68EE2300DB24B3 /* STKFloatConverter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKFloatConverter.m; sourceTree = "<group>"; };
|
|
||||||
A1A49969189E744400E2A2E2 /* libStreamingKitMac.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libStreamingKitMac.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A1A4996A189E744400E2A2E2 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; };
|
|
||||||
A1A4996D189E744500E2A2E2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A4996E189E744500E2A2E2 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A4996F189E744500E2A2E2 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
|
|
||||||
A1A49972189E744500E2A2E2 /* StreamingKitMac-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StreamingKitMac-Prefix.pch"; sourceTree = "<group>"; };
|
|
||||||
A1A49973189E744500E2A2E2 /* StreamingKitMac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StreamingKitMac.h; sourceTree = "<group>"; };
|
|
||||||
A1A49974189E744500E2A2E2 /* StreamingKitMac.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StreamingKitMac.m; sourceTree = "<group>"; };
|
|
||||||
A1A4997A189E744500E2A2E2 /* StreamingKitMacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StreamingKitMacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A1A49982189E744500E2A2E2 /* StreamingKitMacTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "StreamingKitMacTests-Info.plist"; sourceTree = "<group>"; };
|
|
||||||
A1A49984189E744500E2A2E2 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
A1A49986189E744500E2A2E2 /* StreamingKitMacTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StreamingKitMacTests.m; sourceTree = "<group>"; };
|
|
||||||
A1A499E1189E769A00E2A2E2 /* ExampleAppMac.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ExampleAppMac.xcodeproj; path = ../ExampleAppMac/ExampleAppMac.xcodeproj; sourceTree = "<group>"; };
|
|
||||||
A1A499F6189E79EA00E2A2E2 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
|
||||||
A1BF65D0189A6582004DD08C /* STKQueueEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKQueueEntry.h; sourceTree = "<group>"; };
|
|
||||||
A1BF65D1189A6582004DD08C /* STKQueueEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKQueueEntry.m; sourceTree = "<group>"; };
|
|
||||||
A1BF65D3189A65C6004DD08C /* NSMutableArray+STKAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+STKAudioPlayer.h"; sourceTree = "<group>"; };
|
|
||||||
A1BF65D4189A65C6004DD08C /* NSMutableArray+STKAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+STKAudioPlayer.m"; sourceTree = "<group>"; };
|
|
||||||
A1C9767618981BFE0057F881 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
|
|
||||||
A1E7C4C8188D57F50010896F /* libStreamingKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libStreamingKit.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A1E7C4CB188D57F50010896F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
|
||||||
A1E7C4CF188D57F50010896F /* StreamingKit-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StreamingKit-Prefix.pch"; sourceTree = "<group>"; };
|
|
||||||
A1E7C4D8188D57F60010896F /* StreamingKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StreamingKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A1E7C4D9188D57F60010896F /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
|
|
||||||
A1E7C4E3188D57F60010896F /* StreamingKitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "StreamingKitTests-Info.plist"; sourceTree = "<group>"; };
|
|
||||||
A1E7C4E5188D57F60010896F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
|
||||||
A1E7C4E7188D57F60010896F /* StreamingKitTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StreamingKitTests.m; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F1188D5E550010896F /* STKAudioPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKAudioPlayer.h; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F2188D5E550010896F /* STKAudioPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKAudioPlayer.m; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F3188D5E550010896F /* STKAutoRecoveringHTTPDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKAutoRecoveringHTTPDataSource.h; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F4188D5E550010896F /* STKAutoRecoveringHTTPDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKAutoRecoveringHTTPDataSource.m; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F5188D5E550010896F /* STKCoreFoundationDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKCoreFoundationDataSource.h; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F6188D5E550010896F /* STKCoreFoundationDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKCoreFoundationDataSource.m; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F7188D5E550010896F /* STKDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKDataSource.h; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F8188D5E550010896F /* STKDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKDataSource.m; sourceTree = "<group>"; };
|
|
||||||
A1E7C4F9188D5E550010896F /* STKDataSourceWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKDataSourceWrapper.h; sourceTree = "<group>"; };
|
|
||||||
A1E7C4FA188D5E550010896F /* STKDataSourceWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKDataSourceWrapper.m; sourceTree = "<group>"; };
|
|
||||||
A1E7C4FB188D5E550010896F /* STKHTTPDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKHTTPDataSource.h; sourceTree = "<group>"; };
|
|
||||||
A1E7C4FC188D5E550010896F /* STKHTTPDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKHTTPDataSource.m; sourceTree = "<group>"; };
|
|
||||||
A1E7C4FD188D5E550010896F /* STKLocalFileDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = STKLocalFileDataSource.h; sourceTree = "<group>"; };
|
|
||||||
A1E7C4FE188D5E550010896F /* STKLocalFileDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = STKLocalFileDataSource.m; sourceTree = "<group>"; };
|
|
||||||
A1E7C507188D62D20010896F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
A1A49966189E744400E2A2E2 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A4996B189E744400E2A2E2 /* Cocoa.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1A49977189E744500E2A2E2 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A4997C189E744500E2A2E2 /* Cocoa.framework in Frameworks */,
|
|
||||||
A1A4997B189E744500E2A2E2 /* XCTest.framework in Frameworks */,
|
|
||||||
A1A4997F189E744500E2A2E2 /* libStreamingKitMac.a in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1E7C4C5188D57F50010896F /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1E7C4D5188D57F60010896F /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1E7C4DA188D57F60010896F /* XCTest.framework in Frameworks */,
|
|
||||||
A1E7C4E0188D57F60010896F /* libStreamingKit.a in Frameworks */,
|
|
||||||
A1E7C4DB188D57F60010896F /* Foundation.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
A1A4996C189E744500E2A2E2 /* Other Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A4996D189E744500E2A2E2 /* Foundation.framework */,
|
|
||||||
A1A4996E189E744500E2A2E2 /* CoreData.framework */,
|
|
||||||
A1A4996F189E744500E2A2E2 /* AppKit.framework */,
|
|
||||||
);
|
|
||||||
name = "Other Frameworks";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A49970189E744500E2A2E2 /* StreamingKitMac */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A49973189E744500E2A2E2 /* StreamingKitMac.h */,
|
|
||||||
A1A49974189E744500E2A2E2 /* StreamingKitMac.m */,
|
|
||||||
A1A49971189E744500E2A2E2 /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = StreamingKitMac;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A49971189E744500E2A2E2 /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A49972189E744500E2A2E2 /* StreamingKitMac-Prefix.pch */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A49980189E744500E2A2E2 /* StreamingKitMacTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A49986189E744500E2A2E2 /* StreamingKitMacTests.m */,
|
|
||||||
A1A49981189E744500E2A2E2 /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = StreamingKitMacTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A49981189E744500E2A2E2 /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A49982189E744500E2A2E2 /* StreamingKitMacTests-Info.plist */,
|
|
||||||
A1A49983189E744500E2A2E2 /* InfoPlist.strings */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1A499E2189E769A00E2A2E2 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499E7189E769A00E2A2E2 /* ExampleAppMac.app */,
|
|
||||||
A1A499E9189E769A00E2A2E2 /* ExampleAppMacTests.xctest */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1E7C4BF188D57F50010896F = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1E7C4CD188D57F50010896F /* StreamingKit */,
|
|
||||||
A1E7C4E1188D57F60010896F /* StreamingKitTests */,
|
|
||||||
A1A49970189E744500E2A2E2 /* StreamingKitMac */,
|
|
||||||
A1A49980189E744500E2A2E2 /* StreamingKitMacTests */,
|
|
||||||
A1E7C4CA188D57F50010896F /* Frameworks */,
|
|
||||||
A1E7C4C9188D57F50010896F /* Products */,
|
|
||||||
A1A499E1189E769A00E2A2E2 /* ExampleAppMac.xcodeproj */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1E7C4C9188D57F50010896F /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1E7C4C8188D57F50010896F /* libStreamingKit.a */,
|
|
||||||
A1E7C4D8188D57F60010896F /* StreamingKitTests.xctest */,
|
|
||||||
A1A49969189E744400E2A2E2 /* libStreamingKitMac.a */,
|
|
||||||
A1A4997A189E744500E2A2E2 /* StreamingKitMacTests.xctest */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1E7C4CA188D57F50010896F /* Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1A499F6189E79EA00E2A2E2 /* AudioToolbox.framework */,
|
|
||||||
A1C9767618981BFE0057F881 /* AudioUnit.framework */,
|
|
||||||
A1E7C507188D62D20010896F /* UIKit.framework */,
|
|
||||||
A1E7C4CB188D57F50010896F /* Foundation.framework */,
|
|
||||||
A1E7C4D9188D57F60010896F /* XCTest.framework */,
|
|
||||||
A1A4996A189E744400E2A2E2 /* Cocoa.framework */,
|
|
||||||
A1A4996C189E744500E2A2E2 /* Other Frameworks */,
|
|
||||||
);
|
|
||||||
name = Frameworks;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1E7C4CD188D57F50010896F /* StreamingKit */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
95F80F4C1C68EE2300DB24B3 /* STKFloatConverter.h */,
|
|
||||||
95F80F4D1C68EE2300DB24B3 /* STKFloatConverter.m */,
|
|
||||||
A1E7C4F1188D5E550010896F /* STKAudioPlayer.h */,
|
|
||||||
A1E7C4F2188D5E550010896F /* STKAudioPlayer.m */,
|
|
||||||
A1E7C4F3188D5E550010896F /* STKAutoRecoveringHTTPDataSource.h */,
|
|
||||||
A1E7C4F4188D5E550010896F /* STKAutoRecoveringHTTPDataSource.m */,
|
|
||||||
A1E7C4F5188D5E550010896F /* STKCoreFoundationDataSource.h */,
|
|
||||||
A1E7C4F6188D5E550010896F /* STKCoreFoundationDataSource.m */,
|
|
||||||
A1E7C4F7188D5E550010896F /* STKDataSource.h */,
|
|
||||||
A1E7C4F8188D5E550010896F /* STKDataSource.m */,
|
|
||||||
A1E7C4F9188D5E550010896F /* STKDataSourceWrapper.h */,
|
|
||||||
A1E7C4FA188D5E550010896F /* STKDataSourceWrapper.m */,
|
|
||||||
A1E7C4FB188D5E550010896F /* STKHTTPDataSource.h */,
|
|
||||||
A1E7C4FC188D5E550010896F /* STKHTTPDataSource.m */,
|
|
||||||
A1E7C4FD188D5E550010896F /* STKLocalFileDataSource.h */,
|
|
||||||
A1E7C4FE188D5E550010896F /* STKLocalFileDataSource.m */,
|
|
||||||
A1BF65D0189A6582004DD08C /* STKQueueEntry.h */,
|
|
||||||
A1BF65D1189A6582004DD08C /* STKQueueEntry.m */,
|
|
||||||
A1BF65D3189A65C6004DD08C /* NSMutableArray+STKAudioPlayer.h */,
|
|
||||||
A1BF65D4189A65C6004DD08C /* NSMutableArray+STKAudioPlayer.m */,
|
|
||||||
A1E7C4CE188D57F50010896F /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = StreamingKit;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1E7C4CE188D57F50010896F /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1E7C4CF188D57F50010896F /* StreamingKit-Prefix.pch */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1E7C4E1188D57F60010896F /* StreamingKitTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1E7C4E7188D57F60010896F /* StreamingKitTests.m */,
|
|
||||||
A1E7C4E2188D57F60010896F /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = StreamingKitTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1E7C4E2188D57F60010896F /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A1E7C4E3188D57F60010896F /* StreamingKitTests-Info.plist */,
|
|
||||||
A1E7C4E4188D57F60010896F /* InfoPlist.strings */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
|
||||||
5B949CD11A1140CF005675A0 /* Headers */ = {
|
|
||||||
isa = PBXHeadersBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
5B949CD21A1140E4005675A0 /* STKAudioPlayer.h in Headers */,
|
|
||||||
5B949CD31A1140E4005675A0 /* STKAutoRecoveringHTTPDataSource.h in Headers */,
|
|
||||||
5B949CD41A1140E4005675A0 /* STKCoreFoundationDataSource.h in Headers */,
|
|
||||||
5B949CD51A1140E4005675A0 /* STKDataSource.h in Headers */,
|
|
||||||
5B949CD61A1140E4005675A0 /* STKDataSourceWrapper.h in Headers */,
|
|
||||||
95F80F4E1C68EE2300DB24B3 /* STKFloatConverter.h in Headers */,
|
|
||||||
5B949CD71A1140E4005675A0 /* STKHTTPDataSource.h in Headers */,
|
|
||||||
5B949CD81A1140E4005675A0 /* STKLocalFileDataSource.h in Headers */,
|
|
||||||
5B949CD91A1140E4005675A0 /* STKQueueEntry.h in Headers */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1A49967189E744400E2A2E2 /* Headers */ = {
|
|
||||||
isa = PBXHeadersBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXHeadersBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
A1A49968189E744400E2A2E2 /* StreamingKitMac */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A1A4998C189E744500E2A2E2 /* Build configuration list for PBXNativeTarget "StreamingKitMac" */;
|
|
||||||
buildPhases = (
|
|
||||||
A1A49965189E744400E2A2E2 /* Sources */,
|
|
||||||
A1A49966189E744400E2A2E2 /* Frameworks */,
|
|
||||||
A1A49967189E744400E2A2E2 /* Headers */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = StreamingKitMac;
|
|
||||||
productName = StreamingKitMac;
|
|
||||||
productReference = A1A49969189E744400E2A2E2 /* libStreamingKitMac.a */;
|
|
||||||
productType = "com.apple.product-type.library.static";
|
|
||||||
};
|
|
||||||
A1A49979189E744500E2A2E2 /* StreamingKitMacTests */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A1A4998D189E744500E2A2E2 /* Build configuration list for PBXNativeTarget "StreamingKitMacTests" */;
|
|
||||||
buildPhases = (
|
|
||||||
A1A49976189E744500E2A2E2 /* Sources */,
|
|
||||||
A1A49977189E744500E2A2E2 /* Frameworks */,
|
|
||||||
A1A49978189E744500E2A2E2 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
A1A4997E189E744500E2A2E2 /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = StreamingKitMacTests;
|
|
||||||
productName = StreamingKitMacTests;
|
|
||||||
productReference = A1A4997A189E744500E2A2E2 /* StreamingKitMacTests.xctest */;
|
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
|
||||||
};
|
|
||||||
A1E7C4C7188D57F50010896F /* StreamingKit */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A1E7C4EB188D57F60010896F /* Build configuration list for PBXNativeTarget "StreamingKit" */;
|
|
||||||
buildPhases = (
|
|
||||||
A1E7C4C4188D57F50010896F /* Sources */,
|
|
||||||
A1E7C4C5188D57F50010896F /* Frameworks */,
|
|
||||||
A1E7C4C6188D57F50010896F /* CopyFiles */,
|
|
||||||
5B949CD11A1140CF005675A0 /* Headers */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = StreamingKit;
|
|
||||||
productName = StreamingKit;
|
|
||||||
productReference = A1E7C4C8188D57F50010896F /* libStreamingKit.a */;
|
|
||||||
productType = "com.apple.product-type.library.static";
|
|
||||||
};
|
|
||||||
A1E7C4D7188D57F60010896F /* StreamingKitTests */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A1E7C4EE188D57F60010896F /* Build configuration list for PBXNativeTarget "StreamingKitTests" */;
|
|
||||||
buildPhases = (
|
|
||||||
A1E7C4D4188D57F60010896F /* Sources */,
|
|
||||||
A1E7C4D5188D57F60010896F /* Frameworks */,
|
|
||||||
A1E7C4D6188D57F60010896F /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
A1E7C4DF188D57F60010896F /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = StreamingKitTests;
|
|
||||||
productName = StreamingKitTests;
|
|
||||||
productReference = A1E7C4D8188D57F60010896F /* StreamingKitTests.xctest */;
|
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
A1E7C4C0188D57F50010896F /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
CLASSPREFIX = STK;
|
|
||||||
LastUpgradeCheck = 0710;
|
|
||||||
ORGANIZATIONNAME = "Thong Nguyen";
|
|
||||||
};
|
|
||||||
buildConfigurationList = A1E7C4C3188D57F50010896F /* Build configuration list for PBXProject "StreamingKit" */;
|
|
||||||
compatibilityVersion = "Xcode 3.2";
|
|
||||||
developmentRegion = English;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
);
|
|
||||||
mainGroup = A1E7C4BF188D57F50010896F;
|
|
||||||
productRefGroup = A1E7C4C9188D57F50010896F /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectReferences = (
|
|
||||||
{
|
|
||||||
ProductGroup = A1A499E2189E769A00E2A2E2 /* Products */;
|
|
||||||
ProjectRef = A1A499E1189E769A00E2A2E2 /* ExampleAppMac.xcodeproj */;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
A1E7C4C7188D57F50010896F /* StreamingKit */,
|
|
||||||
A1E7C4D7188D57F60010896F /* StreamingKitTests */,
|
|
||||||
A1A49968189E744400E2A2E2 /* StreamingKitMac */,
|
|
||||||
A1A49979189E744500E2A2E2 /* StreamingKitMacTests */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXReferenceProxy section */
|
|
||||||
A1A499E7189E769A00E2A2E2 /* ExampleAppMac.app */ = {
|
|
||||||
isa = PBXReferenceProxy;
|
|
||||||
fileType = wrapper.application;
|
|
||||||
path = ExampleAppMac.app;
|
|
||||||
remoteRef = A1A499E6189E769A00E2A2E2 /* PBXContainerItemProxy */;
|
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
|
||||||
};
|
|
||||||
A1A499E9189E769A00E2A2E2 /* ExampleAppMacTests.xctest */ = {
|
|
||||||
isa = PBXReferenceProxy;
|
|
||||||
fileType = wrapper.cfbundle;
|
|
||||||
path = ExampleAppMacTests.xctest;
|
|
||||||
remoteRef = A1A499E8189E769A00E2A2E2 /* PBXContainerItemProxy */;
|
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
|
||||||
};
|
|
||||||
/* End PBXReferenceProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
A1A49978189E744500E2A2E2 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A49985189E744500E2A2E2 /* InfoPlist.strings in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1E7C4D6188D57F60010896F /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1E7C4E6188D57F60010896F /* InfoPlist.strings in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
A1A49965189E744400E2A2E2 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A4998F189E745C00E2A2E2 /* STKAutoRecoveringHTTPDataSource.m in Sources */,
|
|
||||||
A1A49994189E746900E2A2E2 /* STKHTTPDataSource.m in Sources */,
|
|
||||||
A1A49991189E746000E2A2E2 /* STKCoreFoundationDataSource.m in Sources */,
|
|
||||||
A1A49995189E746B00E2A2E2 /* STKLocalFileDataSource.m in Sources */,
|
|
||||||
A1A49997189E747000E2A2E2 /* NSMutableArray+STKAudioPlayer.m in Sources */,
|
|
||||||
A1A4998E189E745900E2A2E2 /* STKAudioPlayer.m in Sources */,
|
|
||||||
A1A49993189E746500E2A2E2 /* STKDataSourceWrapper.m in Sources */,
|
|
||||||
A1A49992189E746300E2A2E2 /* STKDataSource.m in Sources */,
|
|
||||||
A1A49975189E744500E2A2E2 /* StreamingKitMac.m in Sources */,
|
|
||||||
A1A49996189E746E00E2A2E2 /* STKQueueEntry.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1A49976189E744500E2A2E2 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1A49987189E744500E2A2E2 /* StreamingKitMacTests.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1E7C4C4188D57F50010896F /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1E7C501188D5E550010896F /* STKCoreFoundationDataSource.m in Sources */,
|
|
||||||
A1E7C4FF188D5E550010896F /* STKAudioPlayer.m in Sources */,
|
|
||||||
A1E7C505188D5E550010896F /* STKLocalFileDataSource.m in Sources */,
|
|
||||||
A1BF65D2189A6582004DD08C /* STKQueueEntry.m in Sources */,
|
|
||||||
A1E7C504188D5E550010896F /* STKHTTPDataSource.m in Sources */,
|
|
||||||
95F80F4F1C68EE2300DB24B3 /* STKFloatConverter.m in Sources */,
|
|
||||||
A1E7C503188D5E550010896F /* STKDataSourceWrapper.m in Sources */,
|
|
||||||
A1E7C502188D5E550010896F /* STKDataSource.m in Sources */,
|
|
||||||
A1BF65D5189A65C6004DD08C /* NSMutableArray+STKAudioPlayer.m in Sources */,
|
|
||||||
A1E7C500188D5E550010896F /* STKAutoRecoveringHTTPDataSource.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A1E7C4D4188D57F60010896F /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A1E7C4E8188D57F60010896F /* StreamingKitTests.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
|
||||||
A1A4997E189E744500E2A2E2 /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = A1A49968189E744400E2A2E2 /* StreamingKitMac */;
|
|
||||||
targetProxy = A1A4997D189E744500E2A2E2 /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
A1E7C4DF188D57F60010896F /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = A1E7C4C7188D57F50010896F /* StreamingKit */;
|
|
||||||
targetProxy = A1E7C4DE188D57F60010896F /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
/* End PBXTargetDependency section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
A1A49983189E744500E2A2E2 /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A1A49984189E744500E2A2E2 /* en */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A1E7C4E4188D57F60010896F /* InfoPlist.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A1E7C4E5188D57F60010896F /* en */,
|
|
||||||
);
|
|
||||||
name = InfoPlist.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
A1A49988189E744500E2A2E2 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
);
|
|
||||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "StreamingKitMac/StreamingKitMac-Prefix.pch";
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = "";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
PUBLIC_HEADERS_FOLDER_PATH = include/StreamingKit;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1A49989189E744500E2A2E2 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
);
|
|
||||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "StreamingKitMac/StreamingKitMac-Prefix.pch";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = "";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
PUBLIC_HEADERS_FOLDER_PATH = include/StreamingKit;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A1A4998A189E744500E2A2E2 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "StreamingKitMac/StreamingKitMac-Prefix.pch";
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = "StreamingKitMacTests/StreamingKitMacTests-Info.plist";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.abstractpath.${PRODUCT_NAME:rfc1034identifier}";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SDKROOT = macosx;
|
|
||||||
WRAPPER_EXTENSION = xctest;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1A4998B189E744500E2A2E2 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "StreamingKitMac/StreamingKitMac-Prefix.pch";
|
|
||||||
INFOPLIST_FILE = "StreamingKitMacTests/StreamingKitMacTests-Info.plist";
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.abstractpath.${PRODUCT_NAME:rfc1034identifier}";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SDKROOT = macosx;
|
|
||||||
WRAPPER_EXTENSION = xctest;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A1E7C4E9188D57F60010896F /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
ENABLE_TESTABILITY = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1E7C4EA188D57F60010896F /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
COPY_PHASE_STRIP = YES;
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
VALIDATE_PRODUCT = YES;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A1E7C4EC188D57F60010896F /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
DSTROOT = /tmp/StreamingKit.dst;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
);
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "StreamingKit/StreamingKit-Prefix.pch";
|
|
||||||
OTHER_LDFLAGS = "-ObjC";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
PUBLIC_HEADERS_FOLDER_PATH = include/StreamingKit;
|
|
||||||
SKIP_INSTALL = YES;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1E7C4ED188D57F60010896F /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
DSTROOT = /tmp/StreamingKit.dst;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
);
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "StreamingKit/StreamingKit-Prefix.pch";
|
|
||||||
OTHER_LDFLAGS = "-ObjC";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
PUBLIC_HEADERS_FOLDER_PATH = include/StreamingKit;
|
|
||||||
SKIP_INSTALL = YES;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A1E7C4EF188D57F60010896F /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
|
||||||
"$(inherited)",
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
);
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "StreamingKit/StreamingKit-Prefix.pch";
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = "StreamingKitTests/StreamingKitTests-Info.plist";
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "abstractpath.com.${PRODUCT_NAME:rfc1034identifier}";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
WRAPPER_EXTENSION = xctest;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A1E7C4F0188D57F60010896F /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
FRAMEWORK_SEARCH_PATHS = (
|
|
||||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
|
||||||
"$(inherited)",
|
|
||||||
"$(DEVELOPER_FRAMEWORKS_DIR)",
|
|
||||||
);
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "StreamingKit/StreamingKit-Prefix.pch";
|
|
||||||
INFOPLIST_FILE = "StreamingKitTests/StreamingKitTests-Info.plist";
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "abstractpath.com.${PRODUCT_NAME:rfc1034identifier}";
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
WRAPPER_EXTENSION = xctest;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
A1A4998C189E744500E2A2E2 /* Build configuration list for PBXNativeTarget "StreamingKitMac" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1A49988189E744500E2A2E2 /* Debug */,
|
|
||||||
A1A49989189E744500E2A2E2 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A1A4998D189E744500E2A2E2 /* Build configuration list for PBXNativeTarget "StreamingKitMacTests" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1A4998A189E744500E2A2E2 /* Debug */,
|
|
||||||
A1A4998B189E744500E2A2E2 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A1E7C4C3188D57F50010896F /* Build configuration list for PBXProject "StreamingKit" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1E7C4E9188D57F60010896F /* Debug */,
|
|
||||||
A1E7C4EA188D57F60010896F /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A1E7C4EB188D57F60010896F /* Build configuration list for PBXNativeTarget "StreamingKit" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1E7C4EC188D57F60010896F /* Debug */,
|
|
||||||
A1E7C4ED188D57F60010896F /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A1E7C4EE188D57F60010896F /* Build configuration list for PBXNativeTarget "StreamingKitTests" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A1E7C4EF188D57F60010896F /* Debug */,
|
|
||||||
A1E7C4F0188D57F60010896F /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = A1E7C4C0188D57F50010896F /* Project object */;
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "self:">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
//
|
|
||||||
// NSMutableArray+STKAudioPlayer.h
|
|
||||||
// StreamingKit
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 30/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@interface NSMutableArray (STKAudioPlayer)
|
|
||||||
-(void) enqueue:(id)obj;
|
|
||||||
-(void) skipQueue:(id)obj;
|
|
||||||
-(void) skipQueueWithQueue:(NSMutableArray*)queue;
|
|
||||||
-(nullable id) dequeue;
|
|
||||||
-(nullable id) peek;
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
//
|
|
||||||
// NSMutableArray+STKAudioPlayer.m
|
|
||||||
// StreamingKit
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 30/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "NSMutableArray+STKAudioPlayer.h"
|
|
||||||
|
|
||||||
@implementation NSMutableArray (STKAudioPlayer)
|
|
||||||
|
|
||||||
-(void) enqueue:(id)obj
|
|
||||||
{
|
|
||||||
[self insertObject:obj atIndex:0];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) skipQueue:(id)obj
|
|
||||||
{
|
|
||||||
[self addObject:obj];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) skipQueueWithQueue:(NSMutableArray*)queue
|
|
||||||
{
|
|
||||||
for (id item in queue)
|
|
||||||
{
|
|
||||||
[self addObject:item];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(id) dequeue
|
|
||||||
{
|
|
||||||
if ([self count] == 0)
|
|
||||||
{
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
id retval = [self lastObject];
|
|
||||||
|
|
||||||
[self removeLastObject];
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(id) peek
|
|
||||||
{
|
|
||||||
return [self lastObject];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,276 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/StreamingKit
|
|
||||||
|
|
||||||
Inspired by Matt Gallagher's AudioStreamer:
|
|
||||||
https://github.com/mattgallagher/AudioStreamer
|
|
||||||
|
|
||||||
Copyright (c) 2012-2014 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen''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 <COPYRIGHT HOLDER> 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
#import <pthread.h>
|
|
||||||
#import "STKDataSource.h"
|
|
||||||
#import <AudioToolbox/AudioToolbox.h>
|
|
||||||
|
|
||||||
#if TARGET_OS_IPHONE
|
|
||||||
#include "UIKit/UIApplication.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
typedef NS_OPTIONS(NSInteger, STKAudioPlayerState)
|
|
||||||
{
|
|
||||||
STKAudioPlayerStateReady,
|
|
||||||
STKAudioPlayerStateRunning = 1,
|
|
||||||
STKAudioPlayerStatePlaying = (1 << 1) | STKAudioPlayerStateRunning,
|
|
||||||
STKAudioPlayerStateBuffering = (1 << 2) | STKAudioPlayerStateRunning,
|
|
||||||
STKAudioPlayerStatePaused = (1 << 3) | STKAudioPlayerStateRunning,
|
|
||||||
STKAudioPlayerStateStopped = (1 << 4),
|
|
||||||
STKAudioPlayerStateError = (1 << 5),
|
|
||||||
STKAudioPlayerStateDisposed = (1 << 6)
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef NS_ENUM(NSInteger, STKAudioPlayerStopReason)
|
|
||||||
{
|
|
||||||
STKAudioPlayerStopReasonNone = 0,
|
|
||||||
STKAudioPlayerStopReasonEof,
|
|
||||||
STKAudioPlayerStopReasonUserAction,
|
|
||||||
STKAudioPlayerStopReasonPendingNext,
|
|
||||||
STKAudioPlayerStopReasonDisposed,
|
|
||||||
STKAudioPlayerStopReasonError = 0xffff
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef NS_ENUM(NSInteger, STKAudioPlayerErrorCode)
|
|
||||||
{
|
|
||||||
STKAudioPlayerErrorNone = 0,
|
|
||||||
STKAudioPlayerErrorDataSource,
|
|
||||||
STKAudioPlayerErrorStreamParseBytesFailed,
|
|
||||||
STKAudioPlayerErrorAudioSystemError,
|
|
||||||
STKAudioPlayerErrorCodecError,
|
|
||||||
STKAudioPlayerErrorDataNotFound,
|
|
||||||
STKAudioPlayerErrorOther = 0xffff
|
|
||||||
};
|
|
||||||
|
|
||||||
///
|
|
||||||
/// Options to initiailise the Audioplayer with.
|
|
||||||
/// By default if you set buffer size or seconds to 0, the non-zero default will be used
|
|
||||||
/// If you would like to disable the buffer option completely set to STK_DISABLE_BUFFER
|
|
||||||
///
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
/// If YES then seeking a track will cause all pending items to be flushed from the queue
|
|
||||||
BOOL flushQueueOnSeek;
|
|
||||||
/// If YES then volume control will be enabled on iOS
|
|
||||||
BOOL enableVolumeMixer;
|
|
||||||
/// A pointer to a 0 terminated array of band frequencies (iOS 5.0 and later, OSX 10.9 and later)
|
|
||||||
Float32 equalizerBandFrequencies[24];
|
|
||||||
/// The size of the internal I/O read buffer. This data in this buffer is transient and does not need to be larger.
|
|
||||||
UInt32 readBufferSize;
|
|
||||||
/// The size of the decompressed buffer (Default is 10 seconds which uses about 1.7MB of RAM)
|
|
||||||
float bufferSizeInSeconds;
|
|
||||||
/// Number of seconds of decompressed audio is required before playback first starts for each item (Default is 0.5 seconds. Must be larger than bufferSizeInSeconds)
|
|
||||||
Float32 secondsRequiredToStartPlaying;
|
|
||||||
/// Seconds after a seek is performed before data needs to come in (after which the state will change to playing/buffering)
|
|
||||||
Float32 gracePeriodAfterSeekInSeconds;
|
|
||||||
/// Number of seconds of decompressed audio required before playback resumes after a buffer underrun (Default is 5 seconds. Must be larger than bufferSizeinSeconds)
|
|
||||||
Float32 secondsRequiredToStartPlayingAfterBufferUnderun;
|
|
||||||
}
|
|
||||||
STKAudioPlayerOptions;
|
|
||||||
|
|
||||||
#define STK_DISABLE_BUFFER (0xffffffff)
|
|
||||||
|
|
||||||
typedef void(^STKFrameFilter)(UInt32 channelsPerFrame, UInt32 bytesPerFrame, UInt32 frameCount, float* frames);
|
|
||||||
|
|
||||||
@interface STKFrameFilterEntry : NSObject
|
|
||||||
@property (readonly) NSString* name;
|
|
||||||
@property (readonly) STKFrameFilter filter;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@class STKAudioPlayer;
|
|
||||||
|
|
||||||
@protocol STKAudioPlayerDelegate <NSObject>
|
|
||||||
|
|
||||||
/// Raised when an item has started playing
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didStartPlayingQueueItemId:(NSObject*)queueItemId;
|
|
||||||
/// Raised when an item has finished buffering (may or may not be the currently playing item)
|
|
||||||
/// This event may be raised multiple times for the same item if seek is invoked on the player
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didFinishBufferingSourceWithQueueItemId:(NSObject*)queueItemId;
|
|
||||||
/// Raised when the state of the player has changed
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer stateChanged:(STKAudioPlayerState)state previousState:(STKAudioPlayerState)previousState;
|
|
||||||
/// Raised when an item has finished playing
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didFinishPlayingQueueItemId:(NSObject*)queueItemId withReason:(STKAudioPlayerStopReason)stopReason andProgress:(double)progress andDuration:(double)duration;
|
|
||||||
/// Raised when an unexpected and possibly unrecoverable error has occured (usually best to recreate the STKAudioPlauyer)
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer unexpectedError:(STKAudioPlayerErrorCode)errorCode;
|
|
||||||
@optional
|
|
||||||
/// Optionally implemented to get logging information from the STKAudioPlayer (used internally for debugging)
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer logInfo:(NSString*)line;
|
|
||||||
/// Raised when items queued items are cleared (usually because of a call to play, setDataSource or stop)
|
|
||||||
-(void) audioPlayer:(STKAudioPlayer*)audioPlayer didCancelQueuedItems:(NSArray*)queuedItems;
|
|
||||||
|
|
||||||
-(void) plotGraphWithBuffer:(float*)buffer andLength:(UInt32)count;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface STKAudioPlayer : NSObject<STKDataSourceDelegate>
|
|
||||||
|
|
||||||
/// Gets or sets the volume (ranges 0 - 1.0).
|
|
||||||
/// On iOS the STKAudioPlayerOptionEnableMultichannelMixer option must be enabled for volume to work.
|
|
||||||
@property (readwrite) Float32 volume;
|
|
||||||
/// Gets or sets the player muted state
|
|
||||||
@property (readwrite) BOOL muted;
|
|
||||||
/// Gets the current item duration in seconds
|
|
||||||
@property (readonly) double duration;
|
|
||||||
/// Gets the current item progress in seconds
|
|
||||||
@property (readonly) double progress;
|
|
||||||
/// Enables or disables peak and average decibel meteting
|
|
||||||
@property (readwrite) BOOL meteringEnabled;
|
|
||||||
/// Enables or disables the EQ
|
|
||||||
@property (readwrite) BOOL equalizerEnabled;
|
|
||||||
/// Returns an array of STKFrameFilterEntry objects representing the filters currently in use
|
|
||||||
@property (readonly, nullable) NSArray* frameFilters;
|
|
||||||
/// Returns the items pending to be played (includes buffering and upcoming items but does not include the current item)
|
|
||||||
@property (readonly) NSArray* pendingQueue;
|
|
||||||
/// The number of items pending to be played (includes buffering and upcoming items but does not include the current item)
|
|
||||||
@property (readonly) NSUInteger pendingQueueCount;
|
|
||||||
/// Gets the most recently queued item that is still pending to play
|
|
||||||
@property (readonly, nullable) NSObject* mostRecentlyQueuedStillPendingItem;
|
|
||||||
/// Gets the current state of the player
|
|
||||||
@property (readwrite) STKAudioPlayerState state;
|
|
||||||
/// Gets the options provided to the player on startup
|
|
||||||
@property (readonly) STKAudioPlayerOptions options;
|
|
||||||
/// Gets the reason why the player is stopped (if any)
|
|
||||||
@property (readonly) STKAudioPlayerStopReason stopReason;
|
|
||||||
/// Gets and sets the delegate used for receiving events from the STKAudioPlayer
|
|
||||||
@property (readwrite, unsafe_unretained) id<STKAudioPlayerDelegate> delegate;
|
|
||||||
|
|
||||||
/// Creates a datasource from a given URL.
|
|
||||||
/// URLs with FILE schemes will return an STKLocalFileDataSource.
|
|
||||||
/// URLs with HTTP schemes will return an STKHTTPDataSource wrapped within an STKAutoRecoveringHTTPDataSource.
|
|
||||||
/// URLs with unrecognised schemes will return nil.
|
|
||||||
+(STKDataSource*) dataSourceFromURL:(NSURL*)url;
|
|
||||||
|
|
||||||
/// Initializes a new STKAudioPlayer with the default options
|
|
||||||
-(instancetype) init;
|
|
||||||
|
|
||||||
/// Initializes a new STKAudioPlayer with the given options
|
|
||||||
-(instancetype) initWithOptions:(STKAudioPlayerOptions)optionsIn;
|
|
||||||
|
|
||||||
/// Plays an item from the given URL string (all pending queued items are removed).
|
|
||||||
/// The NSString is used as the queue item ID
|
|
||||||
-(void) play:(NSString*)urlString;
|
|
||||||
|
|
||||||
/// Plays an item from the given URL (all pending queued items are removed)
|
|
||||||
-(void) play:(NSString*)urlString withQueueItemID:(NSObject*)queueItemId;
|
|
||||||
|
|
||||||
/// Plays an item from the given URL (all pending queued items are removed)
|
|
||||||
/// The NSURL is used as the queue item ID
|
|
||||||
-(void) playURL:(NSURL*)url;
|
|
||||||
|
|
||||||
/// Plays an item from the given URL (all pending queued items are removed)
|
|
||||||
-(void) playURL:(NSURL*)url withQueueItemID:(NSObject*)queueItemId;
|
|
||||||
|
|
||||||
/// Plays the given item (all pending queued items are removed)
|
|
||||||
/// The STKDataSource is used as the queue item ID
|
|
||||||
-(void) playDataSource:(STKDataSource*)dataSource;
|
|
||||||
|
|
||||||
/// Plays the given item (all pending queued items are removed)
|
|
||||||
-(void) playDataSource:(STKDataSource*)dataSource withQueueItemID:(NSObject*)queueItemId;
|
|
||||||
|
|
||||||
/// Queues the URL string for playback and uses the NSString as the queueItemID
|
|
||||||
-(void) queue:(NSString*)urlString;
|
|
||||||
|
|
||||||
/// Queues the URL string for playback with the given queueItemID
|
|
||||||
-(void) queue:(NSString*)urlString withQueueItemId:(NSObject*)queueItemId;
|
|
||||||
|
|
||||||
/// Queues the URL for playback and uses the NSURL as the queueItemID
|
|
||||||
-(void) queueURL:(NSURL*)url;
|
|
||||||
|
|
||||||
/// Queues the URL for playback with the given queueItemID
|
|
||||||
-(void) queueURL:(NSURL*)url withQueueItemId:(NSObject*)queueItemId;
|
|
||||||
|
|
||||||
/// Queues a DataSource with the given queueItemId
|
|
||||||
-(void) queueDataSource:(STKDataSource*)dataSource withQueueItemId:(NSObject*)queueItemId;
|
|
||||||
|
|
||||||
/// Plays the given item (all pending queued items are removed)
|
|
||||||
-(void) setDataSource:(STKDataSource*)dataSourceIn withQueueItemId:(NSObject*)queueItemId;
|
|
||||||
|
|
||||||
/// Seeks to a specific time (in seconds)
|
|
||||||
-(void) seekToTime:(double)value;
|
|
||||||
|
|
||||||
/// Clears any upcoming items already queued for playback (does not stop the current item).
|
|
||||||
/// The didCancelItems event will be raised for the items removed from the queue.
|
|
||||||
-(void) clearQueue;
|
|
||||||
|
|
||||||
/// Pauses playback
|
|
||||||
-(void) pause;
|
|
||||||
|
|
||||||
/// Resumes playback from pause
|
|
||||||
-(void) resume;
|
|
||||||
|
|
||||||
/// Stops playback of the current file, flushes all the buffers and removes any pending queued items
|
|
||||||
-(void) stop;
|
|
||||||
|
|
||||||
/// Mutes playback
|
|
||||||
-(void) mute;
|
|
||||||
|
|
||||||
/// Unmutes playback
|
|
||||||
-(void) unmute;
|
|
||||||
|
|
||||||
/// Disposes the STKAudioPlayer and frees up all resources before returning
|
|
||||||
-(void) dispose;
|
|
||||||
|
|
||||||
/// The QueueItemId of the currently playing item
|
|
||||||
-(NSObject*) currentlyPlayingQueueItemId;
|
|
||||||
|
|
||||||
/// Removes a frame filter with the given name
|
|
||||||
-(void) removeFrameFilterWithName:(NSString*)name;
|
|
||||||
|
|
||||||
/// Appends a frame filter with the given name and filter block to the end of the filter chain
|
|
||||||
-(void) appendFrameFilterWithName:(NSString*)name block:(STKFrameFilter)block;
|
|
||||||
|
|
||||||
/// Appends a frame filter with the given name and filter block just after the filter with the given name.
|
|
||||||
/// If the given name is nil, the filter will be inserted at the beginning of the filter change
|
|
||||||
-(void) addFrameFilterWithName:(NSString*)name afterFilterWithName:(nullable NSString*)afterFilterWithName block:(STKFrameFilter)block;
|
|
||||||
|
|
||||||
/// Reads the peak power in decibals for the given channel (0 or 1).
|
|
||||||
/// Return values are between -60 (low) and 0 (high).
|
|
||||||
//-(float) peakPowerInDecibelsForChannel:(NSUInteger)channelNumber;
|
|
||||||
|
|
||||||
/// Reads the average power in decibals for the given channel (0 or 1)
|
|
||||||
/// Return values are between -60 (low) and 0 (high).
|
|
||||||
//-(float) averagePowerInDecibelsForChannel:(NSUInteger)channelNumber;
|
|
||||||
|
|
||||||
/// Sets the gain value (from -96 low to +24 high) for an equalizer band (0 based index)
|
|
||||||
-(void) setGain:(float)gain forEqualizerBand:(int)bandIndex;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 16/10/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012-2014 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKDataSource.h"
|
|
||||||
#import "STKHTTPDataSource.h"
|
|
||||||
#import "STKDataSourceWrapper.h"
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int watchdogPeriodSeconds;
|
|
||||||
int inactivePeriodBeforeReconnectSeconds;
|
|
||||||
}
|
|
||||||
STKAutoRecoveringHTTPDataSourceOptions;
|
|
||||||
|
|
||||||
@interface STKAutoRecoveringHTTPDataSource : STKDataSourceWrapper
|
|
||||||
|
|
||||||
-(instancetype) initWithHTTPDataSource:(STKHTTPDataSource*)innerDataSource;
|
|
||||||
|
|
||||||
@property (readonly) STKHTTPDataSource* innerDataSource;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,392 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 16/10/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012-2014 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen''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 <COPYRIGHT HOLDER> 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import <sys/socket.h>
|
|
||||||
#import <netinet/in.h>
|
|
||||||
#import <netinet6/in6.h>
|
|
||||||
#import <arpa/inet.h>
|
|
||||||
#import <ifaddrs.h>
|
|
||||||
#import <netdb.h>
|
|
||||||
#import "mach/mach_time.h"
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
#import <SystemConfiguration/SystemConfiguration.h>
|
|
||||||
#import "STKAutoRecoveringHTTPDataSource.h"
|
|
||||||
|
|
||||||
#define DEFAULT_WATCHDOG_PERIOD_SECONDS (8)
|
|
||||||
#define DEFAULT_INACTIVE_PERIOD_BEFORE_RECONNECT_SECONDS (15)
|
|
||||||
|
|
||||||
static uint64_t GetTickCount(void)
|
|
||||||
{
|
|
||||||
static mach_timebase_info_data_t sTimebaseInfo;
|
|
||||||
uint64_t machTime = mach_absolute_time();
|
|
||||||
|
|
||||||
if (sTimebaseInfo.denom == 0 )
|
|
||||||
{
|
|
||||||
(void) mach_timebase_info(&sTimebaseInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t millis = ((machTime / 1000000) * sTimebaseInfo.numer) / sTimebaseInfo.denom;
|
|
||||||
|
|
||||||
return millis;
|
|
||||||
}
|
|
||||||
|
|
||||||
@interface STKAutoRecoveringHTTPDataSource()
|
|
||||||
{
|
|
||||||
int serial;
|
|
||||||
int waitSeconds;
|
|
||||||
NSTimer* timeoutTimer;
|
|
||||||
BOOL waitingForNetwork;
|
|
||||||
uint64_t ticksWhenLastDataReceived;
|
|
||||||
SCNetworkReachabilityRef reachabilityRef;
|
|
||||||
STKAutoRecoveringHTTPDataSourceOptions options;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) reachabilityChanged;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info)
|
|
||||||
{
|
|
||||||
@autoreleasepool
|
|
||||||
{
|
|
||||||
STKAutoRecoveringHTTPDataSource* dataSource = (__bridge STKAutoRecoveringHTTPDataSource*)info;
|
|
||||||
|
|
||||||
[dataSource reachabilityChanged];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PopulateOptionsWithDefault(STKAutoRecoveringHTTPDataSourceOptions* options)
|
|
||||||
{
|
|
||||||
if (options->watchdogPeriodSeconds == 0)
|
|
||||||
{
|
|
||||||
options->watchdogPeriodSeconds = DEFAULT_WATCHDOG_PERIOD_SECONDS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options->inactivePeriodBeforeReconnectSeconds == 0)
|
|
||||||
{
|
|
||||||
options->inactivePeriodBeforeReconnectSeconds = DEFAULT_INACTIVE_PERIOD_BEFORE_RECONNECT_SECONDS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@implementation STKAutoRecoveringHTTPDataSource
|
|
||||||
|
|
||||||
@dynamic innerDataSource;
|
|
||||||
|
|
||||||
-(STKHTTPDataSource*) innerHTTPDataSource
|
|
||||||
{
|
|
||||||
return (STKHTTPDataSource*)self.innerDataSource;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(instancetype) initWithDataSource:(STKDataSource *)innerDataSource
|
|
||||||
{
|
|
||||||
return [self initWithHTTPDataSource:(STKHTTPDataSource*)innerDataSource];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(instancetype) initWithHTTPDataSource:(STKHTTPDataSource*)innerDataSourceIn
|
|
||||||
{
|
|
||||||
return [self initWithHTTPDataSource:innerDataSourceIn andOptions:(STKAutoRecoveringHTTPDataSourceOptions){}];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(instancetype) initWithHTTPDataSource:(STKHTTPDataSource*)innerDataSourceIn andOptions:(STKAutoRecoveringHTTPDataSourceOptions)optionsIn
|
|
||||||
{
|
|
||||||
if (self = [super initWithDataSource:innerDataSourceIn])
|
|
||||||
{
|
|
||||||
self.innerDataSource.delegate = self;
|
|
||||||
|
|
||||||
struct sockaddr_in zeroAddress;
|
|
||||||
|
|
||||||
bzero(&zeroAddress, sizeof(zeroAddress));
|
|
||||||
zeroAddress.sin_len = sizeof(zeroAddress);
|
|
||||||
zeroAddress.sin_family = AF_INET;
|
|
||||||
|
|
||||||
PopulateOptionsWithDefault(&optionsIn);
|
|
||||||
|
|
||||||
self->options = optionsIn;
|
|
||||||
|
|
||||||
reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) startNotifierOnRunLoop:(NSRunLoop*)runLoop
|
|
||||||
{
|
|
||||||
BOOL retVal = NO;
|
|
||||||
SCNetworkReachabilityContext context = { 0, (__bridge void*)self, NULL, NULL, NULL };
|
|
||||||
|
|
||||||
if (SCNetworkReachabilitySetCallback(reachabilityRef, ReachabilityCallback, &context))
|
|
||||||
{
|
|
||||||
if(SCNetworkReachabilityScheduleWithRunLoop(reachabilityRef, runLoop.getCFRunLoop, kCFRunLoopDefaultMode))
|
|
||||||
{
|
|
||||||
retVal = YES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) registerForEvents:(NSRunLoop*)runLoop
|
|
||||||
{
|
|
||||||
[super registerForEvents:runLoop];
|
|
||||||
[self startNotifierOnRunLoop:runLoop];
|
|
||||||
|
|
||||||
if (timeoutTimer)
|
|
||||||
{
|
|
||||||
[timeoutTimer invalidate];
|
|
||||||
timeoutTimer = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
ticksWhenLastDataReceived = GetTickCount();
|
|
||||||
|
|
||||||
[self createTimeoutTimer];
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) unregisterForEvents
|
|
||||||
{
|
|
||||||
[super unregisterForEvents];
|
|
||||||
[self stopNotifier];
|
|
||||||
|
|
||||||
[self destroyTimeoutTimer];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) timeoutTimerTick:(NSTimer*)timer
|
|
||||||
{
|
|
||||||
if (![self hasBytesAvailable])
|
|
||||||
{
|
|
||||||
if ([self hasGotNetworkConnection])
|
|
||||||
{
|
|
||||||
uint64_t currentTicks = GetTickCount();
|
|
||||||
|
|
||||||
if (((currentTicks - ticksWhenLastDataReceived) / 1000) >= options.inactivePeriodBeforeReconnectSeconds)
|
|
||||||
{
|
|
||||||
serial++;
|
|
||||||
|
|
||||||
NSLog(@"timeoutTimerTick %lld/%lld", self.position, self.length);
|
|
||||||
|
|
||||||
[self attemptReconnectWithSerial:@(serial)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) createTimeoutTimer
|
|
||||||
{
|
|
||||||
[self destroyTimeoutTimer];
|
|
||||||
|
|
||||||
NSRunLoop* runLoop = self.innerDataSource.eventsRunLoop;
|
|
||||||
|
|
||||||
if (runLoop == nil)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeoutTimer = [NSTimer timerWithTimeInterval:options.watchdogPeriodSeconds target:self selector:@selector(timeoutTimerTick:) userInfo:@(serial) repeats:YES];
|
|
||||||
|
|
||||||
[runLoop addTimer:timeoutTimer forMode:NSRunLoopCommonModes];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) destroyTimeoutTimer
|
|
||||||
{
|
|
||||||
if (timeoutTimer)
|
|
||||||
{
|
|
||||||
[timeoutTimer invalidate];
|
|
||||||
timeoutTimer = nil;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) stopNotifier
|
|
||||||
{
|
|
||||||
if (reachabilityRef != NULL)
|
|
||||||
{
|
|
||||||
SCNetworkReachabilitySetCallback(reachabilityRef, NULL, NULL);
|
|
||||||
SCNetworkReachabilityUnscheduleFromRunLoop(reachabilityRef, [self.innerDataSource.eventsRunLoop getCFRunLoop], kCFRunLoopDefaultMode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) hasGotNetworkConnection
|
|
||||||
{
|
|
||||||
SCNetworkReachabilityFlags flags;
|
|
||||||
|
|
||||||
if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags))
|
|
||||||
{
|
|
||||||
return ((flags & kSCNetworkReachabilityFlagsReachable) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) seekToOffset:(int64_t)offset
|
|
||||||
{
|
|
||||||
ticksWhenLastDataReceived = GetTickCount();
|
|
||||||
|
|
||||||
[super seekToOffset:offset];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) close
|
|
||||||
{
|
|
||||||
[self destroyTimeoutTimer];
|
|
||||||
[super close];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dealloc
|
|
||||||
{
|
|
||||||
NSLog(@"STKAutoRecoveringHTTPDataSource dealloc");
|
|
||||||
|
|
||||||
self.innerDataSource.delegate = nil;
|
|
||||||
|
|
||||||
[self stopNotifier];
|
|
||||||
[self destroyTimeoutTimer];
|
|
||||||
|
|
||||||
[NSObject cancelPreviousPerformRequestsWithTarget:self];
|
|
||||||
|
|
||||||
if (reachabilityRef!= NULL)
|
|
||||||
{
|
|
||||||
CFRelease(reachabilityRef);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) reachabilityChanged
|
|
||||||
{
|
|
||||||
if (waitingForNetwork)
|
|
||||||
{
|
|
||||||
waitingForNetwork = NO;
|
|
||||||
|
|
||||||
NSLog(@"reachabilityChanged %lld/%lld", self.position, self.length);
|
|
||||||
|
|
||||||
serial++;
|
|
||||||
|
|
||||||
[self attemptReconnectWithSerial:@(serial)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dataSourceDataAvailable:(STKDataSource*)dataSource
|
|
||||||
{
|
|
||||||
if (![self.innerDataSource hasBytesAvailable])
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
serial++;
|
|
||||||
waitSeconds = 1;
|
|
||||||
ticksWhenLastDataReceived = GetTickCount();
|
|
||||||
|
|
||||||
[super dataSourceDataAvailable:dataSource];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) attemptReconnectWithSerial:(NSNumber*)serialIn
|
|
||||||
{
|
|
||||||
if (serialIn.intValue != self->serial)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSLog(@"attemptReconnect %lld/%lld", self.position, self.length);
|
|
||||||
|
|
||||||
if (self.innerDataSource.eventsRunLoop)
|
|
||||||
{
|
|
||||||
[self.innerDataSource reconnect];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) attemptReconnectWithTimer:(NSTimer*)timer
|
|
||||||
{
|
|
||||||
[self attemptReconnectWithSerial:(NSNumber*)timer.userInfo];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) processRetryOnError
|
|
||||||
{
|
|
||||||
if (![self hasGotNetworkConnection])
|
|
||||||
{
|
|
||||||
waitingForNetwork = YES;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
waitingForNetwork = NO;
|
|
||||||
|
|
||||||
NSRunLoop* runLoop = self.innerDataSource.eventsRunLoop;
|
|
||||||
|
|
||||||
if (runLoop == nil)
|
|
||||||
{
|
|
||||||
// DataSource no longer used
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
serial++;
|
|
||||||
|
|
||||||
NSTimer* timer = [NSTimer timerWithTimeInterval:waitSeconds target:self selector:@selector(attemptReconnectWithTimer:) userInfo:@(serial) repeats:NO];
|
|
||||||
|
|
||||||
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];
|
|
||||||
}
|
|
||||||
|
|
||||||
waitSeconds = MIN(waitSeconds + 1, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dataSourceEof:(STKDataSource*)dataSource
|
|
||||||
{
|
|
||||||
NSLog(@"dataSourceEof");
|
|
||||||
|
|
||||||
if ([self position] < [self length])
|
|
||||||
{
|
|
||||||
[self processRetryOnError];
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
[self.delegate dataSourceEof:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)dataSourceErrorOccured:(STKDataSource*)dataSource {
|
|
||||||
NSLog(@"dataSourceErrorOccured");
|
|
||||||
|
|
||||||
/* Range out of bounds */
|
|
||||||
if (self.innerDataSource.httpStatusCode == 416) {
|
|
||||||
[super dataSourceEof:dataSource];
|
|
||||||
} else if ([self hasGotNetworkConnection]) {
|
|
||||||
[super dataSourceErrorOccured:dataSource];
|
|
||||||
} else {
|
|
||||||
[self processRetryOnError];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSString*) description
|
|
||||||
{
|
|
||||||
return [NSString stringWithFormat:@"HTTP data source with file length: %lld and position: %lld", self.length, self.position];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKDataSource.h"
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@class STKCoreFoundationDataSource;
|
|
||||||
|
|
||||||
@interface CoreFoundationDataSourceClientInfo : NSObject
|
|
||||||
@property (readwrite) CFReadStreamRef readStreamRef;
|
|
||||||
@property (readwrite, retain) STKCoreFoundationDataSource* datasource;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface STKCoreFoundationDataSource : STKDataSource
|
|
||||||
{
|
|
||||||
@public
|
|
||||||
CFReadStreamRef stream;
|
|
||||||
@protected
|
|
||||||
BOOL isInErrorState;
|
|
||||||
NSRunLoop* eventsRunLoop;
|
|
||||||
}
|
|
||||||
|
|
||||||
@property (readonly) BOOL isInErrorState;
|
|
||||||
|
|
||||||
-(BOOL) reregisterForEvents;
|
|
||||||
|
|
||||||
-(void) open;
|
|
||||||
-(void) openCompleted;
|
|
||||||
-(void) dataAvailable;
|
|
||||||
-(void) eof;
|
|
||||||
-(void) errorOccured;
|
|
||||||
-(CFStreamStatus) status;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,201 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKCoreFoundationDataSource.h"
|
|
||||||
|
|
||||||
static void ReadStreamCallbackProc(CFReadStreamRef stream, CFStreamEventType eventType, void* inClientInfo)
|
|
||||||
{
|
|
||||||
STKCoreFoundationDataSource* datasource = (__bridge STKCoreFoundationDataSource*)inClientInfo;
|
|
||||||
|
|
||||||
switch (eventType)
|
|
||||||
{
|
|
||||||
case kCFStreamEventErrorOccurred:
|
|
||||||
{
|
|
||||||
[datasource errorOccured];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case kCFStreamEventEndEncountered:
|
|
||||||
[datasource eof];
|
|
||||||
break;
|
|
||||||
case kCFStreamEventHasBytesAvailable:
|
|
||||||
[datasource dataAvailable];
|
|
||||||
break;
|
|
||||||
case kCFStreamEventOpenCompleted:
|
|
||||||
[datasource openCompleted];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@implementation CoreFoundationDataSourceClientInfo
|
|
||||||
@synthesize readStreamRef, datasource;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation STKCoreFoundationDataSource
|
|
||||||
|
|
||||||
-(BOOL) isInErrorState
|
|
||||||
{
|
|
||||||
return self->isInErrorState;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dataAvailable
|
|
||||||
{
|
|
||||||
[self.delegate dataSourceDataAvailable:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) eof
|
|
||||||
{
|
|
||||||
[self.delegate dataSourceEof:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) errorOccured
|
|
||||||
{
|
|
||||||
self->isInErrorState = YES;
|
|
||||||
|
|
||||||
[self.delegate dataSourceErrorOccured:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dealloc
|
|
||||||
{
|
|
||||||
if (stream)
|
|
||||||
{
|
|
||||||
if (eventsRunLoop)
|
|
||||||
{
|
|
||||||
[self unregisterForEvents];
|
|
||||||
}
|
|
||||||
|
|
||||||
[self close];
|
|
||||||
|
|
||||||
stream = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) close
|
|
||||||
{
|
|
||||||
if (stream)
|
|
||||||
{
|
|
||||||
if (eventsRunLoop)
|
|
||||||
{
|
|
||||||
[self unregisterForEvents];
|
|
||||||
}
|
|
||||||
|
|
||||||
CFReadStreamClose(stream);
|
|
||||||
CFRelease(stream);
|
|
||||||
|
|
||||||
stream = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) open
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) seekToOffset:(SInt64)offset
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size
|
|
||||||
{
|
|
||||||
return (int)CFReadStreamRead(stream, buffer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) unregisterForEvents
|
|
||||||
{
|
|
||||||
if (stream)
|
|
||||||
{
|
|
||||||
CFReadStreamSetClient(stream, kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, NULL, NULL);
|
|
||||||
CFReadStreamUnscheduleFromRunLoop(stream, [eventsRunLoop getCFRunLoop], kCFRunLoopCommonModes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) reregisterForEvents
|
|
||||||
{
|
|
||||||
if (eventsRunLoop && stream)
|
|
||||||
{
|
|
||||||
CFStreamClientContext context = {0, (__bridge void*)self, NULL, NULL, NULL};
|
|
||||||
CFReadStreamSetClient(stream, kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, ReadStreamCallbackProc, &context);
|
|
||||||
CFReadStreamScheduleWithRunLoop(stream, [eventsRunLoop getCFRunLoop], kCFRunLoopCommonModes);
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) registerForEvents:(NSRunLoop*)runLoop
|
|
||||||
{
|
|
||||||
eventsRunLoop = runLoop;
|
|
||||||
|
|
||||||
if (!stream)
|
|
||||||
{
|
|
||||||
// Will register when they open or seek
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFStreamClientContext context = {0, (__bridge void*)self, NULL, NULL, NULL};
|
|
||||||
|
|
||||||
CFReadStreamSetClient(stream, kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, ReadStreamCallbackProc, &context);
|
|
||||||
|
|
||||||
CFReadStreamScheduleWithRunLoop(stream, [eventsRunLoop getCFRunLoop], kCFRunLoopCommonModes);
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) hasBytesAvailable
|
|
||||||
{
|
|
||||||
if (!stream)
|
|
||||||
{
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CFReadStreamHasBytesAvailable(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(CFStreamStatus) status
|
|
||||||
{
|
|
||||||
if (stream)
|
|
||||||
{
|
|
||||||
return CFReadStreamGetStatus(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) openCompleted
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
#include <AudioToolbox/AudioToolbox.h>
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@class STKDataSource;
|
|
||||||
|
|
||||||
@protocol STKDataSourceDelegate<NSObject>
|
|
||||||
-(void) dataSourceDataAvailable:(STKDataSource*)dataSource;
|
|
||||||
-(void) dataSourceErrorOccured:(STKDataSource*)dataSource;
|
|
||||||
-(void) dataSourceEof:(STKDataSource*)dataSource;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface STKDataSource : NSObject
|
|
||||||
|
|
||||||
@property (readonly) BOOL supportsSeek;
|
|
||||||
@property (readonly) SInt64 position;
|
|
||||||
@property (readonly) SInt64 length;
|
|
||||||
@property (readonly) BOOL hasBytesAvailable;
|
|
||||||
@property (nonatomic, readwrite, assign) double durationHint;
|
|
||||||
@property (readwrite, unsafe_unretained, nullable) id<STKDataSourceDelegate> delegate;
|
|
||||||
@property (nonatomic, strong, nullable) NSURL *recordToFileUrl;
|
|
||||||
|
|
||||||
-(BOOL) registerForEvents:(NSRunLoop*)runLoop;
|
|
||||||
-(void) unregisterForEvents;
|
|
||||||
-(void) close;
|
|
||||||
|
|
||||||
-(void) seekToOffset:(SInt64)offset;
|
|
||||||
-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size;
|
|
||||||
-(AudioFileTypeID) audioFileTypeHint;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKDataSource.h"
|
|
||||||
|
|
||||||
@implementation STKDataSource
|
|
||||||
@synthesize delegate;
|
|
||||||
|
|
||||||
-(SInt64) length
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) seekToOffset:(SInt64)offset
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(SInt64) position
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) registerForEvents:(NSRunLoop*)runLoop
|
|
||||||
{
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) unregisterForEvents
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) close
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) hasBytesAvailable
|
|
||||||
{
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(AudioFileTypeID) audioFileTypeHint
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) supportsSeek
|
|
||||||
{
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 16/10/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen''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 <COPYRIGHT HOLDER> 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKDataSource.h"
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@interface STKDataSourceWrapper : STKDataSource<STKDataSourceDelegate>
|
|
||||||
|
|
||||||
-(instancetype) initWithDataSource:(STKDataSource*)innerDataSource;
|
|
||||||
|
|
||||||
@property (readonly) STKDataSource* innerDataSource;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,120 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 16/10/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen''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 <COPYRIGHT HOLDER> 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKDataSourceWrapper.h"
|
|
||||||
|
|
||||||
@interface STKDataSourceWrapper()
|
|
||||||
@property (readwrite) STKDataSource* innerDataSource;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation STKDataSourceWrapper
|
|
||||||
|
|
||||||
-(instancetype) initWithDataSource:(STKDataSource*)innerDataSourceIn
|
|
||||||
{
|
|
||||||
if (self = [super init])
|
|
||||||
{
|
|
||||||
self.innerDataSource = innerDataSourceIn;
|
|
||||||
|
|
||||||
self.innerDataSource.delegate = self;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(AudioFileTypeID) audioFileTypeHint
|
|
||||||
{
|
|
||||||
return self.innerDataSource.audioFileTypeHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dealloc
|
|
||||||
{
|
|
||||||
self.innerDataSource.delegate = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(SInt64) length
|
|
||||||
{
|
|
||||||
return self.innerDataSource.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) seekToOffset:(SInt64)offset
|
|
||||||
{
|
|
||||||
return [self.innerDataSource seekToOffset:offset];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size
|
|
||||||
{
|
|
||||||
return [self.innerDataSource readIntoBuffer:buffer withSize:size];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(SInt64) position
|
|
||||||
{
|
|
||||||
return self.innerDataSource.position;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) registerForEvents:(NSRunLoop*)runLoop
|
|
||||||
{
|
|
||||||
return [self.innerDataSource registerForEvents:runLoop];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) unregisterForEvents
|
|
||||||
{
|
|
||||||
[self.innerDataSource unregisterForEvents];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) close
|
|
||||||
{
|
|
||||||
[self.innerDataSource close];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) hasBytesAvailable
|
|
||||||
{
|
|
||||||
return self.innerDataSource.hasBytesAvailable;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dataSourceDataAvailable:(STKDataSource*)dataSource
|
|
||||||
{
|
|
||||||
[self.delegate dataSourceDataAvailable:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dataSourceErrorOccured:(STKDataSource*)dataSource
|
|
||||||
{
|
|
||||||
[self.delegate dataSourceErrorOccured:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dataSourceEof:(STKDataSource*)dataSource
|
|
||||||
{
|
|
||||||
[self.delegate dataSourceEof:self];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,124 +0,0 @@
|
||||||
//
|
|
||||||
// AEFloatConverter.h
|
|
||||||
// The Amazing Audio Engine
|
|
||||||
//
|
|
||||||
// Created by Michael Tyson on 25/10/2012.
|
|
||||||
//
|
|
||||||
// This software is provided 'as-is', without any express or implied
|
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
|
||||||
// arising from the use of this software.
|
|
||||||
//
|
|
||||||
// Permission is granted to anyone to use this software for any purpose,
|
|
||||||
// including commercial applications, and to alter it and redistribute it
|
|
||||||
// freely, subject to the following restrictions:
|
|
||||||
//
|
|
||||||
// 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
// claim that you wrote the original software. If you use this software
|
|
||||||
// in a product, an acknowledgment in the product documentation would be
|
|
||||||
// appreciated but is not required.
|
|
||||||
//
|
|
||||||
// 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
// misrepresented as being the original software.
|
|
||||||
//
|
|
||||||
// 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
#import <AudioToolbox/AudioToolbox.h>
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Universal converter to float format
|
|
||||||
*
|
|
||||||
* Use this class to easily convert arbitrary audio formats to floating point
|
|
||||||
* for use with utilities like the Accelerate framework.
|
|
||||||
*/
|
|
||||||
@interface STKFloatConverter : NSObject
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Initialize
|
|
||||||
*
|
|
||||||
* @param sourceFormat The audio format to use
|
|
||||||
*/
|
|
||||||
- (id)initWithSourceFormat:(AudioStreamBasicDescription)sourceFormat;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Convert audio to floating-point
|
|
||||||
*
|
|
||||||
* This C function, safe to use in a Core Audio realtime thread context, will take
|
|
||||||
* an audio buffer list of audio in the format you provided at initialisation, and
|
|
||||||
* convert it into a noninterleaved float array.
|
|
||||||
*
|
|
||||||
* @param converter Pointer to the converter object.
|
|
||||||
* @param sourceBuffer An audio buffer list containing the source audio.
|
|
||||||
* @param targetBuffers An array of floating-point arrays to store the converted float audio into.
|
|
||||||
* Note that you must provide the correct number of arrays, to match the number of channels.
|
|
||||||
* @param frames The number of frames to convert.
|
|
||||||
* @return YES on success; NO on failure
|
|
||||||
*/
|
|
||||||
BOOL STKFloatConverterToFloat(STKFloatConverter* converter, AudioBufferList *sourceBuffer, float * const * targetBuffers, UInt32 frames);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Convert audio to floating-point, in a buffer list
|
|
||||||
*
|
|
||||||
* This C function, safe to use in a Core Audio realtime thread context, will take
|
|
||||||
* an audio buffer list of audio in the format you provided at initialisation, and
|
|
||||||
* convert it into a noninterleaved float format.
|
|
||||||
*
|
|
||||||
* @param converter Pointer to the converter object.
|
|
||||||
* @param sourceBuffer An audio buffer list containing the source audio.
|
|
||||||
* @param targetBuffer An audio buffer list to store the converted floating-point audio.
|
|
||||||
* @param frames The number of frames to convert.
|
|
||||||
* @return YES on success; NO on failure
|
|
||||||
*/
|
|
||||||
BOOL STKFloatConverterToFloatBufferList(STKFloatConverter* converter, AudioBufferList *sourceBuffer, AudioBufferList *targetBuffer, UInt32 frames);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Convert audio from floating-point
|
|
||||||
*
|
|
||||||
* This C function, safe to use in a Core Audio realtime thread context, will take
|
|
||||||
* an audio buffer list of audio in the format you provided at initialisation, and
|
|
||||||
* convert it into a float array.
|
|
||||||
*
|
|
||||||
* @param converter Pointer to the converter object.
|
|
||||||
* @param sourceBuffers An array of floating-point arrays containing the floating-point audio to convert.
|
|
||||||
* Note that you must provide the correct number of arrays, to match the number of channels.
|
|
||||||
* @param targetBuffer An audio buffer list to store the converted audio into.
|
|
||||||
* @param frames The number of frames to convert.
|
|
||||||
* @return YES on success; NO on failure
|
|
||||||
*/
|
|
||||||
BOOL STKFloatConverterFromFloat(STKFloatConverter* converter, float * const * sourceBuffers, AudioBufferList *targetBuffer, UInt32 frames);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Convert audio from floating-point, in a buffer list
|
|
||||||
*
|
|
||||||
* This C function, safe to use in a Core Audio realtime thread context, will take
|
|
||||||
* an audio buffer list of audio in the format you provided at initialisation, and
|
|
||||||
* convert it into a float array.
|
|
||||||
*
|
|
||||||
* @param converter Pointer to the converter object.
|
|
||||||
* @param sourceBuffer An audio buffer list containing the source audio.
|
|
||||||
* @param targetBuffer An audio buffer list to store the converted audio into.
|
|
||||||
* @param frames The number of frames to convert.
|
|
||||||
* @return YES on success; NO on failure
|
|
||||||
*/
|
|
||||||
BOOL STKFloatConverterFromFloatBufferList(STKFloatConverter* converter, AudioBufferList *sourceBuffer, AudioBufferList *targetBuffer, UInt32 frames);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* The AudioStreamBasicDescription representing the converted floating-point format
|
|
||||||
*/
|
|
||||||
@property (nonatomic, readonly) AudioStreamBasicDescription floatingPointAudioDescription;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* The source audio format set at initialization
|
|
||||||
*/
|
|
||||||
@property (nonatomic, readonly) AudioStreamBasicDescription sourceFormat;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,211 +0,0 @@
|
||||||
//
|
|
||||||
// AEFloatConverter.m
|
|
||||||
// The Amazing Audio Engine
|
|
||||||
//
|
|
||||||
// Created by Michael Tyson on 25/10/2012.
|
|
||||||
//
|
|
||||||
// This software is provided 'as-is', without any express or implied
|
|
||||||
// warranty. In no event will the authors be held liable for any damages
|
|
||||||
// arising from the use of this software.
|
|
||||||
//
|
|
||||||
// Permission is granted to anyone to use this software for any purpose,
|
|
||||||
// including commercial applications, and to alter it and redistribute it
|
|
||||||
// freely, subject to the following restrictions:
|
|
||||||
//
|
|
||||||
// 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
// claim that you wrote the original software. If you use this software
|
|
||||||
// in a product, an acknowledgment in the product documentation would be
|
|
||||||
// appreciated but is not required.
|
|
||||||
//
|
|
||||||
// 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
// misrepresented as being the original software.
|
|
||||||
//
|
|
||||||
// 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "STKFloatConverter.h"
|
|
||||||
|
|
||||||
#define checkResult(result,operation) (_checkResult((result),(operation),strrchr(__FILE__, '/')+1,__LINE__))
|
|
||||||
static inline BOOL _checkResult(OSStatus result, const char *operation, const char* file, int line) {
|
|
||||||
if ( result != noErr ) {
|
|
||||||
NSLog(@"%s:%d: %s result %d %08X %4.4s", file, line, operation, (int)result, (int)result, (char*)&result);
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define kNoMoreDataErr -2222
|
|
||||||
|
|
||||||
struct complexInputDataProc_t {
|
|
||||||
AudioBufferList *sourceBuffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
@interface STKFloatConverter () {
|
|
||||||
AudioStreamBasicDescription _sourceAudioDescription;
|
|
||||||
AudioStreamBasicDescription _floatAudioDescription;
|
|
||||||
AudioConverterRef _toFloatConverter;
|
|
||||||
AudioConverterRef _fromFloatConverter;
|
|
||||||
AudioBufferList *_scratchFloatBufferList;
|
|
||||||
}
|
|
||||||
|
|
||||||
static OSStatus complexInputDataProc(AudioConverterRef inAudioConverter,
|
|
||||||
UInt32 *ioNumberDataPackets,
|
|
||||||
AudioBufferList *ioData,
|
|
||||||
AudioStreamPacketDescription **outDataPacketDescription,
|
|
||||||
void *inUserData);
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation STKFloatConverter
|
|
||||||
@synthesize sourceFormat = _sourceAudioDescription;
|
|
||||||
|
|
||||||
-(id)initWithSourceFormat:(AudioStreamBasicDescription)sourceFormat {
|
|
||||||
if ( !(self = [super init]) ) return nil;
|
|
||||||
|
|
||||||
_floatAudioDescription.mFormatID = kAudioFormatLinearPCM;
|
|
||||||
_floatAudioDescription.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked | kAudioFormatFlagIsNonInterleaved;
|
|
||||||
_floatAudioDescription.mChannelsPerFrame = sourceFormat.mChannelsPerFrame;
|
|
||||||
_floatAudioDescription.mBytesPerPacket = sizeof(float);
|
|
||||||
_floatAudioDescription.mFramesPerPacket = 1;
|
|
||||||
_floatAudioDescription.mBytesPerFrame = sizeof(float);
|
|
||||||
_floatAudioDescription.mBitsPerChannel = 8 * sizeof(float);
|
|
||||||
_floatAudioDescription.mSampleRate = sourceFormat.mSampleRate;
|
|
||||||
|
|
||||||
_sourceAudioDescription = sourceFormat;
|
|
||||||
|
|
||||||
if ( memcmp(&sourceFormat, &_floatAudioDescription, sizeof(AudioStreamBasicDescription)) != 0 ) {
|
|
||||||
checkResult(AudioConverterNew(&sourceFormat, &_floatAudioDescription, &_toFloatConverter), "AudioConverterNew");
|
|
||||||
checkResult(AudioConverterNew(&_floatAudioDescription, &sourceFormat, &_fromFloatConverter), "AudioConverterNew");
|
|
||||||
_scratchFloatBufferList = (AudioBufferList*)malloc(sizeof(AudioBufferList) + (_floatAudioDescription.mChannelsPerFrame-1)*sizeof(AudioBuffer));
|
|
||||||
_scratchFloatBufferList->mNumberBuffers = _floatAudioDescription.mChannelsPerFrame;
|
|
||||||
for ( int i=0; i<_scratchFloatBufferList->mNumberBuffers; i++ ) {
|
|
||||||
_scratchFloatBufferList->mBuffers[i].mNumberChannels = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void)dealloc {
|
|
||||||
if ( _toFloatConverter ) AudioConverterDispose(_toFloatConverter);
|
|
||||||
if ( _fromFloatConverter ) AudioConverterDispose(_fromFloatConverter);
|
|
||||||
if ( _scratchFloatBufferList ) free(_scratchFloatBufferList);
|
|
||||||
// [super dealloc];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BOOL STKFloatConverterToFloat(STKFloatConverter* THIS, AudioBufferList *sourceBuffer, float * const * targetBuffers, UInt32 frames) {
|
|
||||||
if ( frames == 0 ) return YES;
|
|
||||||
|
|
||||||
if ( THIS->_toFloatConverter ) {
|
|
||||||
UInt32 priorDataByteSize = sourceBuffer->mBuffers[0].mDataByteSize;
|
|
||||||
for ( int i=0; i<sourceBuffer->mNumberBuffers; i++ ) {
|
|
||||||
sourceBuffer->mBuffers[i].mDataByteSize = frames * THIS->_sourceAudioDescription.mBytesPerFrame;
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( int i=0; i<THIS->_scratchFloatBufferList->mNumberBuffers; i++ ) {
|
|
||||||
THIS->_scratchFloatBufferList->mBuffers[i].mData = targetBuffers[i];
|
|
||||||
THIS->_scratchFloatBufferList->mBuffers[i].mDataByteSize = frames * sizeof(float);
|
|
||||||
}
|
|
||||||
|
|
||||||
OSStatus result = AudioConverterFillComplexBuffer(THIS->_toFloatConverter,
|
|
||||||
complexInputDataProc,
|
|
||||||
&(struct complexInputDataProc_t) { .sourceBuffer = sourceBuffer },
|
|
||||||
&frames,
|
|
||||||
THIS->_scratchFloatBufferList,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
for ( int i=0; i<sourceBuffer->mNumberBuffers; i++ ) {
|
|
||||||
sourceBuffer->mBuffers[i].mDataByteSize = priorDataByteSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !checkResult(result, "AudioConverterConvertComplexBuffer") ) {
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
for ( int i=0; i<sourceBuffer->mNumberBuffers; i++ ) {
|
|
||||||
memcpy(targetBuffers[i], sourceBuffer->mBuffers[i].mData, frames * sizeof(float));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL STKFloatConverterToFloatBufferList(STKFloatConverter* converter, AudioBufferList *sourceBuffer, AudioBufferList *targetBuffer, UInt32 frames) {
|
|
||||||
assert(targetBuffer->mNumberBuffers == converter->_floatAudioDescription.mChannelsPerFrame);
|
|
||||||
|
|
||||||
float *targetBuffers[targetBuffer->mNumberBuffers];
|
|
||||||
for ( int i=0; i<targetBuffer->mNumberBuffers; i++ ) {
|
|
||||||
targetBuffers[i] = (float*)targetBuffer->mBuffers[i].mData;
|
|
||||||
}
|
|
||||||
return STKFloatConverterToFloat(converter, sourceBuffer, targetBuffers, frames);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL STKFloatConverterFromFloat(STKFloatConverter* THIS, float * const * sourceBuffers, AudioBufferList *targetBuffer, UInt32 frames) {
|
|
||||||
if ( frames == 0 ) return YES;
|
|
||||||
|
|
||||||
if ( THIS->_fromFloatConverter ) {
|
|
||||||
for ( int i=0; i<THIS->_scratchFloatBufferList->mNumberBuffers; i++ ) {
|
|
||||||
THIS->_scratchFloatBufferList->mBuffers[i].mData = sourceBuffers[i];
|
|
||||||
THIS->_scratchFloatBufferList->mBuffers[i].mDataByteSize = frames * sizeof(float);
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt32 priorDataByteSize = targetBuffer->mBuffers[0].mDataByteSize;
|
|
||||||
for ( int i=0; i<targetBuffer->mNumberBuffers; i++ ) {
|
|
||||||
targetBuffer->mBuffers[i].mDataByteSize = frames * THIS->_sourceAudioDescription.mBytesPerFrame;
|
|
||||||
}
|
|
||||||
|
|
||||||
OSStatus result = AudioConverterFillComplexBuffer(THIS->_fromFloatConverter,
|
|
||||||
complexInputDataProc,
|
|
||||||
&(struct complexInputDataProc_t) { .sourceBuffer = THIS->_scratchFloatBufferList },
|
|
||||||
&frames,
|
|
||||||
targetBuffer,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
for ( int i=0; i<targetBuffer->mNumberBuffers; i++ ) {
|
|
||||||
targetBuffer->mBuffers[i].mDataByteSize = priorDataByteSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !checkResult(result, "AudioConverterConvertComplexBuffer") ) {
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for ( int i=0; i<targetBuffer->mNumberBuffers; i++ ) {
|
|
||||||
memcpy(targetBuffer->mBuffers[i].mData, sourceBuffers[i], frames * sizeof(float));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL STKFloatConverterFromFloatBufferList(STKFloatConverter* converter, AudioBufferList *sourceBuffer, AudioBufferList *targetBuffer, UInt32 frames) {
|
|
||||||
assert(sourceBuffer->mNumberBuffers == converter->_floatAudioDescription.mChannelsPerFrame);
|
|
||||||
|
|
||||||
float *sourceBuffers[sourceBuffer->mNumberBuffers];
|
|
||||||
for ( int i=0; i<sourceBuffer->mNumberBuffers; i++ ) {
|
|
||||||
sourceBuffers[i] = (float*)sourceBuffer->mBuffers[i].mData;
|
|
||||||
}
|
|
||||||
return STKFloatConverterFromFloat(converter, sourceBuffers, targetBuffer, frames);
|
|
||||||
}
|
|
||||||
|
|
||||||
static OSStatus complexInputDataProc(AudioConverterRef inAudioConverter,
|
|
||||||
UInt32 *ioNumberDataPackets,
|
|
||||||
AudioBufferList *ioData,
|
|
||||||
AudioStreamPacketDescription **outDataPacketDescription,
|
|
||||||
void *inUserData) {
|
|
||||||
struct complexInputDataProc_t *arg = (struct complexInputDataProc_t*)inUserData;
|
|
||||||
if ( !arg->sourceBuffer ) {
|
|
||||||
return kNoMoreDataErr;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(ioData, arg->sourceBuffer, sizeof(AudioBufferList) + (arg->sourceBuffer->mNumberBuffers-1)*sizeof(AudioBuffer));
|
|
||||||
arg->sourceBuffer = NULL;
|
|
||||||
|
|
||||||
return noErr;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(AudioStreamBasicDescription)floatingPointAudioDescription {
|
|
||||||
return _floatAudioDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKCoreFoundationDataSource.h"
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@class STKHTTPDataSource;
|
|
||||||
|
|
||||||
typedef void(^STKURLBlock)(NSURL* url);
|
|
||||||
typedef NSURL* _Nonnull (^STKURLProvider)();
|
|
||||||
typedef void(^STKAsyncURLProvider)(STKHTTPDataSource* dataSource, BOOL forSeek, STKURLBlock callback);
|
|
||||||
|
|
||||||
@interface STKHTTPDataSource : STKCoreFoundationDataSource
|
|
||||||
|
|
||||||
@property (readonly, retain) NSURL* url;
|
|
||||||
@property (readonly) UInt32 httpStatusCode;
|
|
||||||
|
|
||||||
+(AudioFileTypeID) audioFileTypeHintFromMimeType:(NSString*)fileExtension;
|
|
||||||
-(instancetype) initWithURL:(NSURL*)url;
|
|
||||||
-(instancetype) initWithURL:(NSURL*)url httpRequestHeaders:(NSDictionary*)httpRequestHeaders;
|
|
||||||
-(instancetype) initWithURLProvider:(STKURLProvider)urlProvider;
|
|
||||||
-(instancetype) initWithAsyncURLProvider:(STKAsyncURLProvider)asyncUrlProvider;
|
|
||||||
-(nullable NSRunLoop*) eventsRunLoop;
|
|
||||||
-(void) reconnect;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,608 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKHTTPDataSource.h"
|
|
||||||
#import "STKLocalFileDataSource.h"
|
|
||||||
|
|
||||||
@interface STKHTTPDataSource()
|
|
||||||
{
|
|
||||||
@private
|
|
||||||
BOOL supportsSeek;
|
|
||||||
UInt32 httpStatusCode;
|
|
||||||
SInt64 seekStart;
|
|
||||||
SInt64 relativePosition;
|
|
||||||
SInt64 fileLength;
|
|
||||||
int discontinuous;
|
|
||||||
int requestSerialNumber;
|
|
||||||
int prefixBytesRead;
|
|
||||||
NSData* prefixBytes;
|
|
||||||
NSMutableData* iceHeaderData;
|
|
||||||
BOOL iceHeaderSearchComplete;
|
|
||||||
BOOL iceHeaderAvailable;
|
|
||||||
BOOL httpHeaderNotAvailable;
|
|
||||||
|
|
||||||
NSURL* currentUrl;
|
|
||||||
STKAsyncURLProvider asyncUrlProvider;
|
|
||||||
NSDictionary* httpHeaders;
|
|
||||||
AudioFileTypeID audioFileTypeHint;
|
|
||||||
NSDictionary* requestHeaders;
|
|
||||||
}
|
|
||||||
-(void) open;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation STKHTTPDataSource
|
|
||||||
|
|
||||||
-(instancetype) initWithURL:(NSURL*)urlIn
|
|
||||||
{
|
|
||||||
return [self initWithURLProvider:^NSURL* { return urlIn; }];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(instancetype) initWithURL:(NSURL *)urlIn httpRequestHeaders:(NSDictionary *)httpRequestHeaders
|
|
||||||
{
|
|
||||||
self = [self initWithURLProvider:^NSURL* { return urlIn; }];
|
|
||||||
self->requestHeaders = httpRequestHeaders;
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(instancetype) initWithURLProvider:(STKURLProvider)urlProviderIn
|
|
||||||
{
|
|
||||||
urlProviderIn = [urlProviderIn copy];
|
|
||||||
|
|
||||||
return [self initWithAsyncURLProvider:^(STKHTTPDataSource* dataSource, BOOL forSeek, STKURLBlock block)
|
|
||||||
{
|
|
||||||
block(urlProviderIn());
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(instancetype) initWithAsyncURLProvider:(STKAsyncURLProvider)asyncUrlProviderIn
|
|
||||||
{
|
|
||||||
if (self = [super init])
|
|
||||||
{
|
|
||||||
seekStart = 0;
|
|
||||||
relativePosition = 0;
|
|
||||||
fileLength = -1;
|
|
||||||
|
|
||||||
self->asyncUrlProvider = [asyncUrlProviderIn copy];
|
|
||||||
|
|
||||||
audioFileTypeHint = [STKLocalFileDataSource audioFileTypeHintFromFileExtension:self->currentUrl.pathExtension];
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dealloc
|
|
||||||
{
|
|
||||||
NSLog(@"STKHTTPDataSource dealloc");
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSURL*) url
|
|
||||||
{
|
|
||||||
return self->currentUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
+(AudioFileTypeID) audioFileTypeHintFromMimeType:(NSString*)mimeType
|
|
||||||
{
|
|
||||||
static dispatch_once_t onceToken;
|
|
||||||
static NSDictionary* fileTypesByMimeType;
|
|
||||||
|
|
||||||
dispatch_once(&onceToken, ^
|
|
||||||
{
|
|
||||||
fileTypesByMimeType =
|
|
||||||
@{
|
|
||||||
@"audio/mp3": @(kAudioFileMP3Type),
|
|
||||||
@"audio/mpg": @(kAudioFileMP3Type),
|
|
||||||
@"audio/mpeg": @(kAudioFileMP3Type),
|
|
||||||
@"audio/wav": @(kAudioFileWAVEType),
|
|
||||||
@"audio/x-wav": @(kAudioFileWAVEType),
|
|
||||||
@"audio/vnd.wav": @(kAudioFileWAVEType),
|
|
||||||
@"audio/aifc": @(kAudioFileAIFCType),
|
|
||||||
@"audio/aiff": @(kAudioFileAIFFType),
|
|
||||||
@"audio/x-m4a": @(kAudioFileM4AType),
|
|
||||||
@"audio/x-mp4": @(kAudioFileMPEG4Type),
|
|
||||||
@"audio/aacp": @(kAudioFileAAC_ADTSType),
|
|
||||||
@"audio/m4a": @(kAudioFileM4AType),
|
|
||||||
@"audio/mp4": @(kAudioFileMPEG4Type),
|
|
||||||
@"video/mp4": @(kAudioFileMPEG4Type),
|
|
||||||
@"audio/caf": @(kAudioFileCAFType),
|
|
||||||
@"audio/x-caf": @(kAudioFileCAFType),
|
|
||||||
@"audio/aac": @(kAudioFileAAC_ADTSType),
|
|
||||||
@"audio/aacp": @(kAudioFileAAC_ADTSType),
|
|
||||||
@"audio/ac3": @(kAudioFileAC3Type),
|
|
||||||
@"audio/3gp": @(kAudioFile3GPType),
|
|
||||||
@"video/3gp": @(kAudioFile3GPType),
|
|
||||||
@"audio/3gpp": @(kAudioFile3GPType),
|
|
||||||
@"video/3gpp": @(kAudioFile3GPType),
|
|
||||||
@"audio/3gp2": @(kAudioFile3GP2Type),
|
|
||||||
@"video/3gp2": @(kAudioFile3GP2Type)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
NSNumber* number = [fileTypesByMimeType objectForKey:mimeType];
|
|
||||||
|
|
||||||
if (!number)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (AudioFileTypeID)number.intValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(AudioFileTypeID) audioFileTypeHint
|
|
||||||
{
|
|
||||||
return audioFileTypeHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSDictionary*) parseIceHeader:(NSData*)headerData
|
|
||||||
{
|
|
||||||
NSMutableDictionary* retval = [[NSMutableDictionary alloc] init];
|
|
||||||
NSCharacterSet* characterSet = [NSCharacterSet characterSetWithCharactersInString:@"\r\n"];
|
|
||||||
NSString* fullString = [[NSString alloc] initWithData:headerData encoding:NSUTF8StringEncoding];
|
|
||||||
NSArray* strings = [fullString componentsSeparatedByCharactersInSet:characterSet];
|
|
||||||
|
|
||||||
httpHeaders = [NSMutableDictionary dictionary];
|
|
||||||
|
|
||||||
for (NSString* s in strings)
|
|
||||||
{
|
|
||||||
if (s.length == 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([s hasPrefix:@"ICY "])
|
|
||||||
{
|
|
||||||
NSArray* parts = [s componentsSeparatedByString:@" "];
|
|
||||||
|
|
||||||
if (parts.count >= 2)
|
|
||||||
{
|
|
||||||
self->httpStatusCode = [parts[1] intValue];
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSRange range = [s rangeOfString:@":"];
|
|
||||||
|
|
||||||
if (range.location == NSNotFound)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString* key = [s substringWithRange: (NSRange){.location = 0, .length = range.location}];
|
|
||||||
NSString* value = [s substringFromIndex:range.location + 1];
|
|
||||||
|
|
||||||
[retval setValue:value forKey:key];
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) parseHttpHeader
|
|
||||||
{
|
|
||||||
if (!httpHeaderNotAvailable)
|
|
||||||
{
|
|
||||||
CFTypeRef response = CFReadStreamCopyProperty(stream, kCFStreamPropertyHTTPResponseHeader);
|
|
||||||
|
|
||||||
if (response)
|
|
||||||
{
|
|
||||||
httpHeaders = (__bridge_transfer NSDictionary*)CFHTTPMessageCopyAllHeaderFields((CFHTTPMessageRef)response);
|
|
||||||
|
|
||||||
if (httpHeaders.count == 0)
|
|
||||||
{
|
|
||||||
httpHeaderNotAvailable = YES;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
self->httpStatusCode = (UInt32)CFHTTPMessageGetResponseStatusCode((CFHTTPMessageRef)response);
|
|
||||||
}
|
|
||||||
|
|
||||||
CFRelease(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (httpHeaderNotAvailable)
|
|
||||||
{
|
|
||||||
if (self->iceHeaderSearchComplete && !self->iceHeaderAvailable)
|
|
||||||
{
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!self->iceHeaderSearchComplete)
|
|
||||||
{
|
|
||||||
UInt8 byte;
|
|
||||||
UInt8 terminal1[] = { '\n', '\n' };
|
|
||||||
UInt8 terminal2[] = { '\r', '\n', '\r', '\n' };
|
|
||||||
|
|
||||||
if (iceHeaderData == nil)
|
|
||||||
{
|
|
||||||
iceHeaderData = [NSMutableData dataWithCapacity:1024];
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
if (![self hasBytesAvailable])
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int read = [super readIntoBuffer:&byte withSize:1];
|
|
||||||
|
|
||||||
if (read <= 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
[iceHeaderData appendBytes:&byte length:read];
|
|
||||||
|
|
||||||
if (iceHeaderData.length >= sizeof(terminal1))
|
|
||||||
{
|
|
||||||
if (memcmp(&terminal1[0], [self->iceHeaderData bytes] + iceHeaderData.length - sizeof(terminal1), sizeof(terminal1)) == 0)
|
|
||||||
{
|
|
||||||
self->iceHeaderAvailable = YES;
|
|
||||||
self->iceHeaderSearchComplete = YES;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iceHeaderData.length >= sizeof(terminal2))
|
|
||||||
{
|
|
||||||
if (memcmp(&terminal2[0], [self->iceHeaderData bytes] + iceHeaderData.length - sizeof(terminal2), sizeof(terminal2)) == 0)
|
|
||||||
{
|
|
||||||
self->iceHeaderAvailable = YES;
|
|
||||||
self->iceHeaderSearchComplete = YES;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iceHeaderData.length >= 4)
|
|
||||||
{
|
|
||||||
if (memcmp([self->iceHeaderData bytes], "ICY ", 4) != 0 && memcmp([self->iceHeaderData bytes], "HTTP", 4) != 0)
|
|
||||||
{
|
|
||||||
self->iceHeaderAvailable = NO;
|
|
||||||
self->iceHeaderSearchComplete = YES;
|
|
||||||
prefixBytes = iceHeaderData;
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!self->iceHeaderSearchComplete)
|
|
||||||
{
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
httpHeaders = [self parseIceHeader:self->iceHeaderData];
|
|
||||||
|
|
||||||
self->iceHeaderData = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (([httpHeaders objectForKey:@"Accept-Ranges"] ?: [httpHeaders objectForKey:@"accept-ranges"]) != nil)
|
|
||||||
{
|
|
||||||
self->supportsSeek = YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.httpStatusCode == 200)
|
|
||||||
{
|
|
||||||
if (seekStart == 0)
|
|
||||||
{
|
|
||||||
id value = [httpHeaders objectForKey:@"Content-Length"] ?: [httpHeaders objectForKey:@"content-length"];
|
|
||||||
|
|
||||||
fileLength = (SInt64)[value longLongValue];
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString* contentType = [httpHeaders objectForKey:@"Content-Type"] ?: [httpHeaders objectForKey:@"content-type"] ;
|
|
||||||
AudioFileTypeID typeIdFromMimeType = [STKHTTPDataSource audioFileTypeHintFromMimeType:contentType];
|
|
||||||
|
|
||||||
if (typeIdFromMimeType != 0)
|
|
||||||
{
|
|
||||||
audioFileTypeHint = typeIdFromMimeType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (self.httpStatusCode == 206)
|
|
||||||
{
|
|
||||||
NSString* contentRange = [httpHeaders objectForKey:@"Content-Range"] ?: [httpHeaders objectForKey:@"content-range"];
|
|
||||||
NSArray* components = [contentRange componentsSeparatedByString:@"/"];
|
|
||||||
|
|
||||||
if (components.count == 2)
|
|
||||||
{
|
|
||||||
fileLength = [[components objectAtIndex:1] integerValue];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (self.httpStatusCode == 416)
|
|
||||||
{
|
|
||||||
if (self.length >= 0)
|
|
||||||
{
|
|
||||||
seekStart = self.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
[self eof];
|
|
||||||
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
else if (self.httpStatusCode >= 300)
|
|
||||||
{
|
|
||||||
[self errorOccured];
|
|
||||||
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dataAvailable
|
|
||||||
{
|
|
||||||
if (stream == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.httpStatusCode == 0)
|
|
||||||
{
|
|
||||||
if ([self parseHttpHeader])
|
|
||||||
{
|
|
||||||
if ([self hasBytesAvailable])
|
|
||||||
{
|
|
||||||
[super dataAvailable];
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
[super dataAvailable];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(SInt64) position
|
|
||||||
{
|
|
||||||
return seekStart + relativePosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(SInt64) length
|
|
||||||
{
|
|
||||||
return fileLength >= 0 ? fileLength : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) reconnect
|
|
||||||
{
|
|
||||||
NSRunLoop* savedEventsRunLoop = eventsRunLoop;
|
|
||||||
|
|
||||||
[self close];
|
|
||||||
|
|
||||||
eventsRunLoop = savedEventsRunLoop;
|
|
||||||
|
|
||||||
[self seekToOffset:self->supportsSeek ? self.position : 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) seekToOffset:(SInt64)offset
|
|
||||||
{
|
|
||||||
NSRunLoop* savedEventsRunLoop = eventsRunLoop;
|
|
||||||
|
|
||||||
[self close];
|
|
||||||
|
|
||||||
eventsRunLoop = savedEventsRunLoop;
|
|
||||||
|
|
||||||
NSAssert([NSRunLoop currentRunLoop] == eventsRunLoop, @"Seek called on wrong thread");
|
|
||||||
|
|
||||||
stream = 0;
|
|
||||||
relativePosition = 0;
|
|
||||||
seekStart = offset;
|
|
||||||
|
|
||||||
self->isInErrorState = NO;
|
|
||||||
|
|
||||||
if (!self->supportsSeek && offset != self->relativePosition)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
[self openForSeek:YES];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size
|
|
||||||
{
|
|
||||||
return [self privateReadIntoBuffer:buffer withSize:size];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(int) privateReadIntoBuffer:(UInt8*)buffer withSize:(int)size
|
|
||||||
{
|
|
||||||
if (size == 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prefixBytes != nil)
|
|
||||||
{
|
|
||||||
int count = MIN(size, (int)prefixBytes.length - prefixBytesRead);
|
|
||||||
|
|
||||||
[prefixBytes getBytes:buffer length:count];
|
|
||||||
|
|
||||||
prefixBytesRead += count;
|
|
||||||
|
|
||||||
if (prefixBytesRead >= prefixBytes.length)
|
|
||||||
{
|
|
||||||
prefixBytes = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
int read = [super readIntoBuffer:buffer withSize:size];
|
|
||||||
|
|
||||||
if (read < 0)
|
|
||||||
{
|
|
||||||
return read;
|
|
||||||
}
|
|
||||||
|
|
||||||
relativePosition += read;
|
|
||||||
|
|
||||||
return read;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) open
|
|
||||||
{
|
|
||||||
return [self openForSeek:NO];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) openForSeek:(BOOL)forSeek
|
|
||||||
{
|
|
||||||
int localRequestSerialNumber;
|
|
||||||
|
|
||||||
requestSerialNumber++;
|
|
||||||
localRequestSerialNumber = requestSerialNumber;
|
|
||||||
|
|
||||||
asyncUrlProvider(self, forSeek, ^(NSURL* url)
|
|
||||||
{
|
|
||||||
if (localRequestSerialNumber != self->requestSerialNumber)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->currentUrl = url;
|
|
||||||
|
|
||||||
if (url == nil)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFHTTPMessageRef message = CFHTTPMessageCreateRequest(NULL, (CFStringRef)@"GET", (__bridge CFURLRef)self->currentUrl, kCFHTTPVersion1_1);
|
|
||||||
|
|
||||||
if (seekStart > 0 && supportsSeek)
|
|
||||||
{
|
|
||||||
CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Range"), (__bridge CFStringRef)[NSString stringWithFormat:@"bytes=%lld-", seekStart]);
|
|
||||||
|
|
||||||
discontinuous = YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (NSString* key in self->requestHeaders)
|
|
||||||
{
|
|
||||||
NSString* value = [self->requestHeaders objectForKey:key];
|
|
||||||
|
|
||||||
CFHTTPMessageSetHeaderFieldValue(message, (__bridge CFStringRef)key, (__bridge CFStringRef)value);
|
|
||||||
}
|
|
||||||
|
|
||||||
CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Accept"), CFSTR("*/*"));
|
|
||||||
CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Ice-MetaData"), CFSTR("0"));
|
|
||||||
|
|
||||||
stream = CFReadStreamCreateForHTTPRequest(NULL, message);
|
|
||||||
|
|
||||||
if (stream == nil)
|
|
||||||
{
|
|
||||||
CFRelease(message);
|
|
||||||
|
|
||||||
[self errorOccured];
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CFReadStreamSetProperty(stream, (__bridge CFStringRef)NSStreamNetworkServiceTypeBackground, (__bridge CFStringRef)NSStreamNetworkServiceTypeBackground);
|
|
||||||
|
|
||||||
if (!CFReadStreamSetProperty(stream, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue))
|
|
||||||
{
|
|
||||||
CFRelease(message);
|
|
||||||
|
|
||||||
[self errorOccured];
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proxy support
|
|
||||||
CFDictionaryRef proxySettings = CFNetworkCopySystemProxySettings();
|
|
||||||
CFReadStreamSetProperty(stream, kCFStreamPropertyHTTPProxy, proxySettings);
|
|
||||||
CFRelease(proxySettings);
|
|
||||||
|
|
||||||
// SSL support
|
|
||||||
if ([self->currentUrl.scheme caseInsensitiveCompare:@"https"] == NSOrderedSame)
|
|
||||||
{
|
|
||||||
NSDictionary* sslSettings = [NSDictionary dictionaryWithObjectsAndKeys:
|
|
||||||
(NSString*)kCFStreamSocketSecurityLevelNegotiatedSSL, kCFStreamSSLLevel,
|
|
||||||
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
|
|
||||||
[NSNull null], kCFStreamSSLPeerName,
|
|
||||||
nil];
|
|
||||||
|
|
||||||
CFReadStreamSetProperty(stream, kCFStreamPropertySSLSettings, (__bridge CFTypeRef)sslSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
[self reregisterForEvents];
|
|
||||||
|
|
||||||
self->httpStatusCode = 0;
|
|
||||||
|
|
||||||
// Open
|
|
||||||
if (!CFReadStreamOpen(stream))
|
|
||||||
{
|
|
||||||
CFRelease(stream);
|
|
||||||
CFRelease(message);
|
|
||||||
|
|
||||||
stream = 0;
|
|
||||||
|
|
||||||
[self errorOccured];
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->isInErrorState = NO;
|
|
||||||
|
|
||||||
CFRelease(message);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
-(UInt32) httpStatusCode
|
|
||||||
{
|
|
||||||
return self->httpStatusCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSRunLoop*) eventsRunLoop
|
|
||||||
{
|
|
||||||
return self->eventsRunLoop;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSString*) description
|
|
||||||
{
|
|
||||||
return [NSString stringWithFormat:@"HTTP data source with file length: %lld and position: %lld", self.length, self.position];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) supportsSeek
|
|
||||||
{
|
|
||||||
return self->supportsSeek;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKCoreFoundationDataSource.h"
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@interface STKLocalFileDataSource : STKCoreFoundationDataSource
|
|
||||||
|
|
||||||
+(AudioFileTypeID) audioFileTypeHintFromFileExtension:(NSString*)fileExtension;
|
|
||||||
@property (readonly, copy) NSString* filePath;
|
|
||||||
-(instancetype) initWithFilePath:(NSString*)filePath;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,243 +0,0 @@
|
||||||
/**********************************************************************************
|
|
||||||
AudioPlayer.m
|
|
||||||
|
|
||||||
Created by Thong Nguyen on 14/05/2012.
|
|
||||||
https://github.com/tumtumtum/audjustable
|
|
||||||
|
|
||||||
Copyright (c) 2012 Thong Nguyen (tumtumtum@gmail.com). All rights reserved.
|
|
||||||
|
|
||||||
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.
|
|
||||||
3. All advertising materials mentioning features or use of this software
|
|
||||||
must display the following acknowledgement:
|
|
||||||
This product includes software developed by Thong Nguyen (tumtumtum@gmail.com)
|
|
||||||
4. Neither the name of Thong Nguyen nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY Thong Nguyen ''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 THONG NGUYEN 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.
|
|
||||||
**********************************************************************************/
|
|
||||||
|
|
||||||
#import "STKLocalFileDataSource.h"
|
|
||||||
|
|
||||||
@interface STKLocalFileDataSource()
|
|
||||||
{
|
|
||||||
SInt64 position;
|
|
||||||
SInt64 length;
|
|
||||||
AudioFileTypeID audioFileTypeHint;
|
|
||||||
}
|
|
||||||
@property (readwrite, copy) NSString* filePath;
|
|
||||||
-(void) open;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation STKLocalFileDataSource
|
|
||||||
@synthesize filePath;
|
|
||||||
|
|
||||||
-(instancetype) initWithFilePath:(NSString*)filePathIn
|
|
||||||
{
|
|
||||||
if (self = [super init])
|
|
||||||
{
|
|
||||||
self.filePath = filePathIn;
|
|
||||||
|
|
||||||
audioFileTypeHint = [[self class] audioFileTypeHintFromFileExtension:filePathIn.pathExtension];
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
+(AudioFileTypeID) audioFileTypeHintFromFileExtension:(NSString*)fileExtension
|
|
||||||
{
|
|
||||||
static dispatch_once_t onceToken;
|
|
||||||
static NSDictionary* fileTypesByFileExtensions;
|
|
||||||
|
|
||||||
dispatch_once(&onceToken, ^
|
|
||||||
{
|
|
||||||
fileTypesByFileExtensions =
|
|
||||||
@{
|
|
||||||
@"mp3": @(kAudioFileMP3Type),
|
|
||||||
@"wav": @(kAudioFileWAVEType),
|
|
||||||
@"aifc": @(kAudioFileAIFCType),
|
|
||||||
@"aiff": @(kAudioFileAIFFType),
|
|
||||||
@"m4a": @(kAudioFileM4AType),
|
|
||||||
@"mp4": @(kAudioFileMPEG4Type),
|
|
||||||
@"caf": @(kAudioFileCAFType),
|
|
||||||
@"aac": @(kAudioFileAAC_ADTSType),
|
|
||||||
@"ac3": @(kAudioFileAC3Type),
|
|
||||||
@"3gp": @(kAudioFile3GPType)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
NSNumber* number = [fileTypesByFileExtensions objectForKey:fileExtension];
|
|
||||||
|
|
||||||
if (!number)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (AudioFileTypeID)number.intValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(AudioFileTypeID) audioFileTypeHint
|
|
||||||
{
|
|
||||||
return audioFileTypeHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) dealloc
|
|
||||||
{
|
|
||||||
[self close];
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) close
|
|
||||||
{
|
|
||||||
if (stream)
|
|
||||||
{
|
|
||||||
[self unregisterForEvents];
|
|
||||||
|
|
||||||
CFReadStreamClose(stream);
|
|
||||||
|
|
||||||
stream = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) open
|
|
||||||
{
|
|
||||||
if (stream)
|
|
||||||
{
|
|
||||||
[self unregisterForEvents];
|
|
||||||
|
|
||||||
CFReadStreamClose(stream);
|
|
||||||
CFRelease(stream);
|
|
||||||
|
|
||||||
stream = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSURL* url = [[NSURL alloc] initFileURLWithPath:self.filePath];
|
|
||||||
|
|
||||||
stream = CFReadStreamCreateWithFile(NULL, (__bridge CFURLRef)url);
|
|
||||||
|
|
||||||
NSError* fileError;
|
|
||||||
NSFileManager* manager = [[NSFileManager alloc] init];
|
|
||||||
NSDictionary* attributes = [manager attributesOfItemAtPath:filePath error:&fileError];
|
|
||||||
|
|
||||||
if (fileError)
|
|
||||||
{
|
|
||||||
CFReadStreamClose(stream);
|
|
||||||
CFRelease(stream);
|
|
||||||
stream = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSNumber* number = [attributes objectForKey:@"NSFileSize"];
|
|
||||||
|
|
||||||
if (number)
|
|
||||||
{
|
|
||||||
length = number.longLongValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
[self reregisterForEvents];
|
|
||||||
|
|
||||||
CFReadStreamOpen(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(SInt64) position
|
|
||||||
{
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(SInt64) length
|
|
||||||
{
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(int) readIntoBuffer:(UInt8*)buffer withSize:(int)size
|
|
||||||
{
|
|
||||||
int retval = (int)CFReadStreamRead(stream, buffer, size);
|
|
||||||
|
|
||||||
if (retval > 0)
|
|
||||||
{
|
|
||||||
position += retval;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NSNumber* property = (__bridge_transfer NSNumber*)CFReadStreamCopyProperty(stream, kCFStreamPropertyFileCurrentOffset);
|
|
||||||
|
|
||||||
position = property.longLongValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) seekToOffset:(SInt64)offset
|
|
||||||
{
|
|
||||||
CFStreamStatus status = kCFStreamStatusClosed;
|
|
||||||
|
|
||||||
if (stream != 0)
|
|
||||||
{
|
|
||||||
status = CFReadStreamGetStatus(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL reopened = NO;
|
|
||||||
|
|
||||||
if (status == kCFStreamStatusAtEnd || status == kCFStreamStatusClosed || status == kCFStreamStatusError)
|
|
||||||
{
|
|
||||||
reopened = YES;
|
|
||||||
|
|
||||||
[self close];
|
|
||||||
[self open];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stream == 0)
|
|
||||||
{
|
|
||||||
CFRunLoopPerformBlock(eventsRunLoop.getCFRunLoop, NSRunLoopCommonModes, ^
|
|
||||||
{
|
|
||||||
[self errorOccured];
|
|
||||||
});
|
|
||||||
|
|
||||||
CFRunLoopWakeUp(eventsRunLoop.getCFRunLoop);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CFReadStreamSetProperty(stream, kCFStreamPropertyFileCurrentOffset, (__bridge CFTypeRef)[NSNumber numberWithLongLong:offset]) != TRUE)
|
|
||||||
{
|
|
||||||
position = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
position = offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!reopened)
|
|
||||||
{
|
|
||||||
CFRunLoopPerformBlock(eventsRunLoop.getCFRunLoop, NSRunLoopCommonModes, ^
|
|
||||||
{
|
|
||||||
if ([self hasBytesAvailable])
|
|
||||||
{
|
|
||||||
[self dataAvailable];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
CFRunLoopWakeUp(eventsRunLoop.getCFRunLoop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSString*) description
|
|
||||||
{
|
|
||||||
return self->filePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
//
|
|
||||||
// STKQueueEntry.h
|
|
||||||
// StreamingKit
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 30/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "STKDataSource.h"
|
|
||||||
#import "libkern/OSAtomic.h"
|
|
||||||
#import "AudioToolbox/AudioToolbox.h"
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
|
||||||
|
|
||||||
@interface STKQueueEntry : NSObject
|
|
||||||
{
|
|
||||||
@public
|
|
||||||
OSSpinLock spinLock;
|
|
||||||
|
|
||||||
BOOL parsedHeader;
|
|
||||||
Float64 sampleRate;
|
|
||||||
double packetDuration;
|
|
||||||
UInt64 audioDataOffset;
|
|
||||||
UInt64 audioDataByteCount;
|
|
||||||
UInt32 packetBufferSize;
|
|
||||||
volatile Float64 seekTime;
|
|
||||||
volatile SInt64 framesQueued;
|
|
||||||
volatile SInt64 framesPlayed;
|
|
||||||
volatile SInt64 lastFrameQueued;
|
|
||||||
volatile int processedPacketsCount;
|
|
||||||
volatile int processedPacketsSizeTotal;
|
|
||||||
AudioStreamBasicDescription audioStreamBasicDescription;
|
|
||||||
double durationHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
@property (readonly) UInt64 audioDataLengthInBytes;
|
|
||||||
@property (readwrite, retain) NSObject* queueItemId;
|
|
||||||
@property (readwrite, retain) STKDataSource* dataSource;
|
|
||||||
|
|
||||||
-(instancetype) initWithDataSource:(STKDataSource*)dataSource andQueueItemId:(NSObject*)queueItemId;
|
|
||||||
|
|
||||||
-(void) reset;
|
|
||||||
-(double) duration;
|
|
||||||
-(Float64) progressInFrames;
|
|
||||||
-(double) calculatedBitRate;
|
|
||||||
-(BOOL) isDefinitelyCompatible:(AudioStreamBasicDescription*)basicDescription;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
|
||||||
|
|
@ -1,124 +0,0 @@
|
||||||
//
|
|
||||||
// STKQueueEntry.m
|
|
||||||
// StreamingKit
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 30/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "STKQueueEntry.h"
|
|
||||||
#import "STKDataSource.h"
|
|
||||||
|
|
||||||
#define STK_BIT_RATE_ESTIMATION_MIN_PACKETS_MIN (2)
|
|
||||||
#define STK_BIT_RATE_ESTIMATION_MIN_PACKETS_PREFERRED (64)
|
|
||||||
|
|
||||||
@implementation STKQueueEntry
|
|
||||||
|
|
||||||
-(instancetype) initWithDataSource:(STKDataSource*)dataSourceIn andQueueItemId:(NSObject*)queueItemIdIn
|
|
||||||
{
|
|
||||||
if (self = [super init])
|
|
||||||
{
|
|
||||||
self->spinLock = OS_SPINLOCK_INIT;
|
|
||||||
|
|
||||||
self.dataSource = dataSourceIn;
|
|
||||||
self.queueItemId = queueItemIdIn;
|
|
||||||
self->lastFrameQueued = -1;
|
|
||||||
self->durationHint = dataSourceIn.durationHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(void) reset
|
|
||||||
{
|
|
||||||
OSSpinLockLock(&self->spinLock);
|
|
||||||
self->framesQueued = 0;
|
|
||||||
self->framesPlayed = 0;
|
|
||||||
self->lastFrameQueued = -1;
|
|
||||||
OSSpinLockUnlock(&self->spinLock);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(double) calculatedBitRate
|
|
||||||
{
|
|
||||||
double retval;
|
|
||||||
|
|
||||||
if (packetDuration > 0)
|
|
||||||
{
|
|
||||||
if (processedPacketsCount > STK_BIT_RATE_ESTIMATION_MIN_PACKETS_PREFERRED || (audioStreamBasicDescription.mBytesPerFrame == 0 && processedPacketsCount > STK_BIT_RATE_ESTIMATION_MIN_PACKETS_MIN))
|
|
||||||
{
|
|
||||||
double averagePacketByteSize = (double)processedPacketsSizeTotal / (double)processedPacketsCount;
|
|
||||||
|
|
||||||
retval = averagePacketByteSize / packetDuration * 8;
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
retval = (audioStreamBasicDescription.mBytesPerFrame * audioStreamBasicDescription.mSampleRate) * 8;
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(double) duration
|
|
||||||
{
|
|
||||||
if (durationHint > 0.0) return durationHint;
|
|
||||||
|
|
||||||
if (self->sampleRate <= 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt64 audioDataLengthInBytes = [self audioDataLengthInBytes];
|
|
||||||
|
|
||||||
double calculatedBitRate = [self calculatedBitRate];
|
|
||||||
|
|
||||||
if (calculatedBitRate < 1.0 || self.dataSource.length == 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return audioDataLengthInBytes / (calculatedBitRate / 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(UInt64) audioDataLengthInBytes
|
|
||||||
{
|
|
||||||
if (audioDataByteCount)
|
|
||||||
{
|
|
||||||
return audioDataByteCount;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!self.dataSource.length)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self.dataSource.length - audioDataOffset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-(BOOL) isDefinitelyCompatible:(AudioStreamBasicDescription*)basicDescription
|
|
||||||
{
|
|
||||||
if (self->audioStreamBasicDescription.mSampleRate == 0)
|
|
||||||
{
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (memcmp(&(self->audioStreamBasicDescription), basicDescription, sizeof(*basicDescription)) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
-(Float64) progressInFrames
|
|
||||||
{
|
|
||||||
OSSpinLockLock(&self->spinLock);
|
|
||||||
Float64 retval = (self->seekTime * self->audioStreamBasicDescription.mSampleRate) + self->framesPlayed;
|
|
||||||
OSSpinLockUnlock(&self->spinLock);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
-(NSString*) description
|
|
||||||
{
|
|
||||||
return [[self queueItemId] description];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
//
|
|
||||||
// Prefix header
|
|
||||||
//
|
|
||||||
// The contents of this file are implicitly included at the beginning of every source file.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifdef __OBJC__
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
//
|
|
||||||
// Prefix header
|
|
||||||
//
|
|
||||||
// The contents of this file are implicitly included at the beginning of every source file.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifdef __OBJC__
|
|
||||||
#import <Cocoa/Cocoa.h>
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
//
|
|
||||||
// StreamingKitMac.h
|
|
||||||
// StreamingKitMac
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 02/02/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
|
|
||||||
@interface StreamingKitMac : NSObject
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
//
|
|
||||||
// StreamingKitMac.m
|
|
||||||
// StreamingKitMac
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 02/02/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "StreamingKitMac.h"
|
|
||||||
|
|
||||||
@implementation StreamingKitMac
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>en</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>BNDL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
//
|
|
||||||
// StreamingKitMacTests.m
|
|
||||||
// StreamingKitMacTests
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 02/02/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <XCTest/XCTest.h>
|
|
||||||
|
|
||||||
@interface StreamingKitMacTests : XCTestCase
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation StreamingKitMacTests
|
|
||||||
|
|
||||||
- (void)setUp
|
|
||||||
{
|
|
||||||
[super setUp];
|
|
||||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)tearDown
|
|
||||||
{
|
|
||||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
||||||
[super tearDown];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testExample
|
|
||||||
{
|
|
||||||
XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
/* Localized versions of Info.plist keys */
|
|
||||||
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>en</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>BNDL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
//
|
|
||||||
// StreamingKitTests.m
|
|
||||||
// StreamingKitTests
|
|
||||||
//
|
|
||||||
// Created by Thong Nguyen on 20/01/2014.
|
|
||||||
// Copyright (c) 2014 Thong Nguyen. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <XCTest/XCTest.h>
|
|
||||||
|
|
||||||
@interface StreamingKitTests : XCTestCase
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation StreamingKitTests
|
|
||||||
|
|
||||||
- (void)setUp
|
|
||||||
{
|
|
||||||
[super setUp];
|
|
||||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)tearDown
|
|
||||||
{
|
|
||||||
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
|
||||||
[super tearDown];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)testExample
|
|
||||||
{
|
|
||||||
XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
/* Localized versions of Info.plist keys */
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,146 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>
|
||||||
|
This is a custom SVG webfont generated by Font Squirrel.
|
||||||
|
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||||
|
Foundry : Ascender Corporation
|
||||||
|
Foundry URL : httpwwwascendercorpcom
|
||||||
|
</metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="OpenSansBold" horiz-adv-x="1169" >
|
||||||
|
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||||
|
<missing-glyph horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="	" horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="!" horiz-adv-x="586" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM121 1462h346l-51 -977h-244z" />
|
||||||
|
<glyph unicode=""" horiz-adv-x="967" d="M133 1462h279l-41 -528h-197zM555 1462h279l-41 -528h-197z" />
|
||||||
|
<glyph unicode="#" horiz-adv-x="1323" d="M45 406v206h277l47 232h-252v209h289l77 407h219l-77 -407h198l78 407h215l-78 -407h240v-209h-279l-47 -232h258v-206h-297l-77 -406h-220l78 406h-194l-76 -406h-215l74 406h-238zM539 612h196l47 232h-196z" />
|
||||||
|
<glyph unicode="$" d="M88 1049q0 145 113.5 238.5t316.5 113.5v153h137v-149q229 -10 414 -92l-94 -234q-156 64 -320 78v-295q195 -75 277.5 -130t121 -121t38.5 -154q0 -159 -115 -255.5t-322 -115.5v-205h-137v201q-244 5 -428 86v264q87 -43 209.5 -76t218.5 -39v310l-67 26 q-198 78 -280.5 169.5t-82.5 226.5zM389 1049q0 -44 30.5 -72.5t98.5 -58.5v235q-129 -19 -129 -104zM655 324q136 23 136 118q0 42 -34 71t-102 60v-249z" />
|
||||||
|
<glyph unicode="%" horiz-adv-x="1845" d="M63 1026q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5q0 -230 -89 -345.5t-261 -115.5q-165 0 -255 118.5t-90 342.5zM315 1024q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5zM395 0l811 1462h240l-811 -1462h-240z M1087 442q0 457 345 457q169 0 259.5 -118.5t90.5 -338.5q0 -229 -89 -344.5t-261 -115.5q-165 0 -255 118.5t-90 341.5zM1339 440q0 -127 22.5 -189.5t72.5 -62.5q96 0 96 252q0 250 -96 250q-50 0 -72.5 -61.5t-22.5 -188.5z" />
|
||||||
|
<glyph unicode="&" horiz-adv-x="1536" d="M82 395q0 137 60.5 233.5t207.5 180.5q-75 86 -109 164.5t-34 171.5q0 152 116.5 245t311.5 93q186 0 297.5 -86.5t111.5 -231.5q0 -119 -69 -217.5t-223 -187.5l284 -277q71 117 123 301h318q-36 -135 -99 -263.5t-143 -227.5l301 -293h-377l-115 113 q-191 -133 -432 -133q-244 0 -387 112t-143 303zM403 424q0 -86 64.5 -137t165.5 -51q126 0 227 61l-332 330q-58 -44 -91.5 -92t-33.5 -111zM489 1124q0 -88 95 -194q86 48 132 94.5t46 108.5q0 53 -36 83.5t-93 30.5q-67 0 -105.5 -32t-38.5 -91z" />
|
||||||
|
<glyph unicode="'" horiz-adv-x="545" d="M133 1462h279l-41 -528h-197z" />
|
||||||
|
<glyph unicode="(" horiz-adv-x="694" d="M82 561q0 265 77.5 496t223.5 405h250q-141 -193 -213 -424t-72 -475q0 -245 73.5 -473.5t209.5 -413.5h-248q-147 170 -224 397t-77 488z" />
|
||||||
|
<glyph unicode=")" horiz-adv-x="694" d="M61 1462h250q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-248q135 184 209 412.5t74 474.5q0 244 -72 475t-213 424z" />
|
||||||
|
<glyph unicode="*" horiz-adv-x="1116" d="M63 1042l39 250l365 -104l-41 368h262l-41 -368l373 104l33 -252l-340 -24l223 -297l-227 -121l-156 313l-137 -311l-236 119l221 297z" />
|
||||||
|
<glyph unicode="+" d="M88 612v219h387v390h219v-390h387v-219h-387v-385h-219v385h-387z" />
|
||||||
|
<glyph unicode="," horiz-adv-x="594" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220z" />
|
||||||
|
<glyph unicode="-" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||||
|
<glyph unicode="." horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
|
||||||
|
<glyph unicode="/" horiz-adv-x="846" d="M14 0l545 1462h277l-545 -1462h-277z" />
|
||||||
|
<glyph unicode="0" d="M74 731q0 387 125 570.5t385 183.5q253 0 382.5 -192t129.5 -562q0 -383 -125.5 -567t-386.5 -184q-253 0 -381.5 190t-128.5 561zM381 731q0 -269 46.5 -385.5t156.5 -116.5q108 0 156 118t48 384q0 269 -48.5 386.5t-155.5 117.5q-109 0 -156 -117.5t-47 -386.5z" />
|
||||||
|
<glyph unicode="1" d="M121 1087l471 375h254v-1462h-309v846l3 139l5 152q-77 -77 -107 -101l-168 -135z" />
|
||||||
|
<glyph unicode="2" d="M78 1274q108 92 179 130t155 58.5t188 20.5q137 0 242 -50t163 -140t58 -206q0 -101 -35.5 -189.5t-110 -181.5t-262.5 -265l-188 -177v-14h637v-260h-1022v215l367 371q163 167 213 231.5t72 119.5t22 114q0 88 -48.5 131t-129.5 43q-85 0 -165 -39t-167 -111z" />
|
||||||
|
<glyph unicode="3" d="M78 59v263q85 -43 187 -70t202 -27q153 0 226 52t73 167q0 103 -84 146t-268 43h-111v237h113q170 0 248.5 44.5t78.5 152.5q0 166 -208 166q-72 0 -146.5 -24t-165.5 -83l-143 213q200 144 477 144q227 0 358.5 -92t131.5 -256q0 -137 -83 -233t-233 -132v-6 q177 -22 268 -107.5t91 -230.5q0 -211 -153 -328.5t-437 -117.5q-238 0 -422 79z" />
|
||||||
|
<glyph unicode="4" d="M35 303v215l641 944h285v-919h176v-240h-176v-303h-302v303h-624zM307 543h352v248q0 62 5 180t8 137h-8q-37 -82 -89 -160z" />
|
||||||
|
<glyph unicode="5" d="M100 59v267q79 -42 184 -68.5t199 -26.5q283 0 283 232q0 221 -293 221q-53 0 -117 -10.5t-104 -22.5l-123 66l55 745h793v-262h-522l-27 -287l35 7q61 14 151 14q212 0 337.5 -119t125.5 -326q0 -245 -151 -377t-432 -132q-244 0 -394 79z" />
|
||||||
|
<glyph unicode="6" d="M72 621q0 434 183.5 646t549.5 212q125 0 196 -15v-247q-89 20 -176 20q-159 0 -259.5 -48t-150.5 -142t-59 -267h13q99 170 317 170q196 0 307 -123t111 -340q0 -234 -132 -370.5t-366 -136.5q-162 0 -282.5 75t-186 219t-65.5 347zM379 510q0 -119 62.5 -201t158.5 -82 q99 0 152 66.5t53 189.5q0 107 -49.5 168.5t-149.5 61.5q-94 0 -160.5 -61t-66.5 -142z" />
|
||||||
|
<glyph unicode="7" d="M55 1200v260h1049v-194l-553 -1266h-324l549 1200h-721z" />
|
||||||
|
<glyph unicode="8" d="M72 371q0 125 66.5 222t213.5 171q-125 79 -180 169t-55 197q0 157 130 254t339 97q210 0 338.5 -95.5t128.5 -257.5q0 -112 -62 -199.5t-200 -156.5q164 -88 235.5 -183.5t71.5 -209.5q0 -180 -141 -289.5t-371 -109.5q-240 0 -377 102t-137 289zM358 389q0 -86 60 -134 t164 -48q115 0 172 49.5t57 130.5q0 67 -56.5 125.5t-183.5 124.5q-213 -98 -213 -248zM408 1106q0 -60 38.5 -107.5t139.5 -97.5q98 46 137 94t39 111q0 69 -50 109t-128 40q-79 0 -127.5 -40.5t-48.5 -108.5z" />
|
||||||
|
<glyph unicode="9" d="M66 971q0 235 133.5 371.5t363.5 136.5q162 0 283.5 -76t186.5 -220.5t65 -344.5q0 -432 -182 -645t-551 -213q-130 0 -197 14v248q84 -21 176 -21q155 0 255 45.5t153 143t61 268.5h-12q-58 -94 -134 -132t-190 -38q-191 0 -301 122.5t-110 340.5zM365 975 q0 -106 49 -168t149 -62q94 0 161 61.5t67 141.5q0 119 -62.5 201t-159.5 82q-96 0 -150 -66t-54 -190z" />
|
||||||
|
<glyph unicode=":" horiz-adv-x="584" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" />
|
||||||
|
<glyph unicode=";" horiz-adv-x="594" d="M63 -264q65 266 101 502h280l15 -23q-52 -202 -176 -479h-220zM117 969q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -81 -46.5 -125.5t-127.5 -44.5q-84 0 -130 44t-46 126z" />
|
||||||
|
<glyph unicode="<" d="M88 641v143l993 496v-240l-684 -317l684 -281v-239z" />
|
||||||
|
<glyph unicode="=" d="M88 418v219h993v-219h-993zM88 805v219h993v-219h-993z" />
|
||||||
|
<glyph unicode=">" d="M88 203v239l684 281l-684 317v240l993 -496v-143z" />
|
||||||
|
<glyph unicode="?" horiz-adv-x="977" d="M6 1358q223 125 473 125q206 0 327.5 -99t121.5 -264q0 -110 -50 -190t-190 -180q-96 -71 -121.5 -108t-25.5 -97v-60h-265v74q0 96 41 167t150 151q105 75 138.5 122t33.5 105q0 65 -48 99t-134 34q-150 0 -342 -98zM244 143q0 84 45 127t131 43q83 0 128.5 -44 t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
|
||||||
|
<glyph unicode="@" horiz-adv-x="1837" d="M102 602q0 247 108.5 448.5t309 316t461.5 114.5q220 0 393 -90t267 -256t94 -383q0 -144 -46 -263.5t-130 -187.5t-195 -68q-74 0 -131 35.5t-82 93.5h-16q-108 -129 -275 -129q-177 0 -279 106.5t-102 291.5q0 211 134 340t350 129q86 0 189.5 -16.5t170.5 -39.5 l-23 -489q0 -139 76 -139q64 0 102 93.5t38 244.5q0 161 -67 284.5t-188.5 188.5t-277.5 65q-202 0 -351 -83t-228.5 -239.5t-79.5 -361.5q0 -276 147.5 -423.5t427.5 -147.5q106 0 233 23.5t250 68.5v-192q-214 -91 -475 -91q-380 0 -592.5 200t-212.5 556zM711 627 q0 -211 172 -211q90 0 137 63.5t57 206.5l13 221q-51 11 -115 11q-125 0 -194.5 -78t-69.5 -213z" />
|
||||||
|
<glyph unicode="A" horiz-adv-x="1413" d="M0 0l516 1468h379l518 -1468h-334l-106 348h-533l-106 -348h-334zM518 608h381q-147 473 -165.5 535t-26.5 98q-33 -128 -189 -633z" />
|
||||||
|
<glyph unicode="B" horiz-adv-x="1376" d="M184 0v1462h455q311 0 451.5 -88.5t140.5 -281.5q0 -131 -61.5 -215t-163.5 -101v-10q139 -31 200.5 -116t61.5 -226q0 -200 -144.5 -312t-392.5 -112h-547zM494 256h202q128 0 189 49t61 150q0 182 -260 182h-192v-381zM494 883h180q126 0 182.5 39t56.5 129 q0 84 -61.5 120.5t-194.5 36.5h-163v-325z" />
|
||||||
|
<glyph unicode="C" horiz-adv-x="1305" d="M119 729q0 228 83 399.5t238.5 263t364.5 91.5q213 0 428 -103l-100 -252q-82 39 -165 68t-163 29q-175 0 -271 -131.5t-96 -366.5q0 -489 367 -489q154 0 373 77v-260q-180 -75 -402 -75q-319 0 -488 193.5t-169 555.5z" />
|
||||||
|
<glyph unicode="D" horiz-adv-x="1516" d="M184 0v1462h459q358 0 556 -189t198 -528q0 -361 -205.5 -553t-593.5 -192h-414zM494 256h133q448 0 448 481q0 471 -416 471h-165v-952z" />
|
||||||
|
<glyph unicode="E" horiz-adv-x="1147" d="M184 0v1462h842v-254h-532v-321h495v-254h-495v-377h532v-256h-842z" />
|
||||||
|
<glyph unicode="F" horiz-adv-x="1124" d="M184 0v1462h838v-254h-533v-377h496v-253h-496v-578h-305z" />
|
||||||
|
<glyph unicode="G" horiz-adv-x="1483" d="M119 733q0 354 202.5 552t561.5 198q225 0 434 -90l-103 -248q-160 80 -333 80q-201 0 -322 -135t-121 -363q0 -238 97.5 -363.5t283.5 -125.5q97 0 197 20v305h-277v258h580v-758q-141 -46 -265.5 -64.5t-254.5 -18.5q-331 0 -505.5 194.5t-174.5 558.5z" />
|
||||||
|
<glyph unicode="H" horiz-adv-x="1567" d="M184 0v1462h310v-573h579v573h309v-1462h-309v631h-579v-631h-310z" />
|
||||||
|
<glyph unicode="I" horiz-adv-x="678" d="M184 0v1462h310v-1462h-310z" />
|
||||||
|
<glyph unicode="J" horiz-adv-x="678" d="M-152 -150q80 -20 146 -20q102 0 146 63.5t44 198.5v1370h310v-1368q0 -256 -117 -390t-346 -134q-105 0 -183 22v258z" />
|
||||||
|
<glyph unicode="K" horiz-adv-x="1360" d="M184 0v1462h310v-669l122 172l396 497h344l-510 -647l514 -815h-352l-383 616l-131 -94v-522h-310z" />
|
||||||
|
<glyph unicode="L" horiz-adv-x="1157" d="M184 0v1462h310v-1206h593v-256h-903z" />
|
||||||
|
<glyph unicode="M" horiz-adv-x="1931" d="M184 0v1462h422l346 -1118h6l367 1118h422v-1462h-289v692q0 49 1.5 113t13.5 340h-9l-377 -1145h-284l-352 1147h-9q19 -350 19 -467v-680h-277z" />
|
||||||
|
<glyph unicode="N" horiz-adv-x="1665" d="M184 0v1462h391l635 -1095h7q-15 285 -15 403v692h279v-1462h-394l-636 1106h-9q19 -293 19 -418v-688h-277z" />
|
||||||
|
<glyph unicode="O" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -363 -180 -558t-516 -195t-516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" />
|
||||||
|
<glyph unicode="P" horiz-adv-x="1286" d="M184 0v1462h467q266 0 404.5 -114.5t138.5 -341.5q0 -236 -147.5 -361t-419.5 -125h-133v-520h-310zM494 774h102q143 0 214 56.5t71 164.5q0 109 -59.5 161t-186.5 52h-141v-434z" />
|
||||||
|
<glyph unicode="Q" horiz-adv-x="1630" d="M119 735q0 365 180.5 557.5t517.5 192.5t515.5 -194t178.5 -558q0 -258 -91.5 -432.5t-268.5 -255.5l352 -393h-397l-268 328h-23q-336 0 -516 195t-180 560zM444 733q0 -245 93 -369t278 -124q371 0 371 493q0 494 -369 494q-185 0 -279 -124.5t-94 -369.5z" />
|
||||||
|
<glyph unicode="R" horiz-adv-x="1352" d="M184 0v1462h426q298 0 441 -108.5t143 -329.5q0 -129 -71 -229.5t-201 -157.5q330 -493 430 -637h-344l-349 561h-165v-561h-310zM494 813h100q147 0 217 49t70 154q0 104 -71.5 148t-221.5 44h-94v-395z" />
|
||||||
|
<glyph unicode="S" horiz-adv-x="1128" d="M94 68v288q148 -66 250.5 -93t187.5 -27q102 0 156.5 39t54.5 116q0 43 -24 76.5t-70.5 64.5t-189.5 99q-134 63 -201 121t-107 135t-40 180q0 194 131.5 305t363.5 111q114 0 217.5 -27t216.5 -76l-100 -241q-117 48 -193.5 67t-150.5 19q-88 0 -135 -41t-47 -107 q0 -41 19 -71.5t60.5 -59t196.5 -102.5q205 -98 281 -196.5t76 -241.5q0 -198 -142.5 -312t-396.5 -114q-234 0 -414 88z" />
|
||||||
|
<glyph unicode="T" horiz-adv-x="1186" d="M41 1204v258h1104v-258h-397v-1204h-310v1204h-397z" />
|
||||||
|
<glyph unicode="U" horiz-adv-x="1548" d="M174 520v942h309v-895q0 -169 68 -248t225 -79q152 0 220.5 79.5t68.5 249.5v893h309v-946q0 -162 -72.5 -284t-209.5 -187t-324 -65q-282 0 -438 144.5t-156 395.5z" />
|
||||||
|
<glyph unicode="V" horiz-adv-x="1331" d="M0 1462h313l275 -870q23 -77 47.5 -179.5t30.5 -142.5q11 92 75 322l277 870h313l-497 -1462h-338z" />
|
||||||
|
<glyph unicode="W" horiz-adv-x="1980" d="M0 1462h305l187 -798q49 -221 71 -383q6 57 27.5 176.5t40.5 185.5l213 819h293l213 -819q14 -55 35 -168t32 -194q10 78 32 194.5t40 188.5l186 798h305l-372 -1462h-353l-198 768q-11 41 -37.5 169.5t-30.5 172.5q-6 -54 -30 -173.5t-37 -170.5l-197 -766h-352z" />
|
||||||
|
<glyph unicode="X" horiz-adv-x="1366" d="M0 0l485 754l-454 708h342l315 -526l309 526h334l-459 -725l494 -737h-354l-340 553l-340 -553h-332z" />
|
||||||
|
<glyph unicode="Y" horiz-adv-x="1278" d="M0 1462h336l303 -602l305 602h334l-485 -893v-569h-308v559z" />
|
||||||
|
<glyph unicode="Z" horiz-adv-x="1186" d="M49 0v201l701 1005h-682v256h1050v-200l-700 -1006h719v-256h-1088z" />
|
||||||
|
<glyph unicode="[" horiz-adv-x="678" d="M143 -324v1786h484v-211h-224v-1364h224v-211h-484z" />
|
||||||
|
<glyph unicode="\" horiz-adv-x="846" d="M12 1462h277l545 -1462h-277z" />
|
||||||
|
<glyph unicode="]" horiz-adv-x="678" d="M51 -113h223v1364h-223v211h484v-1786h-484v211z" />
|
||||||
|
<glyph unicode="^" horiz-adv-x="1090" d="M8 520l438 950h144l495 -950h-239l-322 643l-280 -643h-236z" />
|
||||||
|
<glyph unicode="_" horiz-adv-x="842" d="M-4 -184h850v-140h-850v140z" />
|
||||||
|
<glyph unicode="`" horiz-adv-x="1243" d="M332 1548v21h342q63 -101 235 -301v-27h-202q-63 44 -185 142.5t-190 164.5z" />
|
||||||
|
<glyph unicode="a" horiz-adv-x="1237" d="M86 334q0 178 124.5 262.5t375.5 93.5l194 6v49q0 170 -174 170q-134 0 -315 -81l-101 206q193 101 428 101q225 0 345 -98t120 -298v-745h-213l-59 152h-8q-77 -97 -158.5 -134.5t-212.5 -37.5q-161 0 -253.5 92t-92.5 262zM399 332q0 -129 148 -129q106 0 169.5 61 t63.5 162v92l-118 -4q-133 -4 -198 -48t-65 -134z" />
|
||||||
|
<glyph unicode="b" horiz-adv-x="1296" d="M160 0v1556h305v-362q0 -69 -12 -221h12q107 166 317 166q198 0 310 -154.5t112 -423.5q0 -277 -115.5 -429t-314.5 -152q-197 0 -309 143h-21l-51 -123h-233zM465 563q0 -180 53.5 -258t169.5 -78q94 0 149.5 86.5t55.5 251.5t-56 247.5t-153 82.5q-113 0 -165 -69.5 t-54 -229.5v-33z" />
|
||||||
|
<glyph unicode="c" horiz-adv-x="1053" d="M92 553q0 285 142 435.5t407 150.5q194 0 348 -76l-90 -236q-72 29 -134 47.5t-124 18.5q-238 0 -238 -338q0 -328 238 -328q88 0 163 23.5t150 73.5v-261q-74 -47 -149.5 -65t-190.5 -18q-522 0 -522 573z" />
|
||||||
|
<glyph unicode="d" horiz-adv-x="1296" d="M92 557q0 275 114.5 428.5t315.5 153.5q211 0 322 -164h10q-23 125 -23 223v358h306v-1556h-234l-59 145h-13q-104 -165 -317 -165q-197 0 -309.5 153t-112.5 424zM401 553q0 -165 57 -247.5t163 -82.5q117 0 171.5 68t59.5 231v33q0 180 -55.5 258t-180.5 78 q-102 0 -158.5 -86.5t-56.5 -251.5z" />
|
||||||
|
<glyph unicode="e" horiz-adv-x="1210" d="M92 551q0 281 140.5 434.5t388.5 153.5q237 0 369 -135t132 -373v-148h-721q5 -130 77 -203t202 -73q101 0 191 21t188 67v-236q-80 -40 -171 -59.5t-222 -19.5q-270 0 -422 149t-152 422zM408 686h428q-2 113 -59 174.5t-154 61.5t-152 -61.5t-63 -174.5z" />
|
||||||
|
<glyph unicode="f" horiz-adv-x="793" d="M41 889v147l168 82v82q0 191 94 279t301 88q158 0 281 -47l-78 -224q-92 29 -170 29q-65 0 -94 -38.5t-29 -98.5v-70h264v-229h-264v-889h-305v889h-168z" />
|
||||||
|
<glyph unicode="g" horiz-adv-x="1157" d="M6 -182q0 101 63 169t185 97q-47 20 -82 65.5t-35 96.5q0 64 37 106.5t107 83.5q-88 38 -139.5 122t-51.5 198q0 183 119 283t340 100q47 0 111.5 -8.5t82.5 -12.5h390v-155l-175 -45q48 -75 48 -168q0 -180 -125.5 -280.5t-348.5 -100.5l-55 3l-45 5q-47 -36 -47 -80 q0 -66 168 -66h190q184 0 280.5 -79t96.5 -232q0 -196 -163.5 -304t-469.5 -108q-234 0 -357.5 81.5t-123.5 228.5zM270 -158q0 -63 60.5 -99t169.5 -36q164 0 257 45t93 123q0 63 -55 87t-170 24h-158q-84 0 -140.5 -39.5t-56.5 -104.5zM381 752q0 -91 41.5 -144t126.5 -53 q86 0 126 53t40 144q0 202 -166 202q-168 0 -168 -202z" />
|
||||||
|
<glyph unicode="h" horiz-adv-x="1346" d="M160 0v1556h305v-317q0 -37 -7 -174l-7 -90h16q102 164 324 164q197 0 299 -106t102 -304v-729h-305v653q0 242 -180 242q-128 0 -185 -87t-57 -282v-526h-305z" />
|
||||||
|
<glyph unicode="i" horiz-adv-x="625" d="M147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150zM160 0v1118h305v-1118h-305z" />
|
||||||
|
<glyph unicode="j" horiz-adv-x="625" d="M-131 -227q70 -19 143 -19q77 0 112.5 43t35.5 127v1194h305v-1239q0 -178 -103 -274.5t-292 -96.5q-117 0 -201 25v240zM147 1407q0 149 166 149t166 -149q0 -71 -41.5 -110.5t-124.5 -39.5q-166 0 -166 150z" />
|
||||||
|
<glyph unicode="k" horiz-adv-x="1270" d="M160 0v1556h305v-694l-16 -254h4l133 170l313 340h344l-444 -485l471 -633h-352l-322 453l-131 -105v-348h-305z" />
|
||||||
|
<glyph unicode="l" horiz-adv-x="625" d="M160 0v1556h305v-1556h-305z" />
|
||||||
|
<glyph unicode="m" horiz-adv-x="2011" d="M160 0v1118h233l41 -143h17q45 77 130 120.5t195 43.5q251 0 340 -164h27q45 78 132.5 121t197.5 43q190 0 287.5 -97.5t97.5 -312.5v-729h-306v653q0 121 -40.5 181.5t-127.5 60.5q-112 0 -167.5 -80t-55.5 -254v-561h-305v653q0 121 -40.5 181.5t-127.5 60.5 q-117 0 -170 -86t-53 -283v-526h-305z" />
|
||||||
|
<glyph unicode="n" horiz-adv-x="1346" d="M160 0v1118h233l41 -143h17q51 81 140.5 122.5t203.5 41.5q195 0 296 -105.5t101 -304.5v-729h-305v653q0 121 -43 181.5t-137 60.5q-128 0 -185 -85.5t-57 -283.5v-526h-305z" />
|
||||||
|
<glyph unicode="o" horiz-adv-x="1268" d="M92 561q0 274 143 426t402 152q161 0 284 -70t189 -201t66 -307q0 -273 -144 -427t-401 -154q-161 0 -284 70.5t-189 202.5t-66 308zM403 561q0 -166 54.5 -251t177.5 -85q122 0 175.5 84.5t53.5 251.5q0 166 -54 249t-177 83q-122 0 -176 -82.5t-54 -249.5z" />
|
||||||
|
<glyph unicode="p" horiz-adv-x="1296" d="M160 -492v1610h248l43 -145h14q107 166 317 166q198 0 310 -153t112 -425q0 -179 -52.5 -311t-149.5 -201t-228 -69q-197 0 -309 143h-16q16 -140 16 -162v-453h-305zM465 563q0 -180 53.5 -258t169.5 -78q205 0 205 338q0 165 -50.5 247.5t-158.5 82.5 q-113 0 -165 -69.5t-54 -229.5v-33z" />
|
||||||
|
<glyph unicode="q" horiz-adv-x="1296" d="M92 557q0 274 114.5 428t313.5 154q106 0 185 -40t139 -124h8l27 143h258v-1610h-306v469q0 61 13 168h-13q-49 -81 -130 -123t-187 -42q-198 0 -310 152.5t-112 424.5zM403 553q0 -168 53.5 -251t166.5 -83q116 0 170 66.5t59 232.5v37q0 180 -55.5 258t-178.5 78 q-215 0 -215 -338z" />
|
||||||
|
<glyph unicode="r" horiz-adv-x="930" d="M160 0v1118h231l45 -188h15q52 94 140.5 151.5t192.5 57.5q62 0 103 -9l-23 -286q-37 10 -90 10q-146 0 -227.5 -75t-81.5 -210v-569h-305z" />
|
||||||
|
<glyph unicode="s" horiz-adv-x="1018" d="M92 827q0 149 115.5 230.5t327.5 81.5q202 0 393 -88l-92 -220q-84 36 -157 59t-149 23q-135 0 -135 -73q0 -41 43.5 -71t190.5 -89q131 -53 192 -99t90 -106t29 -143q0 -172 -119.5 -262t-357.5 -90q-122 0 -208 16.5t-161 48.5v252q85 -40 191.5 -67t187.5 -27 q166 0 166 96q0 36 -22 58.5t-76 51t-144 66.5q-129 54 -189.5 100t-88 105.5t-27.5 146.5z" />
|
||||||
|
<glyph unicode="t" horiz-adv-x="889" d="M47 889v129l168 102l88 236h195v-238h313v-229h-313v-539q0 -65 36.5 -96t96.5 -31q80 0 192 35v-227q-114 -51 -280 -51q-183 0 -266.5 92.5t-83.5 277.5v539h-146z" />
|
||||||
|
<glyph unicode="u" horiz-adv-x="1346" d="M154 389v729h305v-653q0 -121 43 -181.5t137 -60.5q128 0 185 85.5t57 283.5v526h305v-1118h-234l-41 143h-16q-49 -78 -139 -120.5t-205 -42.5q-197 0 -297 105.5t-100 303.5z" />
|
||||||
|
<glyph unicode="v" horiz-adv-x="1165" d="M0 1118h319l216 -637q36 -121 45 -229h6q5 96 45 229l215 637h319l-426 -1118h-313z" />
|
||||||
|
<glyph unicode="w" horiz-adv-x="1753" d="M20 1118h304l129 -495q31 -133 63 -367h6q4 76 35 241l16 85l138 536h336l131 -536q4 -22 12.5 -65t16.5 -91.5t14.5 -95t7.5 -74.5h6q9 72 32 197.5t33 169.5l134 495h299l-322 -1118h-332l-86 391l-116 494h-7l-204 -885h-328z" />
|
||||||
|
<glyph unicode="x" horiz-adv-x="1184" d="M10 0l379 571l-360 547h346l217 -356l219 356h346l-364 -547l381 -571h-347l-235 383l-236 -383h-346z" />
|
||||||
|
<glyph unicode="y" horiz-adv-x="1165" d="M0 1118h334l211 -629q27 -82 37 -194h6q11 103 43 194l207 629h327l-473 -1261q-65 -175 -185.5 -262t-281.5 -87q-79 0 -155 17v242q55 -13 120 -13q81 0 141.5 49.5t94.5 149.5l18 55z" />
|
||||||
|
<glyph unicode="z" horiz-adv-x="999" d="M55 0v180l518 705h-487v233h834v-198l-504 -687h522v-233h-883z" />
|
||||||
|
<glyph unicode="{" horiz-adv-x="807" d="M31 449v239q126 0 191 44t65 126v8v318q0 153 97 215.5t341 62.5v-225q-99 -3 -136.5 -38t-37.5 -103v-299q-6 -188 -234 -222v-12q234 -35 234 -212v-9v-299q0 -68 37 -103t137 -38v-226q-244 0 -341 62.5t-97 216.5v315q0 87 -65.5 133t-190.5 46z" />
|
||||||
|
<glyph unicode="|" horiz-adv-x="1128" d="M455 -465v2015h219v-2015h-219z" />
|
||||||
|
<glyph unicode="}" horiz-adv-x="807" d="M82 -98q99 2 136.5 36t37.5 105v299v11q0 86 59 139.5t174 70.5v12q-227 34 -233 222v299q0 70 -37 104t-137 37v225q167 0 262 -26.5t135.5 -84t40.5 -167.5v-318v-10q0 -84 61.5 -126t194.5 -42v-239q-125 0 -190.5 -41t-65.5 -138v-315q0 -112 -41 -169t-135.5 -83.5 t-261.5 -26.5v226z" />
|
||||||
|
<glyph unicode="~" d="M88 551v231q103 109 256 109q73 0 137.5 -16t139.5 -48q129 -55 227 -55q53 0 116 32t117 89v-231q-101 -109 -256 -109q-66 0 -126 13t-150 50q-131 56 -227 56q-55 0 -117.5 -33.5t-116.5 -87.5z" />
|
||||||
|
<glyph unicode="¢" d="M143 741q0 261 104.5 403t315.5 173v166h178v-158q166 -9 299 -74l-90 -235q-72 29 -134 47t-124 18q-121 0 -179 -83.5t-58 -254.5q0 -327 237 -327q82 0 148 15.5t166 60.5v-254q-127 -61 -265 -70v-188h-178v196q-420 59 -420 565z" />
|
||||||
|
<glyph unicode="£" d="M82 0v248q103 44 141.5 101t38.5 157v145h-178v219h178v195q0 201 114.5 309.5t323.5 108.5q195 0 390 -82l-93 -230q-157 64 -272 64q-78 0 -120 -44.5t-42 -127.5v-193h375v-219h-375v-143q0 -170 -151 -248h718v-260h-1048z" />
|
||||||
|
<glyph unicode="¥" d="M6 1462h316l262 -602l264 602h313l-383 -747h195v-178h-246v-138h246v-178h-246v-221h-287v221h-247v178h247v138h-247v178h190z" />
|
||||||
|
<glyph unicode="©" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223 t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304zM461 733q0 220 110.5 342.5t309.5 122.5q149 0 305 -78l-74 -168q-113 58 -217 58q-97 0 -150 -74t-53 -205q0 -280 203 -280q57 0 123 15t123 44v-191q-120 -57 -252 -57q-204 0 -316 125t-112 346z" />
|
||||||
|
<glyph unicode="­" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||||
|
<glyph unicode="®" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM242 731q0 -164 82 -305.5t224 -223t304 -81.5q164 0 305.5 82t223 224t81.5 304q0 164 -82 305.5t-224 223 t-304 81.5q-164 0 -305.5 -82t-223 -224t-81.5 -304zM543 272v916h264q181 0 265.5 -70t84.5 -213q0 -170 -143 -233l237 -400h-254l-178 338h-47v-338h-229zM772 778h31q66 0 94.5 28.5t28.5 94.5q0 65 -28 92t-97 27h-29v-242z" />
|
||||||
|
<glyph unicode="´" horiz-adv-x="1243" d="M332 1241v27q172 200 235 301h342v-21q-52 -52 -177.5 -154.5t-196.5 -152.5h-203z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="523" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="196" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="87" />
|
||||||
|
<glyph unicode="‐" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||||
|
<glyph unicode="‑" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||||
|
<glyph unicode="‒" horiz-adv-x="659" d="M61 424v250h537v-250h-537z" />
|
||||||
|
<glyph unicode="–" horiz-adv-x="1024" d="M82 436v230h860v-230h-860z" />
|
||||||
|
<glyph unicode="—" horiz-adv-x="2048" d="M82 436v230h1884v-230h-1884z" />
|
||||||
|
<glyph unicode="‘" horiz-adv-x="444" d="M25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" />
|
||||||
|
<glyph unicode="’" horiz-adv-x="444" d="M25 961q69 296 100 501h281l14 -22q-50 -197 -176 -479h-219z" />
|
||||||
|
<glyph unicode="“" horiz-adv-x="911" d="M25 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280zM492 983q22 91 72.5 228.5t103.5 250.5h219q-66 -267 -101 -501h-280z" />
|
||||||
|
<glyph unicode="”" horiz-adv-x="911" d="M25 961q69 296 100 501h281l14 -22q-50 -197 -176 -479h-219zM492 961q69 296 100 501h280l15 -22q-50 -197 -176 -479h-219z" />
|
||||||
|
<glyph unicode="•" horiz-adv-x="770" d="M98 748q0 154 74 235.5t213 81.5q137 0 212 -82t75 -235q0 -152 -75.5 -235t-211.5 -83q-138 0 -212.5 83t-74.5 235z" />
|
||||||
|
<glyph unicode="…" horiz-adv-x="1751" d="M117 143q0 84 45 127t131 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5zM700 143q0 84 45 127t132 43q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-85 0 -131 44.5t-46 125.5zM1284 143q0 84 45 127t131 43 q83 0 128.5 -44t45.5 -126q0 -79 -46 -124.5t-128 -45.5q-84 0 -130 44.5t-46 125.5z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode="€" d="M66 481v178h118q-4 23 -4 62l2 53h-116v176h133q37 242 199 382.5t405 140.5q188 0 352 -82l-98 -232q-69 31 -129 48.5t-125 17.5q-122 0 -201 -70.5t-102 -204.5h403v-176h-418l-2 -35v-47l2 -33h355v-178h-338q51 -243 321 -243q143 0 275 57v-256q-116 -59 -293 -59 q-245 0 -403 133t-199 368h-137z" />
|
||||||
|
<glyph unicode="™" horiz-adv-x="1534" d="M16 1313v149h564v-149h-199v-572h-168v572h-197zM625 741v721h247l160 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-142l-165 529h-7l4 -111v-418h-163z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
||||||
|
After Width: | Height: | Size: 25 KiB |
|
|
@ -0,0 +1,146 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>
|
||||||
|
This is a custom SVG webfont generated by Font Squirrel.
|
||||||
|
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||||
|
Foundry : Ascender Corporation
|
||||||
|
Foundry URL : httpwwwascendercorpcom
|
||||||
|
</metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="OpenSansBoldItalic" horiz-adv-x="1128" >
|
||||||
|
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||||
|
<missing-glyph horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="	" horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="!" horiz-adv-x="586" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM150 485l157 977h340l-256 -977h-241z" />
|
||||||
|
<glyph unicode=""" horiz-adv-x="928" d="M201 934l71 528h277l-152 -528h-196zM604 934l74 528h276l-151 -528h-199z" />
|
||||||
|
<glyph unicode="#" horiz-adv-x="1323" d="M41 408l18 206h277l70 232h-252l18 209h289l119 407h217l-117 -407h199l116 407h215l-116 -407h239l-18 -209h-279l-69 -232h258l-19 -206h-297l-116 -408h-220l117 408h-194l-115 -408h-215l113 408h-238zM553 614h197l69 232h-196z" />
|
||||||
|
<glyph unicode="$" d="M51 168v266q198 -107 404 -117l71 322q-163 61 -241 151t-78 214q0 173 127 279.5t350 121.5l35 151h139l-33 -151q166 -22 295 -90l-106 -232q-132 65 -242 74l-63 -299q131 -51 195 -99.5t97 -113t33 -149.5q0 -184 -125.5 -291.5t-367.5 -124.5l-39 -199h-140l44 201 q-209 12 -355 86zM502 1022q0 -79 80 -111l51 246q-62 -7 -96.5 -41t-34.5 -94zM594 322q63 9 102 45t39 98q0 46 -24.5 75.5t-59.5 43.5z" />
|
||||||
|
<glyph unicode="%" horiz-adv-x="1753" d="M115 885q0 169 55.5 311.5t148.5 214.5t216 72q137 0 211.5 -80t74.5 -238q0 -166 -56 -310t-151 -217t-217 -73q-139 0 -210.5 83.5t-71.5 236.5zM231 0l1088 1462h235l-1083 -1462h-240zM360 868q0 -96 56 -96q65 0 112 131t47 275q0 96 -57 96q-63 0 -110.5 -128.5 t-47.5 -277.5zM973 283q0 177 53 322.5t148 219.5t219 74q137 0 211.5 -78.5t74.5 -230.5q0 -167 -54 -313.5t-148 -220.5t-215 -74q-144 0 -216.5 78.5t-72.5 222.5zM1219 285q0 -97 55 -97q41 0 77 55t59.5 154.5t23.5 196.5q0 96 -58 96q-39 0 -75 -56t-59 -154t-23 -195 z" />
|
||||||
|
<glyph unicode="&" horiz-adv-x="1450" d="M68 358q0 145 78.5 248.5t273.5 200.5q-76 130 -76 258q0 195 117.5 307.5t316.5 112.5q169 0 266 -82.5t97 -224.5q0 -280 -365 -426l195 -263q44 57 80.5 121.5t78.5 173.5h300q-133 -313 -310 -497l205 -287h-350l-72 98q-175 -118 -403 -118q-209 0 -320.5 97.5 t-111.5 280.5zM383 387q0 -65 45.5 -108t116.5 -43q115 0 221 59l-225 328q-88 -51 -123 -104.5t-35 -131.5zM621 1085q0 -46 12 -92t29 -73q113 59 155.5 111t42.5 112q0 57 -30 82.5t-70 25.5q-66 0 -102.5 -46.5t-36.5 -119.5z" />
|
||||||
|
<glyph unicode="'" horiz-adv-x="522" d="M201 934l71 528h277l-152 -528h-196z" />
|
||||||
|
<glyph unicode="(" horiz-adv-x="694" d="M74 281q0 339 122.5 626.5t381.5 554.5h262q-255 -278 -377.5 -573.5t-122.5 -618.5q0 -308 117 -594h-234q-149 266 -149 605z" />
|
||||||
|
<glyph unicode=")" horiz-adv-x="694" d="M-147 -324q499 545 499 1192q0 307 -116 594h233q149 -264 149 -604q0 -342 -124 -630.5t-379 -551.5h-262z" />
|
||||||
|
<glyph unicode="*" horiz-adv-x="1116" d="M172 1141l86 237l338 -174l33 369l256 -51l-113 -353l387 29l-18 -254l-338 43l160 -336l-246 -73l-90 337l-197 -278l-207 164l275 248z" />
|
||||||
|
<glyph unicode="+" d="M109 612v219h366v369h219v-369h367v-219h-367v-364h-219v364h-366z" />
|
||||||
|
<glyph unicode="," horiz-adv-x="569" d="M-102 -264q74 167 194 502h285l8 -23q-118 -255 -262 -479h-225z" />
|
||||||
|
<glyph unicode="-" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||||
|
<glyph unicode="." horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
|
||||||
|
<glyph unicode="/" horiz-adv-x="862" d="M-90 0l809 1462h295l-809 -1462h-295z" />
|
||||||
|
<glyph unicode="0" d="M66 467q0 297 84 537t228 360.5t333 120.5q399 0 399 -473q0 -470 -168.5 -751t-472.5 -281q-198 0 -300.5 122t-102.5 365zM369 461q0 -115 27.5 -173.5t97.5 -58.5q81 0 150.5 106t116 301t46.5 386q0 111 -30.5 162t-92.5 51q-80 0 -149.5 -104t-117.5 -302t-48 -368z " />
|
||||||
|
<glyph unicode="1" d="M182 1114l566 348h249l-309 -1462h-305l180 829q35 152 76 287q-9 -8 -61.5 -47t-262.5 -170z" />
|
||||||
|
<glyph unicode="2" d="M-49 0l43 213l477 424q180 159 248.5 254.5t68.5 179.5q0 75 -41 114.5t-110 39.5q-66 0 -135.5 -33.5t-171.5 -118.5l-146 203q132 112 252 159.5t250 47.5q190 0 301 -98t111 -259q0 -107 -41 -201t-122.5 -188t-266.5 -245l-269 -222v-10h568l-54 -260h-962z" />
|
||||||
|
<glyph unicode="3" d="M14 59v267q84 -50 182 -75.5t191 -25.5q158 0 243 63.5t85 176.5q0 172 -258 172h-138l46 221h73q167 0 263 62t96 172q0 67 -43 104t-121 37q-134 0 -287 -100l-127 204q124 81 232.5 113.5t246.5 32.5q190 0 298 -90.5t108 -243.5q0 -156 -94.5 -262t-261.5 -135v-4 q131 -26 198.5 -106.5t67.5 -201.5q0 -133 -74 -238t-212 -163.5t-327 -58.5q-239 0 -387 79z" />
|
||||||
|
<glyph unicode="4" d="M-25 303l48 234l770 925h311l-195 -919h170l-51 -240h-170l-63 -303h-293l63 303h-590zM305 543h311l58 248q12 58 40 164t42 141h-6q-35 -63 -132 -181z" />
|
||||||
|
<glyph unicode="5" d="M27 61v269q174 -99 352 -99q154 0 241 71t87 194q0 94 -57.5 141t-166.5 47q-102 0 -213 -33l-104 78l207 733h755l-55 -262h-489l-88 -293q72 15 127 15q183 0 289 -103t106 -287q0 -167 -71.5 -292t-208.5 -192.5t-330 -67.5q-117 0 -218.5 23t-162.5 58z" />
|
||||||
|
<glyph unicode="6" d="M88 469q0 202 61 395.5t167.5 335t256.5 213.5t357 72q125 0 223 -27l-51 -246q-84 25 -191 25q-194 0 -313.5 -108t-185.5 -345h4q115 166 311 166q157 0 242.5 -97t85.5 -273q0 -169 -71 -313.5t-190.5 -215.5t-277.5 -71q-212 0 -320 127t-108 362zM383 422 q0 -91 40 -143t107 -52q99 0 161.5 94t62.5 236q0 71 -33.5 113.5t-102.5 42.5q-60 0 -114.5 -35.5t-87.5 -95.5t-33 -160z" />
|
||||||
|
<glyph unicode="7" d="M78 0l737 1202h-629l56 260h975l-41 -194l-752 -1268h-346z" />
|
||||||
|
<glyph unicode="8" d="M55 350q0 298 348 426q-165 132 -165 299q0 119 58 212.5t168 145.5t257 52q123 0 215.5 -42t141 -118t48.5 -174q0 -134 -80.5 -233.5t-230.5 -151.5q217 -141 217 -365q0 -122 -63.5 -218.5t-181 -149.5t-273.5 -53q-214 0 -336.5 100t-122.5 270zM352 383 q0 -81 50 -128.5t135 -47.5q93 0 147.5 53.5t54.5 138.5q0 73 -36.5 131.5t-120.5 112.5q-116 -45 -173 -107t-57 -153zM528 1094q0 -132 123 -201q185 72 185 221q0 68 -39.5 107t-102.5 39q-76 0 -121 -46.5t-45 -119.5z" />
|
||||||
|
<glyph unicode="9" d="M86 12v256q111 -41 227 -41q121 0 207.5 49t144 138.5t99.5 257.5h-4q-111 -158 -295 -158q-163 0 -252.5 103.5t-89.5 285.5q0 166 73 305.5t196 208t286 68.5q203 0 308.5 -123t105.5 -361q0 -280 -99 -533t-264 -370.5t-403 -117.5q-128 0 -240 32zM424 928 q0 -87 37.5 -131.5t105.5 -44.5q60 0 111.5 36.5t82 100t30.5 158.5q0 84 -35.5 137t-110.5 53q-65 0 -115.5 -42t-78 -114t-27.5 -153z" />
|
||||||
|
<glyph unicode=":" horiz-adv-x="584" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" />
|
||||||
|
<glyph unicode=";" horiz-adv-x="584" d="M-102 -264q74 167 194 502h285l8 -23q-118 -255 -262 -479h-225zM207 940q0 92 55.5 145.5t149.5 53.5q68 0 108.5 -38.5t40.5 -107.5q0 -86 -54.5 -140t-144.5 -54q-72 0 -113.5 36.5t-41.5 104.5z" />
|
||||||
|
<glyph unicode="<" d="M109 641v143l952 496v-240l-643 -317l643 -281v-239z" />
|
||||||
|
<glyph unicode="=" d="M109 418v219h952v-219h-952zM109 807v217h952v-217h-952z" />
|
||||||
|
<glyph unicode=">" d="M109 203v239l643 281l-643 317v240l952 -496v-143z" />
|
||||||
|
<glyph unicode="?" horiz-adv-x="940" d="M166 115q0 91 55 144.5t150 53.5q68 0 108.5 -38t40.5 -107q0 -87 -55 -141t-143 -54q-74 0 -115 38t-41 104zM178 1358q230 125 445 125q177 0 280 -87.5t103 -244.5q0 -83 -28.5 -149.5t-82.5 -123t-190 -147.5q-64 -43 -96.5 -73t-52.5 -64.5t-38 -108.5h-258l14 78 q19 103 73.5 177t172.5 155q124 84 157.5 127t33.5 96q0 119 -133 119q-50 0 -106.5 -16t-201.5 -84z" />
|
||||||
|
<glyph unicode="@" horiz-adv-x="1753" d="M92 500q0 279 120.5 497t343 341.5t497.5 123.5q318 0 499 -163.5t181 -458.5q0 -173 -64 -321t-177.5 -231t-254.5 -83q-88 0 -144.5 38.5t-72.5 108.5h-6q-50 -77 -113 -112t-147 -35q-127 0 -198 79.5t-71 229.5q0 147 67.5 276.5t187.5 205t268 75.5q185 0 327 -55 l-106 -420q-11 -44 -19 -76.5t-8 -64.5q0 -68 58 -68q66 0 124 64t92.5 171t34.5 214q0 213 -123.5 325.5t-359.5 112.5q-203 0 -366.5 -94t-255 -266t-91.5 -392q0 -243 134 -380.5t376 -137.5q117 0 219.5 20t221.5 66v-186q-230 -90 -465 -90q-217 0 -378 85.5 t-246 241.5t-85 359zM713 526q0 -65 24.5 -102t69.5 -37q141 0 213 270l57 222q-36 10 -82 10q-82 0 -145.5 -51.5t-100 -137t-36.5 -174.5z" />
|
||||||
|
<glyph unicode="A" horiz-adv-x="1286" d="M-123 0l766 1468h373l147 -1468h-297l-24 348h-473l-172 -348h-320zM494 608h333l-26 350q-10 131 -10 253v36q-44 -120 -109 -254z" />
|
||||||
|
<glyph unicode="B" horiz-adv-x="1270" d="M53 0l309 1462h426q229 0 346 -81.5t117 -243.5q0 -150 -83 -247.5t-236 -129.5v-6q100 -26 159.5 -96.5t59.5 -180.5q0 -229 -153 -353t-423 -124h-522zM412 256h180q117 0 183.5 58t66.5 161q0 162 -183 162h-165zM545 883h149q121 0 181.5 48.5t60.5 139.5 q0 137 -170 137h-152z" />
|
||||||
|
<glyph unicode="C" horiz-adv-x="1253" d="M123 553q0 262 104 482.5t278 335t400 114.5q125 0 222 -22.5t208 -82.5l-118 -250q-106 59 -175 78t-137 19q-132 0 -237.5 -81t-169.5 -238.5t-64 -338.5q0 -167 68.5 -248t218.5 -81q146 0 338 77v-260q-199 -77 -400 -77q-254 0 -395 149.5t-141 423.5z" />
|
||||||
|
<glyph unicode="D" horiz-adv-x="1386" d="M53 0l309 1462h396q270 0 417.5 -143t147.5 -410q0 -280 -98 -486.5t-283.5 -314.5t-437.5 -108h-451zM412 256h106q148 0 258 76t172 223.5t62 337.5q0 154 -72.5 234.5t-208.5 80.5h-115z" />
|
||||||
|
<glyph unicode="E" horiz-adv-x="1110" d="M53 0l309 1462h818l-54 -254h-512l-67 -321h477l-55 -254h-477l-80 -377h512l-54 -256h-817z" />
|
||||||
|
<glyph unicode="F" horiz-adv-x="1087" d="M53 0l309 1462h814l-54 -254h-508l-79 -377h473l-56 -253h-473l-121 -578h-305z" />
|
||||||
|
<glyph unicode="G" horiz-adv-x="1413" d="M123 549q0 268 107 484.5t301 334t448 117.5q218 0 410 -99l-115 -251q-74 40 -148 64t-161 24q-153 0 -273.5 -83t-189 -236.5t-68.5 -330.5q0 -172 72.5 -252.5t222.5 -80.5q76 0 170 24l66 299h-267l56 258h563l-162 -762q-134 -46 -248.5 -62.5t-242.5 -16.5 q-259 0 -400 147t-141 422z" />
|
||||||
|
<glyph unicode="H" horiz-adv-x="1434" d="M53 0l309 1462h306l-121 -573h471l121 573h305l-309 -1462h-306l134 631h-471l-134 -631h-305z" />
|
||||||
|
<glyph unicode="I" horiz-adv-x="659" d="M53 0l312 1462h305l-312 -1462h-305z" />
|
||||||
|
<glyph unicode="J" horiz-adv-x="678" d="M-322 -150q88 -20 164 -20q99 0 160.5 60.5t89.5 191.5l293 1380h305l-303 -1423q-52 -245 -175.5 -357t-346.5 -112q-94 0 -187 27v253z" />
|
||||||
|
<glyph unicode="K" horiz-adv-x="1255" d="M53 0l309 1462h306l-152 -702l158 205l409 497h361l-594 -700l291 -762h-338l-211 592l-125 -70l-109 -522h-305z" />
|
||||||
|
<glyph unicode="L" horiz-adv-x="1061" d="M53 0l309 1462h306l-256 -1206h512l-54 -256h-817z" />
|
||||||
|
<glyph unicode="M" horiz-adv-x="1802" d="M53 0l309 1462h404l68 -1093h4l551 1093h423l-309 -1462h-280l145 692q53 247 105 441h-5l-569 -1133h-281l-61 1133h-4q-11 -88 -38 -231t-187 -902h-275z" />
|
||||||
|
<glyph unicode="N" horiz-adv-x="1546" d="M53 0l309 1462h357l340 -1077h4q12 76 39 217t180 860h274l-309 -1462h-342l-356 1106h-6l-4 -32q-32 -216 -66 -386l-145 -688h-275z" />
|
||||||
|
<glyph unicode="O" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -283 -99 -506.5t-271 -337.5t-396 -114q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5q-121 0 -222 -91.5 t-158.5 -251.5t-57.5 -347z" />
|
||||||
|
<glyph unicode="P" horiz-adv-x="1188" d="M53 0l309 1462h338q242 0 366 -106.5t124 -319.5q0 -241 -169.5 -378.5t-467.5 -137.5h-86l-109 -520h-305zM522 774h56q142 0 223.5 69t81.5 185q0 180 -195 180h-74z" />
|
||||||
|
<glyph unicode="Q" horiz-adv-x="1495" d="M123 537q0 265 99 487.5t273 341.5t402 119q255 0 395 -144t140 -403q0 -316 -122.5 -555.5t-334.5 -337.5l254 -393h-359l-178 328h-26q-256 0 -399.5 147.5t-143.5 409.5zM434 537q0 -147 66.5 -222t187.5 -75t220.5 87t155.5 246t56 357q0 142 -65 219.5t-183 77.5 q-121 0 -222 -91.5t-158.5 -251.5t-57.5 -347z" />
|
||||||
|
<glyph unicode="R" horiz-adv-x="1247" d="M53 0l309 1462h359q237 0 356 -102t119 -299q0 -158 -83 -271.5t-239 -168.5l261 -621h-332l-207 561h-119l-119 -561h-305zM530 813h78q131 0 204 57t73 174q0 82 -47.5 123t-149.5 41h-74z" />
|
||||||
|
<glyph unicode="S" horiz-adv-x="1085" d="M41 70v274q193 -108 358 -108q112 0 175 42.5t63 116.5q0 43 -13.5 75.5t-38.5 60.5t-124 102q-138 99 -194 196t-56 209q0 129 62 230.5t176.5 158t263.5 56.5q217 0 397 -99l-109 -233q-156 74 -288 74q-83 0 -136 -45t-53 -119q0 -61 33 -106.5t148 -120.5 q121 -80 181 -176.5t60 -225.5q0 -209 -148 -330.5t-401 -121.5q-221 0 -356 90z" />
|
||||||
|
<glyph unicode="T" horiz-adv-x="1087" d="M168 1204l55 258h1010l-55 -258h-353l-254 -1204h-305l254 1204h-352z" />
|
||||||
|
<glyph unicode="U" horiz-adv-x="1415" d="M141 401q0 72 15 138l196 923h305l-194 -919q-17 -74 -17 -125q0 -178 189 -178q123 0 195 76.5t104 228.5l194 917h306l-201 -946q-57 -266 -218 -401t-419 -135q-212 0 -333.5 113.5t-121.5 307.5z" />
|
||||||
|
<glyph unicode="V" horiz-adv-x="1208" d="M184 1462h295l51 -880q4 -45 4 -133q-2 -103 -6 -150h7q78 221 110 283l432 880h316l-748 -1462h-334z" />
|
||||||
|
<glyph unicode="W" horiz-adv-x="1831" d="M184 1462h287l6 -798q0 -52 -4 -173t-10 -174h6q22 64 67 180.5t60 145.5l369 819h270l21 -873q0 -146 -9 -272h6q43 129 131 349l330 796h309l-647 -1462h-346l-22 721l-2 139q0 88 4 158h-4q-46 -146 -115 -299l-324 -719h-338z" />
|
||||||
|
<glyph unicode="X" horiz-adv-x="1241" d="M-117 0l576 764l-238 698h320l153 -518l363 518h344l-545 -725l268 -737h-331l-172 543l-396 -543h-342z" />
|
||||||
|
<glyph unicode="Y" horiz-adv-x="1155" d="M186 1462h312l129 -592l374 592h342l-618 -903l-119 -559h-303l119 559z" />
|
||||||
|
<glyph unicode="Z" horiz-adv-x="1098" d="M-61 0l38 201l777 1005h-543l53 256h936l-41 -202l-782 -1004h596l-53 -256h-981z" />
|
||||||
|
<glyph unicode="[" horiz-adv-x="678" d="M-37 -324l381 1786h473l-45 -211h-215l-291 -1364h215l-45 -211h-473z" />
|
||||||
|
<glyph unicode="\" horiz-adv-x="862" d="M221 1462h260l224 -1462h-267z" />
|
||||||
|
<glyph unicode="]" horiz-adv-x="678" d="M-137 -324l45 211h213l291 1364h-215l45 211h473l-381 -1786h-471z" />
|
||||||
|
<glyph unicode="^" horiz-adv-x="1081" d="M20 520l619 950h147l277 -950h-223l-174 633l-402 -633h-244z" />
|
||||||
|
<glyph unicode="_" horiz-adv-x="819" d="M-186 -324l30 140h822l-31 -140h-821z" />
|
||||||
|
<glyph unicode="`" horiz-adv-x="1135" d="M508 1548v21h311q36 -148 115 -303v-25h-184q-71 69 -138.5 153.5t-103.5 153.5z" />
|
||||||
|
<glyph unicode="a" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q97 0 167.5 -42t109.5 -122h8l57 143h232l-238 -1118h-229l14 145h-4q-134 -165 -319 -165q-147 0 -231.5 106.5t-84.5 298.5zM395 399q0 -88 33.5 -132t95.5 -44q69 0 133 67t103 181.5t39 259.5q0 71 -38.5 117.5t-101.5 46.5 q-68 0 -129.5 -72t-98 -190t-36.5 -234z" />
|
||||||
|
<glyph unicode="b" horiz-adv-x="1219" d="M37 0l330 1556h301l-62 -288q-41 -182 -84 -299h8q78 98 142.5 134t140.5 36q146 0 230.5 -108t84.5 -298t-68 -367.5t-187 -281.5t-263 -104q-194 0 -276 163h-8l-58 -143h-231zM420 399q0 -80 37 -128t102 -48q67 0 128 69t98.5 189.5t37.5 237.5q0 176 -131 176 q-68 0 -130 -65t-102 -180.5t-40 -250.5z" />
|
||||||
|
<glyph unicode="c" horiz-adv-x="989" d="M90 391q0 212 74.5 385.5t209.5 268t308 94.5q182 0 328 -72l-92 -229q-54 23 -106 40t-118 17q-85 0 -153.5 -64t-107 -175.5t-38.5 -239.5q0 -96 45.5 -144.5t126.5 -48.5q76 0 141 23.5t134 58.5v-246q-152 -79 -336 -79q-201 0 -308.5 107.5t-107.5 303.5z" />
|
||||||
|
<glyph unicode="d" horiz-adv-x="1217" d="M90 387q0 196 71.5 374.5t188.5 278t258 99.5q82 0 141.5 -37t112.5 -127h8l2 28q6 110 25 195l76 358h301l-330 -1556h-229l14 145h-4q-71 -87 -148.5 -126t-170.5 -39q-147 0 -231.5 107t-84.5 300zM395 399q0 -176 137 -176q66 0 128.5 68.5t100.5 182.5t38 245 q0 80 -37.5 128t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234z" />
|
||||||
|
<glyph unicode="e" horiz-adv-x="1141" d="M90 412q0 207 82.5 377.5t223.5 260t319 89.5q177 0 276 -81.5t99 -223.5q0 -187 -167 -288.5t-477 -101.5h-51l-2 -21v-20q0 -91 51.5 -143.5t147.5 -52.5q87 0 158 19t172 67v-227q-172 -86 -390 -86q-210 0 -326 113t-116 319zM428 647h45q155 0 241.5 48.5 t86.5 131.5q0 95 -105 95q-88 0 -166 -80t-102 -195z" />
|
||||||
|
<glyph unicode="f" horiz-adv-x="764" d="M-219 -225q61 -21 115 -21q61 0 107 40t65 130l204 965h-163l30 145l183 84l18 84q41 190 138.5 277.5t273.5 87.5q131 0 235 -49l-80 -224q-69 31 -133 31q-57 0 -92 -40t-47 -105l-12 -62h219l-49 -229h-220l-215 -1010q-77 -371 -403 -371q-104 0 -174 25v242z" />
|
||||||
|
<glyph unicode="g" horiz-adv-x="1108" d="M-115 -209q0 102 68.5 175.5t214.5 121.5q-74 47 -74 133q0 71 44.5 122.5t146.5 98.5q-65 49 -96 112t-31 153q0 199 125.5 315.5t341.5 116.5q83 0 166 -23h395l-35 -166l-174 -41q16 -52 16 -118q0 -195 -121 -308.5t-329 -113.5q-59 0 -99 10q-84 -27 -84 -78 q0 -34 30 -49t89 -23l137 -18q163 -21 237.5 -84.5t74.5 -183.5q0 -211 -156 -323t-446 -112q-208 0 -324.5 75.5t-116.5 207.5zM150 -172q0 -115 194 -115q151 0 228 45t77 127q0 39 -32.5 60t-137.5 35l-114 14q-106 -14 -160.5 -57t-54.5 -109zM442 680q0 -119 103 -119 q75 0 121.5 76.5t46.5 193.5t-99 117q-77 0 -124.5 -76.5t-47.5 -191.5z" />
|
||||||
|
<glyph unicode="h" horiz-adv-x="1237" d="M37 0l330 1556h301q-39 -181 -60 -278t-86 -309h8q62 77 138 123.5t176 46.5q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" />
|
||||||
|
<glyph unicode="i" horiz-adv-x="608" d="M37 0l237 1118h301l-237 -1118h-301zM322 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" />
|
||||||
|
<glyph unicode="j" horiz-adv-x="608" d="M-264 -225q61 -21 114 -21q137 0 173 170l253 1194h302l-265 -1239q-77 -371 -403 -371q-104 0 -174 25v242zM324 1380q0 87 47.5 131.5t134.5 44.5q73 0 111 -31t38 -89q0 -80 -44 -129.5t-136 -49.5q-151 0 -151 123z" />
|
||||||
|
<glyph unicode="k" horiz-adv-x="1163" d="M37 0l330 1556h301l-148 -694q-8 -41 -29 -117l-28 -102h4l453 475h344l-498 -504l285 -614h-336l-183 420l-120 -72l-74 -348h-301z" />
|
||||||
|
<glyph unicode="l" horiz-adv-x="608" d="M37 0l330 1556h301l-330 -1556h-301z" />
|
||||||
|
<glyph unicode="m" horiz-adv-x="1853" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q219 0 262 -228h6q68 110 160.5 169t197.5 59q136 0 207.5 -85t71.5 -237q0 -76 -23 -180l-133 -637h-301l138 653q16 68 16 119q0 123 -98 123q-92 0 -166.5 -112t-118.5 -318l-96 -465h-301l137 653q16 68 16 119 q0 123 -98 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" />
|
||||||
|
<glyph unicode="n" horiz-adv-x="1237" d="M37 0l237 1118h230l-21 -207h6q146 228 355 228q138 0 213.5 -83.5t75.5 -238.5q0 -73 -23 -180l-133 -637h-301l137 653q16 68 16 119q0 123 -108 123q-92 0 -167 -114t-118 -318l-98 -463h-301z" />
|
||||||
|
<glyph unicode="o" horiz-adv-x="1198" d="M90 410q0 213 71.5 379.5t206.5 258t316 91.5q196 0 310 -118t114 -325q0 -211 -70.5 -374t-203.5 -252.5t-316 -89.5q-195 0 -311.5 117.5t-116.5 312.5zM393 410q0 -185 150 -185q75 0 135 61.5t93.5 171t33.5 238.5q0 197 -143 197q-75 0 -134.5 -61t-97 -179 t-37.5 -243z" />
|
||||||
|
<glyph unicode="p" horiz-adv-x="1219" d="M-68 -492l342 1610h230l-17 -170h9q138 191 317 191q146 0 230.5 -107.5t84.5 -300.5q0 -191 -68.5 -367.5t-187.5 -280t-262 -103.5q-83 0 -143 37t-111 126h-8q-12 -159 -43 -295l-72 -340h-301zM420 399q0 -80 37 -128t102 -48q67 0 128 69t98.5 189.5t37.5 237.5 q0 176 -131 176q-68 0 -131.5 -67.5t-102 -180t-38.5 -248.5z" />
|
||||||
|
<glyph unicode="q" horiz-adv-x="1217" d="M90 385q0 198 72 377.5t189 278t257 98.5q86 0 152.5 -37.5t124.5 -126.5h8l57 143h232l-342 -1610h-301q47 218 73 337.5t84 304.5h-8q-72 -94 -143 -132t-154 -38q-88 0 -156 47.5t-106.5 138.5t-38.5 219zM395 399q0 -88 36.5 -132t103.5 -44q64 0 127.5 70t100 181 t36.5 245q0 80 -37.5 128t-102.5 48q-68 0 -129.5 -72t-98 -190t-36.5 -234z" />
|
||||||
|
<glyph unicode="r" horiz-adv-x="862" d="M37 0l237 1118h230l-21 -207h6q147 228 353 228q59 0 96 -11l-66 -290q-45 16 -100 16q-116 0 -203.5 -91.5t-124.5 -262.5l-106 -500h-301z" />
|
||||||
|
<glyph unicode="s" horiz-adv-x="969" d="M23 45v248q157 -90 319 -90q80 0 131 32.5t51 88.5q0 43 -37 77t-131 86q-121 68 -169 135.5t-48 159.5q0 170 110.5 263.5t315.5 93.5q201 0 363 -95l-99 -215q-140 84 -258 84q-57 0 -92 -25.5t-35 -68.5q0 -39 32 -68.5t120 -74.5q123 -63 178 -137t55 -170 q0 -188 -124.5 -288.5t-346.5 -100.5q-107 0 -186.5 15t-148.5 50z" />
|
||||||
|
<glyph unicode="t" horiz-adv-x="840" d="M94 889l29 147l196 84l132 236h194l-49 -238h283l-50 -229h-282l-115 -539q-6 -30 -6 -53q0 -74 88 -74q65 0 162 35v-225q-111 -53 -266 -53q-150 0 -220.5 63t-70.5 195q0 50 12 112l115 539h-152z" />
|
||||||
|
<glyph unicode="u" horiz-adv-x="1237" d="M111 301q0 93 24 213l127 604h301l-137 -653q-16 -68 -16 -119q0 -123 108 -123q92 0 167 114t118 318l98 463h301l-237 -1118h-230l21 207h-6q-145 -227 -355 -227q-138 0 -211 82.5t-73 238.5z" />
|
||||||
|
<glyph unicode="v" horiz-adv-x="1049" d="M102 1118h295l45 -586q7 -133 7 -231h6q55 153 92 223l297 594h323l-604 -1118h-323z" />
|
||||||
|
<glyph unicode="w" horiz-adv-x="1614" d="M125 1118h281l4 -495l-4 -167l-7 -171h4q6 20 14 41.5t51 136.5t46 119l231 536h328v-536q0 -142 -10 -297h6l28 80q73 208 95 258l219 495h307l-530 -1118h-330l-6 520q0 155 10 340h-6q-62 -178 -123 -319l-233 -541h-324z" />
|
||||||
|
<glyph unicode="x" horiz-adv-x="1087" d="M-100 0l479 573l-225 545h321l115 -334l244 334h354l-467 -561l244 -557h-326l-125 342l-264 -342h-350z" />
|
||||||
|
<glyph unicode="y" horiz-adv-x="1063" d="M-141 -233q68 -13 116 -13q84 0 147.5 48t117.5 149l26 49l-164 1118h295l56 -518q14 -122 14 -293h6q20 51 44 119.5t65 153.5l260 538h327l-680 -1278q-177 -332 -483 -332q-90 0 -147 19v240z" />
|
||||||
|
<glyph unicode="z" horiz-adv-x="932" d="M-47 0l35 180l575 705h-397l51 233h750l-43 -200l-566 -685h439l-49 -233h-795z" />
|
||||||
|
<glyph unicode="{" horiz-adv-x="727" d="M-8 459l45 229q122 0 192.5 41.5t92.5 138.5l61 285q38 170 131 239.5t270 69.5h84l-49 -225q-90 -2 -130.5 -34.5t-55.5 -106.5l-66 -297q-45 -207 -276 -236v-8q85 -26 126.5 -82.5t41.5 -134.5q0 -44 -15 -113l-36 -178q-7 -28 -7 -51q0 -54 33.5 -74t91.5 -20v-226 h-53q-167 0 -253.5 63.5t-86.5 184.5q0 57 14 125l39 184q15 69 15 86q0 140 -209 140z" />
|
||||||
|
<glyph unicode="|" d="M455 -465v2015h219v-2015h-219z" />
|
||||||
|
<glyph unicode="}" horiz-adv-x="727" d="M-100 -98q93 3 137 35.5t59 105.5l66 297q25 111 95 166t181 69v9q-168 51 -168 217q0 43 15 112l37 179q6 30 6 51q0 54 -36.5 74t-109.5 20l41 225h33q340 0 340 -248q0 -56 -14 -124l-39 -185q-15 -69 -15 -86q0 -139 209 -139l-45 -229q-122 0 -192.5 -42t-91.5 -139 l-62 -284q-37 -170 -130.5 -240t-270.5 -70h-45v226z" />
|
||||||
|
<glyph unicode="~" d="M109 551v231q101 109 256 109q64 0 117 -14t139 -50q64 -27 111 -41t95 -14q51 0 112 30.5t122 90.5v-231q-103 -109 -256 -109q-59 0 -109 11.5t-147 51.5q-89 38 -127 47t-80 9q-54 0 -116.5 -33t-116.5 -88z" />
|
||||||
|
<glyph unicode="¢" d="M164 584q0 193 62.5 355t178 262.5t267.5 123.5l33 158h188l-35 -158q118 -14 225 -65l-92 -230q-53 23 -105 40t-118 17q-133 0 -216 -143t-83 -336q0 -96 45 -144t127 -48q75 0 140 23.5t134 58.5v-246q-136 -71 -299 -80l-41 -192h-188l49 210q-134 36 -203 136 t-69 258z" />
|
||||||
|
<glyph unicode="£" d="M-12 0l49 246q196 48 244 264l22 104h-192l45 220h192l49 247q41 197 162 300.5t313 103.5q195 0 369 -86l-113 -232q-141 68 -237 68q-75 0 -123 -39.5t-68 -132.5l-47 -229h299l-45 -220h-299l-18 -84q-42 -195 -209 -270h655l-55 -260h-993z" />
|
||||||
|
<glyph unicode="¥" d="M88 221l37 178h252l29 138h-252l39 178h196l-192 747h297l114 -590l371 590h311l-506 -747h203l-39 -178h-252l-28 -138h252l-37 -178h-252l-47 -221h-291l47 221h-252z" />
|
||||||
|
<glyph unicode="©" horiz-adv-x="1704" d="M125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5 t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304zM485 721q0 225 117.5 351t325.5 126q142 0 284 -72l-75 -174q-114 58 -205 58q-111 0 -163 -73t-52 -214q0 -134 55.5 -203t159.5 -69q43 0 108.5 15.5t124.5 43.5v-191q-131 -57 -262 -57 q-196 0 -307 122.5t-111 336.5z" />
|
||||||
|
<glyph unicode="­" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||||
|
<glyph unicode="®" horiz-adv-x="1704" d="M125 731q0 200 100 375t275 276t377 101q199 0 373.5 -99t276 -275.5t101.5 -377.5q0 -199 -98.5 -373t-272.5 -276t-380 -102q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM266 731q0 -164 81.5 -305t224 -223t305.5 -82q167 0 308 83t221.5 223.5t80.5 303.5 t-80.5 303.5t-222 223.5t-307.5 83q-164 0 -306.5 -82.5t-223.5 -223.5t-81 -304zM571 293v874h308q173 0 265.5 -67.5t92.5 -200.5q0 -86 -44 -149.5t-130 -96.5l197 -360h-254l-138 297h-67v-297h-230zM801 758h51q72 0 113 31t41 92q0 59 -35.5 88.5t-116.5 29.5h-53 v-241z" />
|
||||||
|
<glyph unicode="´" horiz-adv-x="1135" d="M483 1241v25q79 88 222 303h335v-17q-46 -56 -154 -152.5t-194 -158.5h-209z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="786" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1573" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="786" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1573" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="524" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="393" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="262" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="262" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="196" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="314" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="87" />
|
||||||
|
<glyph unicode="‐" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||||
|
<glyph unicode="‑" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||||
|
<glyph unicode="‒" horiz-adv-x="659" d="M41 424l53 250h524l-53 -250h-524z" />
|
||||||
|
<glyph unicode="–" horiz-adv-x="983" d="M41 436l49 230h852l-49 -230h-852z" />
|
||||||
|
<glyph unicode="—" horiz-adv-x="1966" d="M41 436l49 230h1835l-49 -230h-1835z" />
|
||||||
|
<glyph unicode="‘" horiz-adv-x="440" d="M115 983q103 227 262 479h225q-91 -213 -194 -501h-285z" />
|
||||||
|
<glyph unicode="’" horiz-adv-x="440" d="M106 961q89 206 195 501h285l8 -22q-103 -227 -262 -479h-226z" />
|
||||||
|
<glyph unicode="“" horiz-adv-x="887" d="M115 983q103 227 262 479h225q-91 -213 -194 -501h-285zM561 983q103 227 262 479h226q-97 -227 -195 -501h-285z" />
|
||||||
|
<glyph unicode="”" horiz-adv-x="887" d="M106 961q89 206 195 501h285l8 -22q-103 -227 -262 -479h-226zM553 961q23 53 46.5 111t148.5 390h284l8 -22q-103 -227 -262 -479h-225z" />
|
||||||
|
<glyph unicode="•" horiz-adv-x="739" d="M104 686q0 106 42.5 194t120 136.5t182.5 48.5q120 0 182.5 -67t62.5 -191q0 -177 -91.5 -277t-248.5 -100q-117 0 -183.5 67t-66.5 189z" />
|
||||||
|
<glyph unicode="…" horiz-adv-x="1706" d="M25 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM586 115q0 90 53.5 144t150.5 54q68 0 109 -38t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5zM1147 115q0 90 53.5 144t150.5 54q68 0 109 -38 t41 -107q0 -87 -55 -141t-144 -54q-73 0 -114 37.5t-41 104.5z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="314" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="393" />
|
||||||
|
<glyph unicode="€" d="M41 481l37 178h127q9 67 22 115h-125l39 176h135q87 252 250.5 393.5t374.5 141.5q100 0 179 -23t165 -80l-125 -223q-87 49 -131 63.5t-90 14.5q-97 0 -176 -74.5t-135 -212.5h348l-39 -176h-360q-11 -34 -25 -115h299l-37 -178h-280q0 -120 44.5 -181.5t147.5 -61.5 q133 0 283 63v-258q-126 -63 -330 -63q-446 0 -446 501h-152z" />
|
||||||
|
<glyph unicode="™" horiz-adv-x="1534" d="M106 1313v149h564v-149h-199v-572h-168v572h-197zM715 741v721h248l159 -510l170 510h240v-721h-168v408l4 121h-6l-174 -529h-141l-166 529h-7l5 -111v-418h-164z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1120" d="M0 1120h1120v-1120h-1120v1120z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
||||||
|
After Width: | Height: | Size: 26 KiB |
|
|
@ -0,0 +1,146 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>
|
||||||
|
This is a custom SVG webfont generated by Font Squirrel.
|
||||||
|
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||||
|
Foundry : Ascender Corporation
|
||||||
|
Foundry URL : httpwwwascendercorpcom
|
||||||
|
</metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="OpenSansItalic" horiz-adv-x="1128" >
|
||||||
|
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||||
|
<missing-glyph horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="	" horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="!" horiz-adv-x="530" d="M43 78q0 76 39.5 120t107.5 44q45 0 73 -27.5t28 -81.5q0 -68 -39 -115t-105 -47q-49 0 -76.5 28t-27.5 79zM172 403q49 307 176 1059h207l-274 -1059h-109z" />
|
||||||
|
<glyph unicode=""" horiz-adv-x="791" d="M225 934l72 528h188l-153 -528h-107zM573 934l72 528h189l-154 -528h-107z" />
|
||||||
|
<glyph unicode="#" horiz-adv-x="1323" d="M63 430l13 129h284l101 340h-277l13 127h301l123 436h139l-125 -436h305l127 436h133l-125 -436h264l-12 -127h-291l-98 -340h285l-13 -129h-309l-125 -430h-139l129 430h-303l-127 -430h-133l121 430h-261zM500 559h303l96 340h-303z" />
|
||||||
|
<glyph unicode="$" d="M72 176v154q82 -41 175.5 -63.5t166.5 -22.5l98 452q-139 49 -201.5 123.5t-62.5 188.5q0 159 108 255t299 113l39 176h133l-39 -178q159 -12 283 -76l-63 -135q-121 63 -248 72l-94 -440q149 -55 212.5 -125t63.5 -178q0 -162 -112.5 -263t-309.5 -123l-49 -225h-133 l49 223q-195 14 -315 72zM401 1010q0 -53 34.5 -97.5t107.5 -70.5l84 393q-108 -11 -167 -69t-59 -156zM549 250q107 13 170 75t63 154q0 54 -33 96t-114 74z" />
|
||||||
|
<glyph unicode="%" horiz-adv-x="1624" d="M168 860q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -72t60 -205q0 -108 -32 -237.5t-82.5 -217.5t-120.5 -137t-157 -49q-109 0 -170 75t-61 220zM231 0l1086 1462h151l-1085 -1462h-152zM307 864q0 -172 107 -172q52 0 94 39.5t73.5 114t50.5 175t19 171.5 q0 166 -108 166q-66 0 -119 -63t-85 -187.5t-32 -243.5zM909 274q0 166 50.5 318.5t136.5 228.5t200 76q116 0 176 -71.5t60 -204.5q0 -107 -31.5 -236t-82 -217.5t-121 -138t-156.5 -49.5q-110 0 -171 74.5t-61 219.5zM1049 279q0 -173 106 -173q65 0 117 65t86.5 198.5 t34.5 236.5q0 166 -109 166q-67 0 -119.5 -64.5t-84 -188.5t-31.5 -240z" />
|
||||||
|
<glyph unicode="&" horiz-adv-x="1372" d="M66 342q0 148 90 257.5t303 211.5q-103 165 -103 309q0 164 106 264.5t281 100.5q149 0 236.5 -79t87.5 -212q0 -78 -32.5 -137t-87.5 -108t-127.5 -90t-153.5 -83l278 -389q127 110 199 295h168q-101 -236 -283 -412l203 -270h-201l-117 166q-120 -100 -230 -143 t-247 -43q-168 0 -269 96t-101 266zM229 354q0 -106 66.5 -170.5t175.5 -64.5q87 0 168 33t195 124l-306 433q-128 -67 -184 -116t-85.5 -107.5t-29.5 -131.5zM516 1118q0 -120 82 -235q139 71 191 110t83 85t31 104q0 77 -42.5 121.5t-123.5 44.5q-105 0 -163 -60t-58 -170 z" />
|
||||||
|
<glyph unicode="'" horiz-adv-x="444" d="M225 934l72 528h188l-153 -528h-107z" />
|
||||||
|
<glyph unicode="(" horiz-adv-x="584" d="M82 272q0 339 120 627t384 563h157q-246 -270 -371.5 -570t-125.5 -618q0 -339 114 -598h-131q-147 266 -147 596z" />
|
||||||
|
<glyph unicode=")" horiz-adv-x="584" d="M-160 -324q496 551 496 1188q0 341 -113 598h131q146 -269 146 -598q0 -341 -121.5 -629.5t-382.5 -558.5h-156z" />
|
||||||
|
<glyph unicode="*" horiz-adv-x="1130" d="M215 1194l55 154l371 -185l41 400l172 -35l-123 -383l422 18l-8 -157l-393 47l180 -383l-166 -52l-113 406l-258 -344l-116 121l309 284z" />
|
||||||
|
<glyph unicode="+" d="M127 651v142h389v391h141v-391h390v-142h-390v-387h-141v387h-389z" />
|
||||||
|
<glyph unicode="," horiz-adv-x="492" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129z" />
|
||||||
|
<glyph unicode="-" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||||
|
<glyph unicode="." horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" />
|
||||||
|
<glyph unicode="/" horiz-adv-x="717" d="M-94 0l813 1462h174l-813 -1462h-174z" />
|
||||||
|
<glyph unicode="0" d="M121 477q0 270 82 514.5t216.5 369t307.5 124.5q365 0 365 -471q0 -295 -78.5 -539t-214 -369.5t-314.5 -125.5q-176 0 -270 127.5t-94 369.5zM293 479q0 -172 50 -264t161 -92q115 0 209 114t150.5 328t56.5 453q0 323 -203 323q-113 0 -209 -115.5t-155.5 -323 t-59.5 -423.5z" />
|
||||||
|
<glyph unicode="1" d="M303 1178l449 284h149l-313 -1462h-172l196 913q59 261 88 359q-50 -53 -139 -111l-178 -110z" />
|
||||||
|
<glyph unicode="2" d="M12 0l31 147l465 420q102 93 176.5 163.5t123 133t72 124t23.5 136.5q0 99 -60 157t-163 58q-77 0 -150.5 -28.5t-162.5 -96.5l-82 115q191 154 413 154q176 0 278.5 -88.5t102.5 -243.5q0 -111 -39.5 -204t-131 -197t-294.5 -281l-352 -307v-8h678l-29 -154h-899z" />
|
||||||
|
<glyph unicode="3" d="M47 59v164q94 -49 199 -75.5t190 -26.5q162 0 252 79.5t90 217.5q0 131 -79 198.5t-220 67.5h-131l31 143h139q165 0 274 87t109 227q0 92 -58 146t-157 54q-80 0 -157 -27t-175 -93l-80 118q195 144 424 144q179 0 277 -87t98 -237q0 -156 -101 -264.5t-280 -140.5v-9 q124 -23 195 -106.5t71 -208.5q0 -133 -62 -234.5t-181 -158.5t-283 -57q-210 0 -385 79z" />
|
||||||
|
<glyph unicode="4" d="M16 334l29 158l834 978h196l-207 -983h232l-33 -153h-233l-72 -334h-164l74 334h-656zM219 487h486q46 220 78 373t116 445h-8q-17 -29 -66.5 -96.5t-72.5 -96.5z" />
|
||||||
|
<glyph unicode="5" d="M80 59v164q164 -102 334 -102q191 0 298 96t107 268q0 126 -73.5 199.5t-204.5 73.5q-48 0 -97 -6.5t-139 -30.5l-74 57l197 684h668l-33 -153h-522l-127 -439q87 23 184 23q182 0 289.5 -104.5t107.5 -282.5q0 -161 -73 -283t-204 -182.5t-308 -60.5q-193 0 -330 79z " />
|
||||||
|
<glyph unicode="6" d="M133 424q0 209 60.5 415t163.5 351.5t246 219t327 73.5q111 0 184 -23l-35 -145q-68 22 -170 22q-212 0 -356.5 -149t-212.5 -443h8q59 79 146.5 126t193.5 47q154 0 244 -98.5t90 -270.5q0 -161 -66.5 -294.5t-180.5 -204t-261 -70.5q-182 0 -281.5 115t-99.5 329z M299 416q0 -137 60.5 -216t172.5 -79q94 0 167.5 54t114 149t40.5 208q0 248 -221 248q-66 0 -128 -28.5t-110 -76t-72 -104.5t-24 -155z" />
|
||||||
|
<glyph unicode="7" d="M174 0l768 1313h-719l31 149h891l-27 -139l-764 -1323h-180z" />
|
||||||
|
<glyph unicode="8" d="M96 346q0 148 95 256t296 184q-95 69 -135.5 144.5t-40.5 171.5q0 111 54.5 198.5t153.5 136t222 48.5q174 0 271.5 -86.5t97.5 -235.5q0 -129 -78 -225t-266 -176q127 -78 180 -165t53 -202q0 -122 -60 -217.5t-172.5 -146.5t-264.5 -51q-190 0 -298 98.5t-108 267.5z M270 354q0 -107 69 -170t181 -63q139 0 222 74t83 196q0 99 -52 174t-165 135q-185 -60 -261.5 -143.5t-76.5 -202.5zM479 1100q0 -82 39 -144t127 -116q161 60 228 131.5t67 173.5q0 90 -57.5 143t-153.5 53q-114 0 -182 -65.5t-68 -175.5z" />
|
||||||
|
<glyph unicode="9" d="M98 14v158q134 -47 246 -47q202 0 327 141t189 441h-10q-51 -75 -132.5 -118.5t-180.5 -43.5q-169 0 -261 98.5t-92 288.5q0 153 64.5 280.5t180 199t259.5 71.5q180 0 279.5 -114.5t99.5 -334.5q0 -194 -56 -406.5t-147.5 -360t-221.5 -217.5t-302 -70q-136 0 -242 34z M350 938q0 -124 54.5 -190t162.5 -66q76 0 140 28.5t108.5 81.5t65 114t20.5 151q0 131 -59 207.5t-160 76.5q-150 0 -241 -113t-91 -290z" />
|
||||||
|
<glyph unicode=":" horiz-adv-x="518" d="M43 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" />
|
||||||
|
<glyph unicode=";" horiz-adv-x="518" d="M-100 -264q126 286 204 502h187l8 -23q-113 -235 -270 -479h-129zM203 956q0 77 40 122.5t111 45.5q97 0 97 -104q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26.5t-27 75.5z" />
|
||||||
|
<glyph unicode="<" d="M121 664v98l919 479v-149l-747 -371l747 -328v-151z" />
|
||||||
|
<glyph unicode="=" d="M127 444v142h920v-142h-920zM127 858v139h920v-139h-920z" />
|
||||||
|
<glyph unicode=">" d="M121 242v151l745 328l-745 371v149l919 -479v-98z" />
|
||||||
|
<glyph unicode="?" horiz-adv-x="874" d="M158 74q0 77 40 122.5t111 45.5q44 0 70.5 -26t26.5 -79q0 -73 -41.5 -119.5t-106.5 -46.5q-46 0 -73 26t-27 77zM197 1382q92 51 192 76t182 25q167 0 259 -84t92 -238q0 -123 -65.5 -226.5t-225.5 -223.5q-125 -91 -169 -147.5t-67 -160.5h-135q22 130 72.5 213.5 t165.5 174.5q128 100 168 144t63 94t23 112q0 93 -51.5 143.5t-147.5 50.5q-81 0 -155 -25.5t-140 -56.5z" />
|
||||||
|
<glyph unicode="@" horiz-adv-x="1735" d="M111 504q0 261 126.5 485.5t343.5 347.5t486 123q191 0 329 -75.5t210.5 -213.5t72.5 -319q0 -179 -55 -324t-155 -227t-222 -82q-197 0 -213 184h-8q-111 -184 -291 -184q-115 0 -180.5 75.5t-65.5 209.5q0 157 68 284t188.5 199t260.5 72q65 0 127.5 -12t150.5 -48 q-64 -242 -98 -368t-31 -172q0 -117 102 -117q78 0 141.5 67t100.5 183.5t37 243.5q0 239 -128 367t-370 128q-228 0 -406.5 -107t-277 -295.5t-98.5 -416.5q0 -270 143.5 -418.5t409.5 -148.5q197 0 420 86v-127q-219 -90 -443 -90q-314 0 -494.5 184.5t-180.5 505.5z M639 518q0 -93 33 -134.5t98 -41.5q187 0 272 315l70 258q-63 23 -127 23q-94 0 -174 -55t-126 -153t-46 -212z" />
|
||||||
|
<glyph unicode="A" horiz-adv-x="1137" d="M-117 0l799 1462h174l184 -1462h-170l-57 465h-496l-245 -465h-189zM401 621h394l-35 299q-24 179 -29 350q-37 -88 -80.5 -175t-249.5 -474z" />
|
||||||
|
<glyph unicode="B" horiz-adv-x="1225" d="M86 0l309 1462h375q432 0 432 -336q0 -141 -87 -238t-245 -126v-10q115 -32 176.5 -110.5t61.5 -188.5q0 -212 -152 -332.5t-407 -120.5h-463zM287 145h266q181 0 278 80.5t97 227.5q0 116 -74.5 177.5t-214.5 61.5h-236zM434 836h248q156 0 249 73t93 199 q0 104 -66.5 155.5t-209.5 51.5h-211z" />
|
||||||
|
<glyph unicode="C" horiz-adv-x="1198" d="M150 537q0 261 105.5 485.5t283.5 342.5t403 118q197 0 348 -80l-69 -141q-138 69 -279 69q-174 0 -311.5 -97t-218 -284.5t-80.5 -408.5q0 -187 97.5 -298.5t268.5 -111.5q139 0 322 57v-149q-86 -31 -164 -45t-188 -14q-242 0 -380 149.5t-138 407.5z" />
|
||||||
|
<glyph unicode="D" horiz-adv-x="1364" d="M86 0l309 1462h342q276 0 419.5 -149.5t143.5 -435.5q0 -261 -105 -461t-300 -308t-457 -108h-352zM287 147h162q202 0 355 91.5t234.5 258.5t81.5 382t-103 325.5t-302 110.5h-178z" />
|
||||||
|
<glyph unicode="E" horiz-adv-x="1047" d="M86 0l309 1462h735l-32 -153h-566l-98 -469h527l-29 -152h-529l-114 -536h565l-33 -152h-735z" />
|
||||||
|
<glyph unicode="F" horiz-adv-x="967" d="M86 0l309 1462h735l-30 -153h-568l-110 -533h528l-32 -153h-529l-131 -623h-172z" />
|
||||||
|
<glyph unicode="G" horiz-adv-x="1386" d="M150 528q0 269 101.5 489.5t281.5 343t399 122.5q117 0 219.5 -20t206.5 -64l-66 -152q-77 34 -165.5 59t-194.5 25q-169 0 -307.5 -101.5t-215.5 -283.5t-77 -407q0 -190 102.5 -299t286.5 -109q154 0 260 39l96 444h-289l33 152h459l-154 -711q-216 -75 -419 -75 q-264 0 -410.5 144.5t-146.5 403.5z" />
|
||||||
|
<glyph unicode="H" horiz-adv-x="1389" d="M86 0l309 1462h170l-131 -622h660l133 622h168l-310 -1462h-167l143 688h-660l-145 -688h-170z" />
|
||||||
|
<glyph unicode="I" horiz-adv-x="559" d="M86 0l311 1462h168l-311 -1462h-168z" />
|
||||||
|
<glyph unicode="J" horiz-adv-x="547" d="M-319 -360l6 147q69 -20 145 -20q100 0 165.5 62.5t90.5 182.5l307 1450h170l-309 -1468q-79 -379 -422 -379q-105 0 -153 25z" />
|
||||||
|
<glyph unicode="K" horiz-adv-x="1141" d="M86 0l309 1462h170l-151 -710l700 710h209l-639 -637l350 -825h-186q-72 181 -146.5 359.5t-146.5 361.5l-174 -131l-125 -590h-170z" />
|
||||||
|
<glyph unicode="L" horiz-adv-x="971" d="M86 0l309 1462h170l-276 -1308h565l-33 -154h-735z" />
|
||||||
|
<glyph unicode="M" horiz-adv-x="1714" d="M84 0l309 1462h244l149 -1204h9l659 1204h266l-303 -1462h-174q126 590 193 905.5t94 392.5h-6l-717 -1298h-131l-166 1296h-8q-7 -72 -28.5 -197.5t-37.5 -199.5l-190 -899h-162z" />
|
||||||
|
<glyph unicode="N" horiz-adv-x="1438" d="M84 0l309 1462h180l459 -1220h6q30 224 72 405l174 815h164l-309 -1462h-181l-460 1223h-6q-32 -221 -74 -418l-172 -805h-162z" />
|
||||||
|
<glyph unicode="O" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -269 -88 -481.5t-252 -329t-379 -116.5q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q152 0 272.5 97.5t190.5 279.5t70 403q0 199 -94 310.5t-261 111.5q-157 0 -281 -101 t-192.5 -281t-68.5 -398z" />
|
||||||
|
<glyph unicode="P" horiz-adv-x="1159" d="M86 0l309 1462h330q214 0 324 -94.5t110 -282.5q0 -248 -164 -379t-481 -131h-135l-123 -575h-170zM410 721h133q216 0 328 91t112 267q0 125 -69.5 180.5t-213.5 55.5h-163z" />
|
||||||
|
<glyph unicode="Q" horiz-adv-x="1475" d="M150 549q0 264 96 482t263.5 336t377.5 118q244 0 384 -154t140 -424q0 -333 -139 -576t-375 -321l274 -358h-219l-227 330l-17 -2h-16q-256 0 -399 149.5t-143 419.5zM332 553q0 -199 98 -310.5t266 -111.5q158 0 279 100t187.5 280.5t66.5 399.5q0 199 -94 310.5 t-261 111.5q-157 0 -281 -101t-192.5 -281t-68.5 -398z" />
|
||||||
|
<glyph unicode="R" horiz-adv-x="1165" d="M86 0l309 1462h320q446 0 446 -366q0 -348 -368 -449l239 -647h-186l-209 608h-252l-129 -608h-170zM416 754h168q193 0 297 85t104 244q0 121 -67.5 175.5t-219.5 54.5h-166q-102 -494 -116 -559z" />
|
||||||
|
<glyph unicode="S" horiz-adv-x="1028" d="M39 43v170q162 -84 340 -84q162 0 257 75.5t95 207.5q0 78 -52.5 137.5t-195.5 140.5q-151 85 -209.5 170t-58.5 201q0 187 132 304.5t347 117.5q99 0 184.5 -19t180.5 -65l-66 -150q-66 38 -148 60t-151 22q-134 0 -215.5 -69.5t-81.5 -188.5q0 -54 17 -92.5t54 -72.5 t142 -95q147 -88 198.5 -138t78 -110.5t26.5 -140.5q0 -211 -140.5 -327.5t-395.5 -116.5q-106 0 -186.5 14.5t-151.5 48.5z" />
|
||||||
|
<glyph unicode="T" horiz-adv-x="1020" d="M186 1311l33 151h985l-30 -151h-408l-279 -1311h-172l277 1311h-406z" />
|
||||||
|
<glyph unicode="U" horiz-adv-x="1384" d="M164 383q0 81 24 201l189 878h170l-191 -891q-22 -106 -22 -188q0 -117 73 -184.5t218 -67.5q172 0 267.5 87.5t139.5 289.5l205 954h170l-205 -966q-55 -263 -197.5 -389.5t-388.5 -126.5q-230 0 -341 104t-111 299z" />
|
||||||
|
<glyph unicode="V" horiz-adv-x="1122" d="M188 1462h170l97 -930q20 -196 20 -335h4q61 144 162 338l479 927h191l-781 -1462h-180z" />
|
||||||
|
<glyph unicode="W" horiz-adv-x="1745" d="M223 1462h170l31 -901l2 -88q0 -98 -10 -258h6q89 243 156 383l405 864h178l43 -860q9 -153 9 -304l-1 -83h9q75 224 131 354l387 893h182l-664 -1462h-170l-49 965q-8 136 -8 282h-6q-25 -72 -61 -154.5t-504 -1092.5h-174z" />
|
||||||
|
<glyph unicode="X" horiz-adv-x="1063" d="M-104 0l596 776l-263 686h172l203 -563l443 563h186l-555 -694l278 -768h-180l-213 641l-481 -641h-186z" />
|
||||||
|
<glyph unicode="Y" horiz-adv-x="1030" d="M188 1462h170l179 -747l489 747h193l-627 -921l-113 -541h-172l119 549z" />
|
||||||
|
<glyph unicode="Z" horiz-adv-x="1087" d="M-16 0l28 137l924 1170h-655l32 155h858l-26 -139l-924 -1169h697l-33 -154h-901z" />
|
||||||
|
<glyph unicode="[" horiz-adv-x="586" d="M-16 -324l381 1786h387l-31 -141h-227l-318 -1503h227l-32 -142h-387z" />
|
||||||
|
<glyph unicode="\" horiz-adv-x="717" d="M221 1462h154l217 -1462h-154z" />
|
||||||
|
<glyph unicode="]" horiz-adv-x="586" d="M-150 -324l31 142h225l320 1503h-227l30 141h389l-380 -1786h-388z" />
|
||||||
|
<glyph unicode="^" horiz-adv-x="1059" d="M53 553l598 920h109l266 -920h-145l-201 747l-467 -747h-160z" />
|
||||||
|
<glyph unicode="_" horiz-adv-x="807" d="M-188 -324l30 140h811l-30 -140h-811z" />
|
||||||
|
<glyph unicode="`" horiz-adv-x="1135" d="M575 1548v21h181q43 -136 147 -303v-25h-104q-61 61 -128.5 154t-95.5 153z" />
|
||||||
|
<glyph unicode="a" horiz-adv-x="1157" d="M98 350q0 208 71 386t196 279t274 101q92 0 164 -49.5t112 -142.5h11l67 172h127l-233 -1096h-133l26 209h-8q-179 -229 -377 -229q-139 0 -218 99t-79 271zM270 346q0 -114 47 -170.5t132 -56.5q97 0 193 92.5t156 241t60 297.5q0 103 -56 164t-147 61 q-104 0 -193.5 -86t-140.5 -233t-51 -310z" />
|
||||||
|
<glyph unicode="b" horiz-adv-x="1182" d="M59 0l330 1556h168q-51 -242 -78.5 -370.5t-75.5 -300.5h9q93 118 183.5 173.5t186.5 55.5q141 0 220 -99t79 -272q0 -209 -68.5 -386.5t-191 -277t-276.5 -99.5q-97 0 -170.5 51t-110.5 139h-10l-70 -170h-125zM319 346q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81 t137.5 230.5t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" />
|
||||||
|
<glyph unicode="c" horiz-adv-x="922" d="M98 389q0 200 74 369t204.5 263.5t293.5 94.5q137 0 268 -51l-47 -141q-120 51 -219 51q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -128 66.5 -199t183.5 -71q72 0 136 20t126 47v-143q-124 -63 -276 -63q-194 0 -301 107t-107 302z" />
|
||||||
|
<glyph unicode="d" horiz-adv-x="1182" d="M98 350q0 214 72 392t194.5 275t274.5 97q194 0 281 -190h10q17 155 45 274l78 358h166l-330 -1556h-139l22 209h-8q-101 -125 -189 -177t-182 -52q-139 0 -217 98t-78 272zM270 346q0 -227 179 -227q94 0 194 93.5t158.5 239t58.5 296.5q0 111 -54 169t-157 58 q-101 0 -187.5 -82.5t-139 -232t-52.5 -314.5z" />
|
||||||
|
<glyph unicode="e" horiz-adv-x="1010" d="M98 391q0 188 74.5 360.5t197.5 268.5t271 96q153 0 230 -66.5t77 -185.5q0 -180 -166 -282.5t-475 -102.5h-33l-4 -80q0 -131 61.5 -204.5t190.5 -73.5q63 0 129.5 18t165.5 66v-146q-94 -44 -166 -61.5t-159 -17.5q-184 0 -289 109t-105 302zM299 618h12 q228 0 349.5 59.5t121.5 172.5q0 53 -36.5 88t-114.5 35q-103 0 -193.5 -94t-138.5 -261z" />
|
||||||
|
<glyph unicode="f" horiz-adv-x="641" d="M-229 -330q64 -22 112 -22q76 0 117 62t66 177l227 1082h-193l13 67l206 66l23 100q46 200 127.5 282.5t241.5 82.5q40 0 98 -11.5t90 -25.5l-43 -129q-76 29 -137 29q-87 0 -133.5 -48.5t-75.5 -177.5l-25 -108h238l-25 -127h-237l-232 -1098q-39 -189 -120 -276 t-213 -87q-69 0 -125 21v141z" />
|
||||||
|
<glyph unicode="g" horiz-adv-x="1026" d="M-127 -211q0 105 72 182t233 131q-78 41 -78 121q0 69 51 118.5t142 92.5q-63 32 -103 94.5t-40 145.5q0 194 119.5 318t305.5 124q78 0 154 -20h371l-25 -107l-211 -24q41 -62 41 -158q0 -191 -116.5 -304.5t-311.5 -113.5q-55 0 -84 8q-139 -53 -139 -131 q0 -41 33 -54.5t96 -21.5l117 -14q181 -22 262.5 -88t81.5 -194q0 -184 -146 -285t-411 -101q-194 0 -304 73.5t-110 207.5zM35 -195q0 -77 65 -122t193 -45q182 0 284.5 63.5t102.5 179.5q0 62 -54 98t-184 50l-159 16q-120 -25 -184 -88t-64 -152zM313 680 q0 -85 45 -129.5t125 -44.5q79 0 138 42t90.5 115.5t31.5 159.5q0 82 -44 125t-126 43q-78 0 -136.5 -40.5t-91 -113t-32.5 -157.5z" />
|
||||||
|
<glyph unicode="h" horiz-adv-x="1182" d="M59 0l330 1556h168q-18 -82 -34.5 -159t-34 -156.5t-38 -166.5t-47.5 -189h11q94 123 185.5 176t191.5 53q131 0 202.5 -72t71.5 -204q0 -62 -23 -166q-39 -193 -145 -672h-168l148 692q18 94 18 135q0 148 -147 148q-89 0 -173.5 -59t-149 -171.5t-97.5 -271.5 l-101 -473h-168z" />
|
||||||
|
<glyph unicode="i" horiz-adv-x="520" d="M59 0l234 1096h168l-234 -1096h-168zM340 1376q0 56 32 91.5t83 35.5q88 0 88 -90q0 -55 -33.5 -93t-77.5 -38q-40 0 -66 24.5t-26 69.5z" />
|
||||||
|
<glyph unicode="j" horiz-adv-x="520" d="M-258 -330q61 -22 119 -22q125 0 168 205l264 1243h166l-266 -1258q-36 -171 -114.5 -250.5t-213.5 -79.5q-69 0 -123 21v141zM340 1376q0 56 32 91.5t83 35.5q86 0 86 -90q0 -55 -33.5 -93t-77.5 -38q-38 0 -64 24.5t-26 69.5z" />
|
||||||
|
<glyph unicode="k" horiz-adv-x="999" d="M57 0l330 1556h170l-129 -602q-57 -266 -102 -395h4l526 537h201l-469 -467l295 -629h-187l-235 524l-152 -123l-82 -401h-170z" />
|
||||||
|
<glyph unicode="l" horiz-adv-x="520" d="M57 0l332 1556h168l-332 -1556h-168z" />
|
||||||
|
<glyph unicode="m" horiz-adv-x="1786" d="M59 0l234 1096h139l-22 -203h10q87 119 173.5 171t178.5 52q113 0 174 -65t72 -181h8q86 125 183 185.5t196 60.5q127 0 196.5 -68t69.5 -198q0 -68 -22 -178l-144 -672h-170l148 692q20 104 20 146q0 62 -34.5 99.5t-108.5 37.5q-81 0 -160 -58t-138.5 -164.5 t-90.5 -252.5l-107 -500h-168l148 692q18 94 18 135q0 70 -31 109t-106 39q-84 0 -163.5 -60t-140 -171.5t-93.5 -268.5l-101 -475h-168z" />
|
||||||
|
<glyph unicode="n" horiz-adv-x="1182" d="M59 0l234 1096h139l-22 -203h10q96 122 185.5 172.5t185.5 50.5q127 0 200.5 -69.5t73.5 -194.5q0 -79 -23 -180l-143 -672h-170l148 692q20 104 20 144q0 63 -35.5 101t-113.5 38q-89 0 -173.5 -60t-149 -171t-97.5 -269l-101 -475h-168z" />
|
||||||
|
<glyph unicode="o" horiz-adv-x="1149" d="M98 406q0 190 73 357.5t197 257t275 89.5q190 0 300 -112.5t110 -309.5q0 -188 -72 -355t-195 -258t-278 -91q-192 0 -301 113t-109 309zM270 397q0 -131 63.5 -202.5t182.5 -71.5q104 0 187 73t129.5 207.5t46.5 307.5q0 115 -62.5 186.5t-169.5 71.5q-109 0 -195.5 -74 t-134 -205.5t-47.5 -292.5z" />
|
||||||
|
<glyph unicode="p" horiz-adv-x="1182" d="M-43 -492l336 1588h139l-26 -209h8q179 227 372 227q137 0 216 -97.5t79 -273.5q0 -212 -69 -389t-191 -275.5t-276 -98.5q-97 0 -170 50t-113 140h-10l-4 -38q-3 -25 -10.5 -70t-114.5 -554h-166zM319 346q0 -110 55.5 -168.5t160.5 -58.5q99 0 184.5 81t137.5 230.5 t52 317.5q0 227 -178 227q-96 0 -195.5 -95t-158 -239t-58.5 -295z" />
|
||||||
|
<glyph unicode="q" horiz-adv-x="1182" d="M98 350q0 212 72.5 392t196 277t274.5 97q94 0 165.5 -50.5t108.5 -141.5h13l67 172h125l-336 -1588h-166l101 480q9 45 57 221h-8q-95 -121 -185 -175t-186 -54q-140 0 -219.5 97.5t-79.5 272.5zM270 346q0 -227 179 -227q92 0 190 92t158.5 237t60.5 300 q0 105 -54.5 166t-152.5 61q-101 0 -189 -84.5t-140 -233t-52 -311.5z" />
|
||||||
|
<glyph unicode="r" horiz-adv-x="811" d="M59 0l234 1096h139l-22 -203h10q72 95 119 136.5t98.5 64t114.5 22.5q69 0 120 -14l-36 -150q-53 13 -105 13q-91 0 -170.5 -60t-139 -166.5t-87.5 -236.5l-107 -502h-168z" />
|
||||||
|
<glyph unicode="s" horiz-adv-x="877" d="M8 49v158q70 -42 151 -65t150 -23q126 0 190 50t64 128q0 57 -35 96t-151 107q-130 73 -184 143t-54 166q0 138 101 222.5t266 84.5q171 0 330 -74l-54 -137l-56 25q-101 43 -220 43q-93 0 -146 -43.5t-53 -112.5q0 -56 35.5 -96t146.5 -103q107 -60 153.5 -103 t69.5 -92.5t23 -111.5q0 -156 -110.5 -243.5t-311.5 -87.5q-169 0 -305 69z" />
|
||||||
|
<glyph unicode="t" horiz-adv-x="664" d="M90 969l14 73l185 78l125 228h98l-55 -252h274l-26 -127h-273l-129 -604q-18 -87 -18 -132q0 -56 29 -86t81 -30q55 0 144 26v-129q-34 -14 -84 -24t-80 -10q-125 0 -191.5 59.5t-66.5 177.5q0 66 18 150l127 602h-172z" />
|
||||||
|
<glyph unicode="u" horiz-adv-x="1182" d="M113 248q0 62 22 172l146 676h170l-150 -695q-18 -89 -18 -139q0 -143 147 -143q88 0 173 60t150 172t99 270l100 475h166l-231 -1096h-139l22 203h-12q-98 -125 -187 -174t-184 -49q-128 0 -201 69.5t-73 198.5z" />
|
||||||
|
<glyph unicode="v" horiz-adv-x="946" d="M98 1096h168l64 -613q24 -258 24 -362h6q127 275 179 371l325 604h178l-591 -1096h-228z" />
|
||||||
|
<glyph unicode="w" horiz-adv-x="1468" d="M117 1096h164l18 -594v-88q0 -147 -8 -269h6q47 124 137 322l295 629h182l37 -594q6 -168 6 -262v-53l-2 -42h6q28 86 83 218.5t323 732.5h178l-506 -1096h-205l-32 602q-4 94 -4 172v156h-9l-50 -118l-83 -189l-291 -623h-202z" />
|
||||||
|
<glyph unicode="x" horiz-adv-x="979" d="M-74 0l475 565l-239 531h170l174 -412l330 412h194l-455 -539l252 -557h-168l-192 434l-346 -434h-195z" />
|
||||||
|
<glyph unicode="y" horiz-adv-x="946" d="M-197 -336q63 -18 131 -18q82 0 140.5 50.5t113.5 149.5l76 136l-166 1114h168l74 -545q10 -69 19.5 -203.5t9.5 -216.5h6q35 87 87 200t77 156l325 609h178l-696 -1282q-93 -172 -184 -239t-219 -67q-72 0 -140 21v135z" />
|
||||||
|
<glyph unicode="z" horiz-adv-x="909" d="M-29 0l23 117l694 854h-479l27 125h657l-29 -140l-680 -831h531l-25 -125h-719z" />
|
||||||
|
<glyph unicode="{" horiz-adv-x="715" d="M27 514l32 143q118 0 189.5 43.5t93.5 147.5l68 326q34 160 117.5 224t254.5 64h33l-31 -141q-105 0 -151 -36.5t-66 -123.5l-71 -321q-28 -123 -91 -184t-167 -78v-5q151 -41 151 -213q0 -59 -18 -131l-47 -211q-15 -58 -15 -98q0 -53 36.5 -77.5t119.5 -24.5v-142h-23 q-141 0 -216.5 52.5t-75.5 171.5q0 52 20 141q33 146 51.5 227.5t14.5 102.5q0 143 -209 143z" />
|
||||||
|
<glyph unicode="|" d="M541 -496v2052h139v-2052h-139z" />
|
||||||
|
<glyph unicode="}" horiz-adv-x="715" d="M-74 -182q115 0 167 36t71 123l72 322q25 117 88 179.5t170 80.5v6q-150 42 -150 211q0 59 18 131l50 213q14 65 14 99q0 53 -40.5 77.5t-139.5 24.5l28 141h11q144 0 220.5 -52.5t76.5 -170.5q0 -48 -21 -141l-49 -219q-16 -68 -16 -111q0 -143 209 -143l-33 -144 q-119 0 -190 -43t-93 -147l-67 -326q-36 -164 -119 -226.5t-264 -62.5h-13v142z" />
|
||||||
|
<glyph unicode="~" d="M115 592v151q98 109 243 109q69 0 127 -14.5t144 -51.5q64 -27 112.5 -41t98.5 -14q55 0 119.5 33t115.5 88v-150q-100 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12q-54 0 -118.5 -34.5t-114.5 -86.5z" />
|
||||||
|
<glyph unicode="¢" d="M225 590q0 185 63.5 344t178.5 258.5t260 120.5l35 170h123l-37 -168q119 -9 217 -49l-47 -142q-109 52 -219 52q-112 0 -204.5 -76.5t-145 -213t-52.5 -296.5q0 -125 66 -198t184 -73q72 0 136 20t126 48v-143q-123 -62 -286 -66l-41 -198h-125l43 215 q-132 34 -203.5 137.5t-71.5 257.5z" />
|
||||||
|
<glyph unicode="£" d="M-23 0l27 141q205 46 258 289l47 221h-200l26 127h201l76 350q75 353 430 353q184 0 336 -86l-66 -133q-146 79 -278 79q-213 0 -263 -237l-69 -326h370l-26 -127h-371l-47 -219q-22 -98 -66 -166.5t-124 -111.5h725l-33 -154h-953z" />
|
||||||
|
<glyph unicode="¥" d="M127 266l29 133h290l33 160h-291l29 133h225l-202 770h163l179 -747l491 747h187l-533 -770h231l-28 -133h-297l-33 -160h297l-29 -133h-295l-57 -266h-154l56 266h-291z" />
|
||||||
|
<glyph unicode="©" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM520 733q0 208 110 330.5t300 122.5q130 0 248 -60l-60 -120q-106 53 -190 53q-125 0 -191.5 -87t-66.5 -241q0 -169 65 -249.5t193 -80.5q82 0 211 43v-122q-66 -28 -113 -38 t-104 -10q-192 0 -297 119.5t-105 339.5z" />
|
||||||
|
<glyph unicode="­" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||||
|
<glyph unicode="®" horiz-adv-x="1704" d="M139 731q0 200 100 375t275 276t377 101q197 0 370 -97t277 -272t104 -383q0 -204 -100.5 -376.5t-273 -273.5t-377.5 -101q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM244 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5 q0 174 -87 323t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM645 291v880h229q163 0 241.5 -63t78.5 -193q0 -78 -47.5 -141t-132.5 -98l227 -385h-149l-207 352h-113v-352h-127zM772 762h92q195 0 195 149q0 76 -47.5 107t-149.5 31h-90v-287z " />
|
||||||
|
<glyph unicode="´" horiz-adv-x="1135" d="M532 1241v27q56 60 125.5 151.5t106.5 149.5h190v-21q-38 -49 -140 -151t-177 -156h-105z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="523" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="196" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="87" />
|
||||||
|
<glyph unicode="‐" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||||
|
<glyph unicode="‑" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||||
|
<glyph unicode="‒" horiz-adv-x="639" d="M55 469l35 158h479l-34 -158h-480z" />
|
||||||
|
<glyph unicode="–" horiz-adv-x="983" d="M55 469l35 160h823l-34 -160h-824z" />
|
||||||
|
<glyph unicode="—" horiz-adv-x="1966" d="M55 469l35 160h1806l-34 -160h-1807z" />
|
||||||
|
<glyph unicode="‘" horiz-adv-x="348" d="M123 983q98 211 270 479h127q-147 -345 -203 -501h-188z" />
|
||||||
|
<glyph unicode="’" horiz-adv-x="348" d="M125 961q134 298 203 501h188l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129z" />
|
||||||
|
<glyph unicode="“" horiz-adv-x="719" d="M123 983q98 211 270 479h127q-147 -345 -203 -501h-188zM492 983q80 181 272 479h127q-162 -379 -203 -501h-188z" />
|
||||||
|
<glyph unicode="”" horiz-adv-x="719" d="M125 961q134 298 203 501h188l8 -22q-40 -91 -111 -218.5t-159 -260.5h-129zM494 961q57 126 115.5 272.5t86.5 228.5h189l10 -22q-94 -206 -274 -479h-127z" />
|
||||||
|
<glyph unicode="•" horiz-adv-x="774" d="M199 684q0 145 73.5 231t198.5 86q92 0 139 -49t47 -141q0 -141 -74 -230t-202 -89q-89 0 -135.5 49.5t-46.5 142.5z" />
|
||||||
|
<glyph unicode="…" horiz-adv-x="1563" d="M563 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM1085 74q0 77 40.5 122.5t111.5 45.5q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77zM43 74q0 77 40.5 122.5t111.5 45.5 q43 0 69.5 -26t26.5 -79q0 -71 -40 -118.5t-108 -47.5q-46 0 -73 26t-27 77z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode="€" d="M63 504l27 131h154q8 80 30 164h-151l27 133h159q97 267 259.5 408t369.5 141q89 0 160 -21.5t141 -70.5l-80 -138q-113 78 -231 78q-140 0 -254 -99t-189 -298h426l-26 -133h-441q-21 -65 -32 -164h381l-29 -131h-361q0 -373 297 -373q123 0 256 55v-147 q-127 -59 -278 -59q-212 0 -328.5 133.5t-116.5 378.5v12h-170z" />
|
||||||
|
<glyph unicode="™" horiz-adv-x="1534" d="M121 1358v104h516v-104h-199v-617h-121v617h-196zM705 741v721h180l182 -557l193 557h170v-721h-121v430q0 73 4 121h-6l-197 -551h-96l-189 551h-6q4 -52 4 -121v-430h-118z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
||||||
|
After Width: | Height: | Size: 27 KiB |
|
|
@ -0,0 +1,146 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>
|
||||||
|
This is a custom SVG webfont generated by Font Squirrel.
|
||||||
|
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||||
|
Foundry : Ascender Corporation
|
||||||
|
Foundry URL : httpwwwascendercorpcom
|
||||||
|
</metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="OpenSansLight" horiz-adv-x="1169" >
|
||||||
|
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||||
|
<missing-glyph horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="	" horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="!" horiz-adv-x="492" d="M164 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM186 1462h119l-29 -1085h-61z" />
|
||||||
|
<glyph unicode=""" horiz-adv-x="723" d="M133 1462h127l-33 -528h-61zM463 1462h127l-33 -528h-61z" />
|
||||||
|
<glyph unicode="#" horiz-adv-x="1323" d="M55 451v79h299l76 398h-297v80h311l86 454h91l-89 -454h365l88 454h86l-88 -454h285v-80h-301l-76 -398h303v-79h-320l-86 -451h-90l88 451h-360l-86 -451h-88l86 451h-283zM440 530h363l78 398h-363z" />
|
||||||
|
<glyph unicode="$" d="M164 186v103q75 -36 179.5 -61t193.5 -25v508q-145 44 -215 88t-102 104t-32 146q0 124 94.5 208.5t254.5 104.5v192h81v-190q197 -9 351 -72l-33 -90q-141 62 -318 72v-486q213 -66 293 -144t80 -204q0 -133 -99 -217t-274 -106v-236h-81v232q-92 2 -200.5 22.5 t-172.5 50.5zM297 1049q0 -86 57 -141t183 -93v453q-119 -16 -179.5 -76t-60.5 -143zM618 209q122 13 192.5 75t70.5 160q0 85 -63 140.5t-200 95.5v-471z" />
|
||||||
|
<glyph unicode="%" horiz-adv-x="1653" d="M113 1026q0 223 72 340t212 117q139 0 215 -120.5t76 -336.5q0 -226 -75 -343.5t-216 -117.5q-133 0 -208.5 120.5t-75.5 340.5zM211 1026q0 -186 45 -279.5t141 -93.5q193 0 193 373q0 184 -49.5 276.5t-143.5 92.5q-96 0 -141 -92.5t-45 -276.5zM373 0l811 1462h96 l-811 -1462h-96zM965 438q0 225 73.5 341t212.5 116q137 0 213 -120t76 -337q0 -226 -74 -343.5t-215 -117.5q-136 0 -211 121.5t-75 339.5zM1063 438q0 -185 45 -277.5t141 -92.5q193 0 193 370q0 369 -193 369q-96 0 -141 -91.5t-45 -277.5z" />
|
||||||
|
<glyph unicode="&" horiz-adv-x="1460" d="M123 371q0 138 73.5 235t274.5 205l-75 82q-66 71 -98 139t-32 142q0 143 95.5 227t256.5 84q155 0 245.5 -81t90.5 -224q0 -105 -70 -192.5t-253 -194.5l452 -457q61 72 104 157t75 201h96q-63 -246 -209 -426l266 -268h-135l-193 197q-92 -90 -164 -131.5t-157.5 -63.5 t-194.5 -22q-209 0 -328.5 103t-119.5 288zM227 375q0 -143 93 -224t258 -81q128 0 234.5 43.5t209.5 146.5l-483 485q-136 -72 -196.5 -122.5t-88 -109.5t-27.5 -138zM373 1176q0 -79 40 -146t152 -174q159 85 221 159t62 169q0 94 -62 152.5t-168 58.5q-114 0 -179.5 -58 t-65.5 -161z" />
|
||||||
|
<glyph unicode="'" horiz-adv-x="393" d="M133 1462h127l-33 -528h-61z" />
|
||||||
|
<glyph unicode="(" horiz-adv-x="557" d="M82 561q0 265 77.5 496t223.5 405h113q-148 -182 -227 -412.5t-79 -486.5q0 -483 304 -887h-111q-147 170 -224 397t-77 488z" />
|
||||||
|
<glyph unicode=")" horiz-adv-x="557" d="M61 1462h113q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-111q304 404 304 887q0 257 -79 487.5t-227 411.5z" />
|
||||||
|
<glyph unicode="*" horiz-adv-x="1128" d="M104 1124l19 131l401 -104l-39 405h146l-37 -405l405 104l21 -131l-395 -39l247 -340l-124 -71l-191 379l-180 -379l-125 71l242 340z" />
|
||||||
|
<glyph unicode="+" d="M111 682v82h432v434h82v-434h434v-82h-434v-432h-82v432h-432z" />
|
||||||
|
<glyph unicode="," horiz-adv-x="440" d="M68 -264q77 275 110 502h117l12 -21q-75 -265 -174 -481h-65z" />
|
||||||
|
<glyph unicode="-" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||||
|
<glyph unicode="." horiz-adv-x="487" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
|
||||||
|
<glyph unicode="/" horiz-adv-x="698" d="M25 0l544 1462h105l-545 -1462h-104z" />
|
||||||
|
<glyph unicode="0" d="M115 735q0 382 115.5 566t351.5 184q231 0 352 -190.5t121 -559.5q0 -385 -117.5 -570t-355.5 -185q-229 0 -348 190.5t-119 564.5zM223 735q0 -340 89 -502.5t270 -162.5q189 0 275.5 168t86.5 497q0 324 -86.5 492t-275.5 168t-274 -168t-85 -492z" />
|
||||||
|
<glyph unicode="1" d="M199 1165l397 297h86v-1462h-98v1065q0 145 12 301q-15 -15 -31 -29t-309 -243z" />
|
||||||
|
<glyph unicode="2" d="M113 0v88l389 406q164 170 230 260t97 172t31 172q0 131 -86 213t-223 82q-183 0 -350 -133l-54 69q183 154 406 154q191 0 300.5 -102t109.5 -281q0 -145 -73.5 -280.5t-268.5 -334.5l-375 -385v-4h782v-96h-915z" />
|
||||||
|
<glyph unicode="3" d="M94 63v99q84 -44 188.5 -69t196.5 -25q221 0 332 89.5t111 252.5q0 145 -113.5 223t-333.5 78h-158v96h160q182 0 288.5 86.5t106.5 234.5q0 122 -86.5 195.5t-226.5 73.5q-109 0 -199 -30.5t-202 -104.5l-49 67q85 71 205 112.5t243 41.5q202 0 312 -95.5t110 -269.5 q0 -136 -85.5 -229t-229.5 -119v-6q176 -22 268 -112t92 -242q0 -205 -139.5 -317.5t-401.5 -112.5q-223 0 -389 83z" />
|
||||||
|
<glyph unicode="4" d="M43 373v67l725 1030h121v-1011h252v-86h-252v-373h-94v373h-752zM162 459h633v418q0 302 14 507h-8q-20 -37 -123 -188z" />
|
||||||
|
<glyph unicode="5" d="M143 63v103q108 -55 192 -76.5t179 -21.5q192 0 308 101.5t116 274.5q0 163 -113 256t-307 93q-130 0 -272 -39l-60 39l58 669h704v-96h-610l-45 -516q156 29 244 29q234 0 368.5 -113t134.5 -311q0 -225 -140 -350t-386 -125q-109 0 -207 21.5t-164 61.5z" />
|
||||||
|
<glyph unicode="6" d="M131 623q0 285 77.5 479.5t220 288.5t343.5 94q94 0 172 -23v-88q-73 27 -176 27q-247 0 -384.5 -178t-154.5 -518h13q76 98 174 148t207 50q205 0 320.5 -117t115.5 -323q0 -224 -121.5 -353.5t-327.5 -129.5q-222 0 -350.5 169.5t-128.5 473.5zM240 504 q0 -111 49.5 -213.5t134 -162.5t186.5 -60q164 0 255 103t91 294q0 168 -90 262t-245 94q-102 0 -189.5 -45t-139.5 -119.5t-52 -152.5z" />
|
||||||
|
<glyph unicode="7" d="M109 1366v96h946v-73l-604 -1389h-117l602 1366h-827z" />
|
||||||
|
<glyph unicode="8" d="M121 375q0 131 83 230t257 169q-161 76 -227 160.5t-66 202.5q0 105 53 184.5t148.5 122.5t212.5 43q186 0 299.5 -95t113.5 -257q0 -112 -70.5 -198t-228.5 -159q192 -79 270 -173t78 -228q0 -181 -126.5 -289t-339.5 -108q-221 0 -339 101t-118 294zM223 360 q0 -138 93.5 -214t261.5 -76q164 0 264 80.5t100 218.5q0 124 -78.5 201.5t-302.5 162.5q-184 -71 -261 -157t-77 -216zM268 1137q0 -70 31.5 -123.5t91 -97t199.5 -101.5q163 63 234 139t71 183q0 120 -84.5 190t-230.5 70q-141 0 -226.5 -69.5t-85.5 -190.5z" />
|
||||||
|
<glyph unicode="9" d="M111 993q0 220 124.5 356t323.5 136q144 0 252 -75.5t166.5 -221.5t58.5 -346q0 -288 -75.5 -482t-220 -287t-349.5 -93q-104 0 -192 26v86q43 -14 103.5 -21.5t92.5 -7.5q247 0 387 178.5t156 520.5h-12q-73 -96 -174 -147.5t-211 -51.5q-203 0 -316.5 112t-113.5 318z M213 999q0 -174 87 -264t249 -90q101 0 188.5 45t139 119.5t51.5 151.5q0 117 -46.5 219t-130 159.5t-192.5 57.5q-158 0 -252 -106.5t-94 -291.5z" />
|
||||||
|
<glyph unicode=":" horiz-adv-x="487" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM162 971q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
|
||||||
|
<glyph unicode=";" horiz-adv-x="487" d="M76 -264q29 97 62 245.5t48 256.5h117l12 -21q-75 -265 -174 -481h-65zM162 971q0 98 80 98q82 0 82 -98q0 -53 -23.5 -76t-58.5 -23q-34 0 -57 23t-23 76z" />
|
||||||
|
<glyph unicode="<" d="M111 682v61l948 474v-95l-823 -405l823 -355v-96z" />
|
||||||
|
<glyph unicode="=" d="M111 477v82h948v-82h-948zM111 885v82h948v-82h-948z" />
|
||||||
|
<glyph unicode=">" d="M111 266v96l823 355l-823 405v95l948 -474v-61z" />
|
||||||
|
<glyph unicode="?" horiz-adv-x="862" d="M57 1403q110 48 184.5 64t153.5 16q183 0 288 -98.5t105 -270.5q0 -68 -18 -119t-50.5 -94.5t-78.5 -84t-102 -87.5q-64 -54 -98.5 -98.5t-50 -93.5t-15.5 -146v-14h-82v37q0 123 37.5 201t138.5 167l91 79q72 61 103 121t31 138q0 127 -83.5 202t-219.5 75 q-79 0 -148 -17.5t-149 -56.5zM260 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
|
||||||
|
<glyph unicode="@" horiz-adv-x="1815" d="M113 561q0 256 108.5 460.5t307 317.5t448.5 113q215 0 380.5 -89t255 -254.5t89.5 -383.5q0 -228 -90.5 -366t-245.5 -138q-89 0 -144.5 54t-64.5 147h-4q-43 -100 -124 -150.5t-189 -50.5q-148 0 -229 96.5t-81 270.5q0 202 120.5 330.5t314.5 128.5q138 0 286 -41 l-22 -464v-30q0 -104 35 -156.5t116 -52.5q103 0 168.5 116.5t65.5 303.5q0 194 -79 340t-225.5 224.5t-334.5 78.5q-230 0 -405.5 -99.5t-270 -281.5t-94.5 -418q0 -322 167 -497.5t474 -175.5q93 0 188.5 18t231.5 70v-99q-203 -80 -414 -80q-349 0 -544 200.5t-195 557.5 zM633 590q0 -143 55 -215t174 -72q255 0 273 346l16 291q-79 27 -193 27q-149 0 -237 -102.5t-88 -274.5z" />
|
||||||
|
<glyph unicode="A" horiz-adv-x="1229" d="M0 0l588 1468h65l576 -1468h-115l-203 516h-594l-204 -516h-113zM354 608h523l-199 527q-25 62 -60 172q-27 -96 -59 -174z" />
|
||||||
|
<glyph unicode="B" horiz-adv-x="1284" d="M207 0v1462h401q271 0 398 -92t127 -278q0 -127 -77.5 -211.5t-226.5 -108.5v-6q175 -26 257.5 -110.5t82.5 -235.5q0 -202 -134 -311t-380 -109h-448zM309 90h344q406 0 406 330q0 301 -428 301h-322v-631zM309 811h322q206 0 299.5 68.5t93.5 214.5t-105.5 212 t-314.5 66h-295v-561z" />
|
||||||
|
<glyph unicode="C" horiz-adv-x="1272" d="M129 735q0 223 84.5 393t243 262.5t368.5 92.5q214 0 383 -80l-41 -92q-160 80 -336 80q-275 0 -433 -176t-158 -482q0 -313 149 -486t426 -173q184 0 338 47v-90q-145 -51 -362 -51q-308 0 -485 199t-177 556z" />
|
||||||
|
<glyph unicode="D" horiz-adv-x="1446" d="M207 0v1462h395q350 0 532.5 -183t182.5 -534q0 -368 -193 -556.5t-567 -188.5h-350zM309 90h242q655 0 655 651q0 314 -159.5 472.5t-468.5 158.5h-269v-1282z" />
|
||||||
|
<glyph unicode="E" horiz-adv-x="1130" d="M207 0v1462h799v-94h-697v-553h658v-94h-658v-627h697v-94h-799z" />
|
||||||
|
<glyph unicode="F" horiz-adv-x="1028" d="M207 0v1462h801v-94h-699v-620h660v-95h-660v-653h-102z" />
|
||||||
|
<glyph unicode="G" horiz-adv-x="1481" d="M129 729q0 223 91.5 395.5t262 266.5t391.5 94q239 0 429 -88l-41 -92q-190 88 -394 88q-289 0 -458.5 -178.5t-169.5 -481.5q0 -330 161 -496.5t473 -166.5q202 0 343 57v514h-435v96h539v-667q-212 -90 -477 -90q-346 0 -530.5 195.5t-184.5 553.5z" />
|
||||||
|
<glyph unicode="H" horiz-adv-x="1473" d="M207 0v1462h102v-649h854v649h103v-1462h-103v719h-854v-719h-102z" />
|
||||||
|
<glyph unicode="I" horiz-adv-x="516" d="M207 0v1462h102v-1462h-102z" />
|
||||||
|
<glyph unicode="J" horiz-adv-x="506" d="M-184 -254q78 -20 149 -20q242 0 242 264v1472h102v-1462q0 -369 -342 -369q-92 0 -151 27v88z" />
|
||||||
|
<glyph unicode="K" horiz-adv-x="1190" d="M207 0v1462h102v-760l162 162l573 598h130l-599 -618l615 -844h-125l-561 772l-195 -172v-600h-102z" />
|
||||||
|
<glyph unicode="L" horiz-adv-x="1051" d="M207 0v1462h102v-1366h697v-96h-799z" />
|
||||||
|
<glyph unicode="M" horiz-adv-x="1767" d="M207 0v1462h158l518 -1286h6l518 1286h154v-1462h-103v1108q0 116 12 240h-8l-547 -1348h-65l-545 1350h-8q8 -124 8 -254v-1096h-98z" />
|
||||||
|
<glyph unicode="N" horiz-adv-x="1477" d="M207 0v1462h102l865 -1296h6q-9 180 -9 342v954h99v-1462h-103l-866 1298h-8q12 -232 12 -350v-948h-98z" />
|
||||||
|
<glyph unicode="O" horiz-adv-x="1565" d="M129 735q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5q0 -348 -174 -550.5t-480 -202.5q-305 0 -479 202.5t-174 552.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5t-401.5 168.5q-261 0 -402.5 -170 t-141.5 -483z" />
|
||||||
|
<glyph unicode="P" horiz-adv-x="1198" d="M207 0v1462h358q522 0 522 -420q0 -212 -144 -325t-408 -113h-226v-604h-102zM309 692h201q247 0 357 81.5t110 264.5q0 169 -104 250.5t-322 81.5h-242v-678z" />
|
||||||
|
<glyph unicode="Q" horiz-adv-x="1565" d="M129 735q0 349 175.5 549.5t479.5 200.5q306 0 479 -201.5t173 -550.5q0 -294 -126 -486.5t-349 -246.5l333 -348h-166l-282 330l-33 -2h-31q-305 0 -479 202.5t-174 552.5zM240 733q0 -314 140 -485.5t402 -171.5q264 0 403.5 170t139.5 487q0 316 -139.5 484.5 t-401.5 168.5q-261 0 -402.5 -170t-141.5 -483z" />
|
||||||
|
<glyph unicode="R" horiz-adv-x="1217" d="M207 0v1462h348q272 0 402 -100.5t130 -302.5q0 -147 -77.5 -248t-235.5 -145l397 -666h-122l-377 637h-363v-637h-102zM309 725h279q185 0 287 82.5t102 243.5q0 167 -100 243t-326 76h-242v-645z" />
|
||||||
|
<glyph unicode="S" horiz-adv-x="1116" d="M111 39v102q158 -67 403 -67q180 0 285.5 82.5t105.5 216.5q0 83 -35 137.5t-114 99.5t-232 97q-224 77 -309.5 166.5t-85.5 238.5q0 164 128.5 267.5t330.5 103.5q206 0 387 -78l-37 -88q-182 76 -348 76q-162 0 -258 -75t-96 -204q0 -81 29.5 -133t96.5 -93.5 t230 -99.5q171 -59 257 -114.5t125.5 -126t39.5 -170.5q0 -183 -134.5 -290t-357.5 -107q-268 0 -411 59z" />
|
||||||
|
<glyph unicode="T" horiz-adv-x="1073" d="M10 1366v96h1053v-96h-475v-1366h-103v1366h-475z" />
|
||||||
|
<glyph unicode="U" horiz-adv-x="1473" d="M190 520v942h103v-946q0 -211 117 -328.5t331 -117.5q209 0 324 115.5t115 320.5v956h102v-946q0 -252 -146 -394t-407 -142q-254 0 -396.5 142.5t-142.5 397.5z" />
|
||||||
|
<glyph unicode="V" horiz-adv-x="1182" d="M0 1462h109l368 -995q84 -225 113 -338q20 75 79 233l402 1100h111l-547 -1462h-90z" />
|
||||||
|
<glyph unicode="W" horiz-adv-x="1827" d="M51 1462h107l256 -942q15 -57 28 -105.5t23.5 -91t19 -82t15.5 -79.5q24 136 102 413l250 887h113l293 -1018q51 -176 73 -284q13 72 33.5 153t308.5 1149h103l-404 -1462h-84l-321 1128q-40 139 -60 228q-16 -87 -45.5 -200t-322.5 -1156h-86z" />
|
||||||
|
<glyph unicode="X" horiz-adv-x="1102" d="M0 0l492 762l-447 700h115l395 -626l401 626h109l-453 -698l490 -764h-117l-432 682l-440 -682h-113z" />
|
||||||
|
<glyph unicode="Y" horiz-adv-x="1081" d="M0 1462h117l426 -800l428 800h110l-487 -897v-565h-105v557z" />
|
||||||
|
<glyph unicode="Z" horiz-adv-x="1180" d="M82 0v76l856 1290h-817v96h954v-76l-858 -1290h881v-96h-1016z" />
|
||||||
|
<glyph unicode="[" horiz-adv-x="653" d="M174 -324v1786h428v-94h-330v-1597h330v-95h-428z" />
|
||||||
|
<glyph unicode="\" horiz-adv-x="698" d="M25 1462h102l547 -1462h-103z" />
|
||||||
|
<glyph unicode="]" horiz-adv-x="653" d="M51 -229h330v1597h-330v94h428v-1786h-428v95z" />
|
||||||
|
<glyph unicode="^" d="M88 561l465 912h68l460 -912h-100l-395 791l-398 -791h-100z" />
|
||||||
|
<glyph unicode="_" horiz-adv-x="842" d="M-4 -184h850v-82h-850v82z" />
|
||||||
|
<glyph unicode="`" horiz-adv-x="1182" d="M393 1552v17h142q26 -48 98.5 -142t142.5 -170v-16h-69q-96 79 -188.5 171.5t-125.5 139.5z" />
|
||||||
|
<glyph unicode="a" horiz-adv-x="1085" d="M98 289q0 159 132.5 247t383.5 93l207 6v72q0 155 -63 234t-203 79q-151 0 -313 -84l-37 86q179 84 354 84q179 0 267.5 -93t88.5 -290v-723h-73l-25 172h-8q-82 -105 -168.5 -148.5t-204.5 -43.5q-160 0 -249 82t-89 227zM203 285q0 -102 62.5 -158.5t176.5 -56.5 q174 0 274.5 99.5t100.5 276.5v107l-190 -8q-229 -11 -326.5 -71.5t-97.5 -188.5z" />
|
||||||
|
<glyph unicode="b" horiz-adv-x="1219" d="M182 0v1556h99v-391q0 -88 -4 -162l-3 -85h7q62 98 149.5 144t210.5 46q228 0 343.5 -143.5t115.5 -419.5q0 -271 -121.5 -418t-341.5 -147q-116 0 -209 48t-147 136h-9l-28 -164h-62zM281 528q0 -246 86.5 -353t269.5 -107q178 0 268 124.5t90 354.5q0 471 -356 471 q-192 0 -275 -110t-83 -363v-17z" />
|
||||||
|
<glyph unicode="c" horiz-adv-x="973" d="M119 537q0 270 137 420.5t375 150.5q141 0 270 -49l-27 -88q-141 47 -245 47q-200 0 -303 -123.5t-103 -355.5q0 -220 103 -344.5t288 -124.5q148 0 275 53v-92q-104 -51 -273 -51q-233 0 -365 147t-132 410z" />
|
||||||
|
<glyph unicode="d" horiz-adv-x="1219" d="M119 528q0 282 118 431t343 149q118 0 204 -43t154 -147h6q-6 126 -6 247v391h98v-1556h-65l-25 166h-8q-124 -186 -356 -186q-225 0 -344 140t-119 408zM223 530q0 -462 359 -462q184 0 270 107t86 353v17q0 252 -84.5 362.5t-273.5 110.5q-178 0 -267.5 -125 t-89.5 -363z" />
|
||||||
|
<glyph unicode="e" horiz-adv-x="1124" d="M119 535q0 260 128 416.5t345 156.5q192 0 303 -134t111 -364v-80h-783q2 -224 104.5 -342t293.5 -118q93 0 163.5 13t178.5 56v-90q-92 -40 -170 -54.5t-172 -14.5q-237 0 -369.5 146t-132.5 409zM229 618h672q0 189 -82 295.5t-227 106.5q-157 0 -252 -103.5 t-111 -298.5z" />
|
||||||
|
<glyph unicode="f" horiz-adv-x="614" d="M29 1001v58l202 37v84q0 200 73.5 293.5t240.5 93.5q90 0 180 -27l-23 -86q-80 25 -159 25q-116 0 -164.5 -68.5t-48.5 -222.5v-101h256v-86h-256v-1001h-99v1001h-202z" />
|
||||||
|
<glyph unicode="g" horiz-adv-x="1071" d="M45 -193q0 112 69.5 186t188.5 101q-49 21 -78.5 59.5t-29.5 88.5q0 109 139 192q-95 39 -148 122.5t-53 191.5q0 163 103.5 261.5t279.5 98.5q107 0 166 -21h348v-69l-225 -14q90 -112 90 -246q0 -157 -104.5 -254.5t-280.5 -97.5q-74 0 -104 6q-59 -31 -90 -73t-31 -89 q0 -52 39.5 -76t132.5 -24h190q177 0 271 -71.5t94 -211.5q0 -172 -139.5 -265.5t-397.5 -93.5q-205 0 -317.5 79t-112.5 220zM150 -184q0 -224 333 -224q428 0 428 273q0 98 -67 142t-217 44h-178q-299 0 -299 -235zM233 748q0 -126 76.5 -195.5t204.5 -69.5 q136 0 208.5 69t72.5 200q0 139 -74.5 208.5t-208.5 69.5q-130 0 -204.5 -74.5t-74.5 -207.5z" />
|
||||||
|
<glyph unicode="h" horiz-adv-x="1208" d="M182 0v1556h99v-495l-5 -139h7q61 98 154 142t231 44q370 0 370 -397v-711h-98v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99z" />
|
||||||
|
<glyph unicode="i" horiz-adv-x="463" d="M168 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97zM182 0v1087h99v-1087h-99z" />
|
||||||
|
<glyph unicode="j" horiz-adv-x="463" d="M-98 -381q69 -20 129 -20q151 0 151 176v1312h99v-1298q0 -135 -63.5 -208t-180.5 -73q-80 0 -135 25v86zM168 1389q0 96 63 96q31 0 48.5 -25t17.5 -71q0 -45 -17.5 -71t-48.5 -26q-63 0 -63 97z" />
|
||||||
|
<glyph unicode="k" horiz-adv-x="991" d="M182 0v1556h99v-780l-7 -299h5l555 610h120l-428 -464l465 -623h-119l-413 549l-178 -162v-387h-99z" />
|
||||||
|
<glyph unicode="l" horiz-adv-x="463" d="M182 0v1556h99v-1556h-99z" />
|
||||||
|
<glyph unicode="m" horiz-adv-x="1808" d="M182 0v1087h82l21 -149h6q45 81 128 125.5t183 44.5q257 0 330 -193h4q53 93 142.5 143t203.5 50q178 0 267 -95t89 -302v-711h-98v713q0 159 -62 232t-190 73q-167 0 -247 -92t-80 -289v-637h-101v743q0 275 -252 275q-171 0 -249 -99.5t-78 -318.5v-600h-99z" />
|
||||||
|
<glyph unicode="n" horiz-adv-x="1208" d="M182 0v1087h84l19 -149h6q106 170 377 170q370 0 370 -397v-711h-98v705q0 164 -69 238.5t-214 74.5q-195 0 -285.5 -98.5t-90.5 -319.5v-600h-99z" />
|
||||||
|
<glyph unicode="o" horiz-adv-x="1200" d="M119 545q0 266 129 414.5t354 148.5q224 0 351.5 -150.5t127.5 -412.5q0 -266 -129 -415.5t-356 -149.5q-143 0 -252 69t-167 198t-58 298zM223 545q0 -224 98.5 -349.5t278.5 -125.5t278.5 125.5t98.5 349.5q0 225 -99.5 349t-279.5 124t-277.5 -123.5t-97.5 -349.5z " />
|
||||||
|
<glyph unicode="p" horiz-adv-x="1219" d="M182 -492v1579h84l19 -155h6q112 176 358 176q220 0 335.5 -144.5t115.5 -420.5q0 -268 -121.5 -415.5t-331.5 -147.5q-251 0 -366 188h-7l3 -84q4 -74 4 -162v-414h-99zM281 541q0 -255 85.5 -364t278.5 -109q167 0 258.5 124t91.5 347q0 479 -346 479 q-190 0 -279 -104.5t-89 -340.5v-32z" />
|
||||||
|
<glyph unicode="q" horiz-adv-x="1219" d="M119 532q0 275 118 425.5t338 150.5q236 0 353 -174h6l18 153h84v-1579h-98v414q0 122 6 248h-6q-118 -190 -369 -190q-214 0 -332 142t-118 410zM223 530q0 -229 89.5 -345.5t258.5 -116.5q198 0 282.5 109t84.5 366v12q0 245 -85 354t-271 109q-176 0 -267.5 -124 t-91.5 -364z" />
|
||||||
|
<glyph unicode="r" horiz-adv-x="797" d="M182 0v1087h84l10 -196h7q67 120 143 168.5t184 48.5q69 0 148 -14l-19 -95q-68 17 -141 17q-139 0 -228 -118t-89 -298v-600h-99z" />
|
||||||
|
<glyph unicode="s" horiz-adv-x="954" d="M84 47v107q164 -82 346 -82q161 0 244.5 53.5t83.5 142.5q0 82 -66.5 138t-218.5 110q-163 59 -229 101.5t-99.5 96t-33.5 130.5q0 122 102.5 193t286.5 71q176 0 334 -66l-37 -90q-160 66 -297 66q-133 0 -211 -44t-78 -122q0 -85 60.5 -136t236.5 -114 q147 -53 214 -95.5t100.5 -96.5t33.5 -127q0 -146 -111 -224.5t-315 -78.5q-218 0 -346 67z" />
|
||||||
|
<glyph unicode="t" horiz-adv-x="686" d="M25 1001v58l161 45l50 246h51v-263h319v-86h-319v-688q0 -125 44 -185t138 -60t164 16v-80q-72 -24 -166 -24q-144 0 -212.5 77t-68.5 242v702h-161z" />
|
||||||
|
<glyph unicode="u" horiz-adv-x="1208" d="M170 377v710h98v-704q0 -164 69 -238.5t214 -74.5q194 0 285.5 98t91.5 319v600h98v-1087h-84l-18 150h-6q-106 -170 -377 -170q-371 0 -371 397z" />
|
||||||
|
<glyph unicode="v" horiz-adv-x="940" d="M0 1087h102l281 -739q56 -142 84 -248h6q41 136 84 250l281 737h102l-420 -1087h-100z" />
|
||||||
|
<glyph unicode="w" horiz-adv-x="1481" d="M31 1087h106l174 -630q61 -234 80 -344h6q59 234 86 311l224 663h90l213 -661q72 -235 88 -311h6q8 65 80 348l166 624h100l-295 -1087h-104l-238 727q-23 74 -59 217h-6l-21 -74l-45 -145l-242 -725h-98z" />
|
||||||
|
<glyph unicode="x" horiz-adv-x="1020" d="M55 0l394 559l-379 528h114l324 -458l321 458h109l-373 -528l400 -559h-115l-342 485l-344 -485h-109z" />
|
||||||
|
<glyph unicode="y" horiz-adv-x="940" d="M0 1087h102l230 -610q105 -281 133 -379h6q42 129 137 385l230 604h102l-487 -1263q-59 -154 -99 -208t-93.5 -81t-129.5 -27q-57 0 -127 21v86q58 -16 125 -16q51 0 90 24t70.5 74.5t73 160t53.5 142.5z" />
|
||||||
|
<glyph unicode="z" horiz-adv-x="944" d="M82 0v63l645 936h-598v88h727v-63l-649 -936h651v-88h-776z" />
|
||||||
|
<glyph unicode="{" horiz-adv-x="723" d="M61 528v80q122 2 176 51t54 148v350q0 299 360 305v-90q-138 -5 -200 -58t-62 -157v-305q0 -130 -44 -194t-142 -85v-8q97 -20 141.5 -83.5t44.5 -186.5v-322q0 -102 59.5 -152.5t202.5 -53.5v-91q-195 0 -277.5 75t-82.5 231v337q0 205 -230 209z" />
|
||||||
|
<glyph unicode="|" horiz-adv-x="1108" d="M508 -506v2067h92v-2067h-92z" />
|
||||||
|
<glyph unicode="}" horiz-adv-x="723" d="M72 -233q141 2 201.5 52.5t60.5 153.5v322q0 123 44.5 186.5t141.5 83.5v8q-97 20 -141.5 84t-44.5 195v305q0 103 -61.5 156.5t-200.5 58.5v90q174 0 267 -77.5t93 -227.5v-350q0 -100 54.5 -148.5t175.5 -50.5v-80q-230 -4 -230 -209v-337q0 -155 -82.5 -230.5 t-277.5 -75.5v91z" />
|
||||||
|
<glyph unicode="~" d="M111 625v94q108 110 233 110q61 0 115 -13.5t155 -57.5q126 -58 220 -58q56 0 109.5 30.5t115.5 94.5v-96q-48 -49 -104.5 -81t-129.5 -32q-116 0 -270 72q-124 57 -221 57q-49 0 -108 -30.5t-115 -89.5z" />
|
||||||
|
<glyph unicode="¢" d="M211 745q0 232 102.5 381.5t288.5 182.5v174h82v-166h14q131 0 275 -55l-31 -84q-134 51 -237 51q-187 0 -288.5 -122.5t-101.5 -358.5q0 -225 100.5 -349.5t280.5 -124.5q131 0 267 58v-92q-110 -56 -267 -56h-12v-204h-82v210q-186 30 -288.5 175t-102.5 380z" />
|
||||||
|
<glyph unicode="£" d="M78 0v84q110 21 171.5 110t61.5 224v258h-211v82h211v297q0 204 98 315t281 111q175 0 330 -68l-35 -86q-157 66 -295 66q-141 0 -209.5 -81t-68.5 -253v-301h411v-82h-411v-256q0 -116 -35 -196t-113 -128h809v-96h-995z" />
|
||||||
|
<glyph unicode="¥" d="M43 1462h117l426 -796l428 796h110l-432 -788h283v-82h-338v-205h338v-82h-338v-305h-105v305h-337v82h337v205h-337v82h278z" />
|
||||||
|
<glyph unicode="©" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM193 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89t329.5 88.5t240.5 240.5t89 330q0 174 -85.5 325 t-239 243t-334.5 92q-176 0 -328.5 -88.5t-241.5 -242.5t-89 -329zM489 725q0 208 111 332.5t297 124.5q119 0 227 -52l-37 -83q-98 45 -190 45q-142 0 -222.5 -94.5t-80.5 -264.5q0 -186 74.5 -275t220.5 -89q84 0 198 43v-88q-102 -45 -208 -45q-187 0 -288.5 115 t-101.5 331z" />
|
||||||
|
<glyph unicode="­" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||||
|
<glyph unicode="®" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM193 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89t329.5 88.5t240.5 240.5t89 330q0 174 -85.5 325 t-239 243t-334.5 92q-176 0 -328.5 -88.5t-241.5 -242.5t-89 -329zM608 291v880h211q143 0 222 -62t79 -191q0 -79 -38.5 -139.5t-110.5 -94.5l237 -393h-121l-210 360h-168v-360h-101zM709 731h112q91 0 143 46.5t52 135.5q0 172 -197 172h-110v-354z" />
|
||||||
|
<glyph unicode="´" horiz-adv-x="1182" d="M393 1241v16q73 79 144.5 171.5t97.5 140.5h141v-17q-36 -52 -122.5 -138t-190.5 -173h-70z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="523" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="196" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="87" />
|
||||||
|
<glyph unicode="‐" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||||
|
<glyph unicode="‑" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||||
|
<glyph unicode="‒" horiz-adv-x="659" d="M92 512v82h475v-82h-475z" />
|
||||||
|
<glyph unicode="–" horiz-adv-x="1024" d="M82 512v82h860v-82h-860z" />
|
||||||
|
<glyph unicode="—" horiz-adv-x="2048" d="M82 512v82h1884v-82h-1884z" />
|
||||||
|
<glyph unicode="‘" horiz-adv-x="297" d="M29 981q32 112 81.5 251t92.5 230h65q-30 -101 -64.5 -257t-45.5 -244h-117z" />
|
||||||
|
<glyph unicode="’" horiz-adv-x="297" d="M29 961q29 96 61 241.5t49 259.5h117l12 -20q-75 -265 -174 -481h-65z" />
|
||||||
|
<glyph unicode="“" horiz-adv-x="614" d="M29 981q32 112 81.5 251t92.5 230h65q-30 -101 -64.5 -257t-45.5 -244h-117zM346 981q34 120 83 255t91 226h66q-30 -98 -63 -248.5t-48 -252.5h-117z" />
|
||||||
|
<glyph unicode="”" horiz-adv-x="614" d="M29 961q29 96 61 241.5t49 259.5h117l12 -20q-75 -265 -174 -481h-65zM346 961q30 98 63 248.5t48 252.5h116l13 -20q-36 -128 -85 -261t-89 -220h-66z" />
|
||||||
|
<glyph unicode="•" horiz-adv-x="770" d="M231 748q0 89 40.5 134.5t113.5 45.5t113.5 -47t40.5 -133q0 -85 -41 -133t-113 -48t-113 47t-41 134z" />
|
||||||
|
<glyph unicode="…" horiz-adv-x="1466" d="M162 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM651 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98zM1141 78q0 98 80 98q82 0 82 -98t-82 -98q-80 0 -80 98z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode="€" d="M74 528v82h172q-4 38 -4 113l4 102h-172v82h184q39 272 183 425t362 153q88 0 161 -17t148 -57l-39 -86q-132 72 -270 72q-174 0 -288 -125.5t-155 -364.5h502v-82h-510l-4 -104v-24q0 -65 4 -87h449v-82h-443q30 -217 147.5 -338.5t301.5 -121.5q148 0 287 65v-94 q-81 -34 -150.5 -46.5t-140.5 -12.5q-228 0 -367.5 140t-181.5 408h-180z" />
|
||||||
|
<glyph unicode="™" horiz-adv-x="1485" d="M10 1384v78h522v-78h-219v-643h-86v643h-217zM608 741v721h125l221 -606l224 606h125v-721h-86v398l4 207h-7l-227 -605h-74l-221 609h-6l4 -201v-408h-82z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
||||||
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1,146 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>
|
||||||
|
This is a custom SVG webfont generated by Font Squirrel.
|
||||||
|
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||||
|
Foundry : Ascender Corporation
|
||||||
|
Foundry URL : httpwwwascendercorpcom
|
||||||
|
</metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="OpenSansLightItalic" horiz-adv-x="1128" >
|
||||||
|
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||||
|
<missing-glyph horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="	" horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="!" horiz-adv-x="502" d="M80 57q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-68 -34.5q-67 0 -67 73zM186 377l203 1085h119l-260 -1085h-62z" />
|
||||||
|
<glyph unicode=""" horiz-adv-x="721" d="M248 934l80 528h127l-146 -528h-61zM578 934l79 528h127l-145 -528h-61z" />
|
||||||
|
<glyph unicode="#" horiz-adv-x="1323" d="M82 451l8 79h299l119 398h-297l8 80h311l134 454h90l-136 -454h365l135 454h86l-135 -454h285l-8 -80h-302l-118 -398h303l-8 -79h-320l-133 -451h-90l135 451h-360l-134 -451h-88l134 451h-283zM475 530h363l120 398h-362z" />
|
||||||
|
<glyph unicode="$" d="M141 182v94q65 -34 153.5 -53.5t160.5 -19.5l110 512q-110 53 -153 91t-66.5 87.5t-23.5 116.5q0 155 105.5 250.5t272.5 99.5l41 192h80l-41 -192q149 -5 277 -68l-35 -78q-110 61 -256 70l-109 -514q124 -60 172.5 -99.5t73.5 -88.5t25 -115q0 -151 -110.5 -243 t-297.5 -103l-53 -240h-82l51 240q-79 2 -158 18t-137 43zM410 1018q0 -78 37 -128.5t137 -96.5l102 491q-134 -9 -205 -80t-71 -186zM537 203q142 7 223.5 74.5t81.5 183.5q0 76 -48 129.5t-157 97.5z" />
|
||||||
|
<glyph unicode="%" horiz-adv-x="1556" d="M145 862q0 160 52 312t138 229.5t193 77.5q232 0 232 -283q0 -175 -50 -327t-136 -230t-197 -78q-112 0 -172 75.5t-60 223.5zM213 0l1135 1462h110l-1139 -1462h-106zM231 868q0 -115 41 -173t113 -58q84 0 148.5 72t102.5 204t38 277q0 109 -36 163t-114 54 q-79 0 -145 -71.5t-107 -203t-41 -264.5zM905 276q0 160 52 312t138 229.5t193 77.5q121 0 176.5 -71.5t55.5 -211.5q0 -175 -50 -327t-136 -230t-197 -78q-112 0 -172 75.5t-60 223.5zM991 283q0 -116 41 -174t113 -58q130 0 209.5 166.5t79.5 386.5q0 109 -36 163t-114 54 q-80 0 -146.5 -72.5t-106.5 -202.5t-40 -263z" />
|
||||||
|
<glyph unicode="&" horiz-adv-x="1331" d="M78 324q0 162 99 277.5t325 215.5l-41 67q-78 128 -78 251q0 157 101 253.5t264 96.5q145 0 227 -76.5t82 -206.5q0 -85 -41 -154t-121 -128t-256 -138l330 -463q73 75 135.5 176.5t91.5 186.5h111q-102 -247 -285 -436l184 -246h-123l-131 184q-121 -108 -242 -156 t-266 -48q-167 0 -266.5 94t-99.5 250zM176 328q0 -119 78 -192t211 -73q108 0 211.5 42.5t222.5 146.5l-352 493q-164 -79 -232 -134.5t-103.5 -124t-35.5 -158.5zM485 1135q0 -132 109 -281q203 89 279.5 163.5t76.5 182.5q0 91 -56.5 143t-145.5 52q-125 0 -194 -68 t-69 -192z" />
|
||||||
|
<glyph unicode="'" horiz-adv-x="403" d="M254 934l80 528h127l-146 -528h-61z" />
|
||||||
|
<glyph unicode="(" horiz-adv-x="526" d="M104 270q0 343 122 633t382 559h105q-259 -276 -384.5 -568t-125.5 -618q0 -317 127 -600h-80q-146 262 -146 594z" />
|
||||||
|
<glyph unicode=")" horiz-adv-x="526" d="M-156 -324q257 274 383.5 566.5t126.5 619.5q0 148 -28.5 294t-98.5 306h80q146 -262 146 -594q0 -345 -123.5 -636t-380.5 -556h-105z" />
|
||||||
|
<glyph unicode="*" horiz-adv-x="1137" d="M233 1217l39 102l394 -168l47 408l121 -19l-109 -405l438 8l-8 -107l-416 29l181 -401l-115 -37l-135 417l-285 -348l-78 78l318 318z" />
|
||||||
|
<glyph unicode="+" d="M162 672v100h401v404h101v-404h401v-100h-401v-400h-101v400h-401z" />
|
||||||
|
<glyph unicode="," horiz-adv-x="451" d="M-90 -264q79 132 141 271t88 231h111l8 -23q-34 -92 -114 -233.5t-160 -245.5h-74z" />
|
||||||
|
<glyph unicode="-" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||||
|
<glyph unicode="." horiz-adv-x="485" d="M82 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" />
|
||||||
|
<glyph unicode="/" horiz-adv-x="641" d="M-100 0l815 1462h112l-817 -1462h-110z" />
|
||||||
|
<glyph unicode="0" d="M139 494q0 186 44.5 381.5t124 334t187 207t240.5 68.5q340 0 340 -469q0 -201 -41 -405t-116.5 -346t-183.5 -213.5t-242 -71.5q-176 0 -264.5 126.5t-88.5 387.5zM242 504q0 -222 62.5 -329t197.5 -107q139 0 244 112t166 337t61 489q0 199 -59.5 295t-190.5 96 q-134 0 -241.5 -113t-173.5 -329t-66 -451z" />
|
||||||
|
<glyph unicode="1" d="M354 1204l406 258h90l-313 -1462h-105l225 1055q19 92 74 293q-42 -36 -75.5 -61t-249.5 -161z" />
|
||||||
|
<glyph unicode="2" d="M39 0l22 104l449 402q198 177 284 276.5t126.5 186.5t40.5 180q0 112 -66 178t-197 66q-176 0 -333 -129l-54 73q180 146 394 146q173 0 268.5 -85t95.5 -237q0 -110 -43.5 -208.5t-141.5 -211.5t-311 -303l-383 -338v-4h736l-17 -96h-870z" />
|
||||||
|
<glyph unicode="3" d="M55 53v101q172 -86 344 -86q197 0 303.5 89.5t106.5 252.5q0 145 -89 223t-247 78h-117l21 96h110q209 0 333 95.5t124 258.5q0 114 -63.5 175t-188.5 61q-167 0 -344 -131l-49 75q84 67 188 104.5t218 37.5q161 0 252.5 -82.5t91.5 -226.5q0 -162 -106 -275t-286 -143 v-4q117 -24 185.5 -115.5t68.5 -226.5q0 -134 -64 -233t-179.5 -148t-274.5 -49q-96 0 -184.5 20.5t-153.5 52.5z" />
|
||||||
|
<glyph unicode="4" d="M23 371l20 96l881 1010h118l-215 -1018h265l-21 -88h-264l-80 -371h-96l80 371h-688zM150 459h579q79 369 119 558.5t86 354.5h-4q-66 -91 -129 -166z" />
|
||||||
|
<glyph unicode="5" d="M88 51v107q170 -90 340 -90q208 0 328.5 114.5t120.5 313.5q0 140 -85 219.5t-225 79.5q-133 0 -243 -41l-66 49l193 659h624l-18 -96h-541l-149 -516q98 29 215 29q188 0 292.5 -102t104.5 -279q0 -237 -148 -377.5t-407 -140.5q-84 0 -177.5 20t-158.5 51z" />
|
||||||
|
<glyph unicode="6" d="M170 428q0 283 105 544.5t269.5 385t383.5 123.5q123 0 182 -21l-18 -90q-86 23 -170 23q-233 0 -393.5 -174t-233.5 -502h8q68 94 164 143t211 49q161 0 250.5 -100.5t89.5 -282.5q0 -156 -60 -281t-171 -195t-257 -70q-171 0 -265.5 119t-94.5 329zM270 414 q0 -164 72.5 -255t200.5 -91q112 0 196.5 58.5t130 162t45.5 229.5q0 146 -67 224.5t-195 78.5q-81 0 -154 -31.5t-129 -87t-78 -115t-22 -173.5z" />
|
||||||
|
<glyph unicode="7" d="M244 0l796 1366h-766l23 96h858l-20 -110l-779 -1352h-112z" />
|
||||||
|
<glyph unicode="8" d="M98 326q0 159 100.5 268.5t321.5 187.5q-100 72 -144 152t-44 180q0 159 114 265t291 106q163 0 258 -85t95 -229q0 -138 -84 -234.5t-285 -172.5q130 -78 190 -170.5t60 -208.5t-58 -208t-165.5 -144.5t-260.5 -52.5q-178 0 -283.5 92.5t-105.5 253.5zM201 340 q0 -136 77.5 -206.5t219.5 -70.5q168 0 270 91t102 233q0 104 -62 189t-198 157q-218 -73 -313.5 -167.5t-95.5 -225.5zM428 1114q0 -91 41.5 -159t157.5 -142q192 62 279 144t87 206q0 109 -70.5 172.5t-195.5 63.5q-130 0 -214.5 -82t-84.5 -203z" />
|
||||||
|
<glyph unicode="9" d="M115 2v90q87 -29 192 -29q474 0 627 674h-8q-140 -192 -367 -192q-162 0 -255 105t-93 284q0 155 59.5 281t170.5 196t257 70q174 0 267.5 -115.5t93.5 -333.5q0 -288 -101.5 -548t-263.5 -382t-393 -122q-114 0 -186 22zM313 942q0 -145 67.5 -225t192.5 -80 q83 0 157.5 32.5t129 87.5t76.5 114t22 176q0 166 -71 256t-201 90q-112 0 -197.5 -58.5t-130.5 -162.5t-45 -230z" />
|
||||||
|
<glyph unicode=":" horiz-adv-x="485" d="M102 55q0 56 25.5 88.5t69.5 32.5q65 0 65 -72q0 -55 -25.5 -88.5t-66.5 -33.5q-68 0 -68 73zM260 989q0 57 25.5 89t68.5 32q66 0 66 -72q0 -55 -25 -89t-67 -34q-68 0 -68 74z" />
|
||||||
|
<glyph unicode=";" horiz-adv-x="485" d="M-53 -264q79 132 141 271t88 231h111l8 -23q-35 -96 -118.5 -242t-156.5 -237h-73zM266 989q0 57 25.5 89t68.5 32q66 0 66 -72q0 -55 -25 -89t-67 -34q-68 0 -68 74z" />
|
||||||
|
<glyph unicode="<" d="M137 676v74l914 471v-103l-801 -399l801 -350v-107z" />
|
||||||
|
<glyph unicode="=" d="M168 461v98h903v-98h-903zM168 885v100h903v-100h-903z" />
|
||||||
|
<glyph unicode=">" d="M170 262v107l801 350l-801 399v103l915 -471v-74z" />
|
||||||
|
<glyph unicode="?" horiz-adv-x="799" d="M170 59q0 56 25 88.5t69 32.5q66 0 66 -71q0 -54 -24.5 -88.5t-67.5 -34.5q-68 0 -68 73zM182 1376q85 49 171.5 78t187.5 29q159 0 250.5 -84.5t91.5 -229.5q0 -127 -66 -234t-231 -226q-85 -61 -132.5 -108.5t-73 -95t-46.5 -143.5h-92l6 29q29 132 82 206.5t157 147.5 q118 84 175 145.5t86.5 127.5t29.5 141q0 108 -67.5 170t-182.5 62q-139 0 -307 -101z" />
|
||||||
|
<glyph unicode="@" horiz-adv-x="1724" d="M125 508q0 276 121.5 493.5t337 337t473.5 119.5q189 0 330.5 -72.5t221 -213t79.5 -314.5q0 -179 -56 -323.5t-154.5 -227t-211.5 -82.5q-98 0 -154.5 55t-56.5 144h-4q-54 -97 -132.5 -148t-168.5 -51q-112 0 -178 73t-66 202q0 156 63 283t178 198.5t261 71.5 q122 0 252 -52l-84 -315q-39 -140 -39 -221q0 -71 34.5 -111.5t100.5 -40.5q86 0 160 73.5t117.5 198t43.5 251.5q0 156 -65 277t-187 188t-292 67q-235 0 -424.5 -108.5t-295.5 -304t-106 -439.5q0 -288 155 -449t435 -161q207 0 420 82v-90q-210 -82 -428 -82 q-203 0 -357.5 82.5t-238.5 239t-84 370.5zM610 506q0 -92 40.5 -142.5t113.5 -50.5q101 0 180.5 89t124.5 255l78 289q-66 23 -139 23q-113 0 -204.5 -59t-142.5 -165.5t-51 -238.5z" />
|
||||||
|
<glyph unicode="A" horiz-adv-x="1059" d="M-111 0l822 1468h67l201 -1468h-105l-69 520h-512l-287 -520h-117zM344 612h449l-39 291q-31 242 -39 402q-30 -63 -64.5 -130t-306.5 -563z" />
|
||||||
|
<glyph unicode="B" horiz-adv-x="1202" d="M102 0l310 1462h379q190 0 290.5 -84t100.5 -241q0 -153 -90 -249t-254 -124v-4q125 -31 188.5 -113.5t63.5 -204.5q0 -205 -140.5 -323.5t-390.5 -118.5h-457zM223 90h342q201 0 309.5 87.5t108.5 256.5q0 145 -90 216t-275 71h-260zM377 811h278q206 0 313 81t107 238 q0 119 -78 180.5t-229 61.5h-272z" />
|
||||||
|
<glyph unicode="C" horiz-adv-x="1169" d="M170 535q0 266 104.5 488t284.5 341t402 119q177 0 307 -68l-45 -90q-55 30 -124.5 47t-137.5 17q-197 0 -351.5 -104.5t-245 -304.5t-90.5 -441q0 -225 110.5 -346t317.5 -121q140 0 304 51v-94q-156 -49 -316 -49q-252 0 -386 145t-134 410z" />
|
||||||
|
<glyph unicode="D" horiz-adv-x="1350" d="M102 0l310 1462h305q282 0 426.5 -147.5t144.5 -435.5q0 -253 -109.5 -461.5t-300.5 -313t-446 -104.5h-330zM221 90h209q226 0 394.5 94.5t261 275.5t92.5 412q0 498 -476 498h-206z" />
|
||||||
|
<glyph unicode="E" horiz-adv-x="1067" d="M102 0l310 1462h727l-21 -94h-624l-117 -553h590l-21 -94h-588l-135 -627h627l-21 -94h-727z" />
|
||||||
|
<glyph unicode="F" horiz-adv-x="981" d="M102 0l310 1462h708l-20 -94h-604l-134 -620h570l-21 -95h-569l-137 -653h-103z" />
|
||||||
|
<glyph unicode="G" horiz-adv-x="1374" d="M170 547q0 265 105 483.5t283.5 335.5t395.5 117q113 0 203 -19t184 -59l-38 -94q-110 46 -189.5 62t-167.5 16q-184 0 -339 -107.5t-244 -301.5t-89 -433q0 -229 114.5 -352t326.5 -123q155 0 309 47l117 526h-303l18 90h406l-150 -682q-211 -73 -405 -73 q-257 0 -397 146t-140 421z" />
|
||||||
|
<glyph unicode="H" horiz-adv-x="1366" d="M102 0l310 1462h102l-139 -649h760l137 649h100l-309 -1462h-100l151 719h-760l-149 -719h-103z" />
|
||||||
|
<glyph unicode="I" horiz-adv-x="504" d="M102 0l310 1462h98l-309 -1462h-99z" />
|
||||||
|
<glyph unicode="J" horiz-adv-x="477" d="M-324 -336l11 92q57 -20 137 -20q213 0 262 241l309 1485h105l-314 -1491q-35 -170 -125 -250.5t-241 -80.5q-48 0 -88 8t-56 16z" />
|
||||||
|
<glyph unicode="K" horiz-adv-x="1122" d="M102 0l310 1462h102l-158 -723l133 121l680 602h138l-699 -610l371 -852h-111l-342 788l-190 -153l-131 -635h-103z" />
|
||||||
|
<glyph unicode="L" horiz-adv-x="938" d="M102 0l310 1462h102l-289 -1366h621l-23 -96h-721z" />
|
||||||
|
<glyph unicode="M" horiz-adv-x="1669" d="M109 0l309 1462h143l205 -1257h6l733 1257h150l-301 -1462h-101l191 901q79 369 100 447h-6l-780 -1348h-51l-222 1348h-6q-20 -154 -78 -426l-196 -922h-96z" />
|
||||||
|
<glyph unicode="N" horiz-adv-x="1372" d="M102 0l310 1462h80l522 -1294h8q23 176 74 416l188 878h94l-309 -1462h-86l-516 1284h-8q-23 -149 -48 -273t-214 -1011h-95z" />
|
||||||
|
<glyph unicode="O" horiz-adv-x="1464" d="M172 559q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5q0 -255 -94 -481.5t-252 -338t-365 -111.5q-250 0 -385 149t-135 430zM276 573q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300t79 430.5q0 240 -104.5 364t-310.5 124 q-174 0 -308.5 -101t-214.5 -298t-80 -417z" />
|
||||||
|
<glyph unicode="P" horiz-adv-x="1145" d="M102 0l310 1462h315q202 0 310 -92.5t108 -267.5q0 -500 -610 -500h-201l-129 -602h-103zM350 694h191q252 0 373.5 96.5t121.5 305.5q0 274 -329 274h-211z" />
|
||||||
|
<glyph unicode="Q" horiz-adv-x="1464" d="M172 559q0 262 93 477.5t255 331t373 115.5q247 0 378.5 -148.5t131.5 -423.5q0 -216 -70 -418t-186.5 -324t-274.5 -167l267 -350h-142l-231 332l-74 -4q-250 0 -385 149t-135 430zM276 573q0 -245 109.5 -373t319.5 -128q169 0 300 98.5t210 300t79 430.5 q0 240 -104.5 364t-310.5 124q-174 0 -308.5 -101t-214.5 -298t-80 -417z" />
|
||||||
|
<glyph unicode="R" horiz-adv-x="1145" d="M102 0l310 1462h303q430 0 430 -360q0 -182 -103.5 -303t-281.5 -152q201 -591 221 -647h-111l-211 633h-323l-131 -633h-103zM358 725h252q208 0 317 95.5t109 281.5q0 268 -329 268h-211z" />
|
||||||
|
<glyph unicode="S" horiz-adv-x="1020" d="M37 55v109q163 -92 348 -92q188 0 295.5 86.5t107.5 232.5q0 61 -17 104.5t-52.5 78.5t-91 68t-131.5 75q-150 76 -209.5 164t-59.5 206t59 207.5t165 139t237 49.5q99 0 180 -17.5t168 -60.5l-32 -94q-66 40 -151.5 63t-164.5 23q-163 0 -259.5 -82.5t-96.5 -218.5 q0 -103 49 -170t182 -133q154 -79 213.5 -130t89 -113t29.5 -147q0 -126 -65.5 -224.5t-179.5 -148.5t-269 -50q-88 0 -172.5 17t-171.5 58z" />
|
||||||
|
<glyph unicode="T" horiz-adv-x="985" d="M193 1368l20 94h973l-19 -94h-440l-289 -1368h-102l289 1368h-432z" />
|
||||||
|
<glyph unicode="U" horiz-adv-x="1370" d="M176 381q0 83 27 201l186 880h103l-193 -899q-20 -89 -20 -184q0 -309 342 -309q195 0 307.5 96.5t158.5 318.5l207 977h101l-207 -977q-58 -270 -197 -387.5t-375 -117.5q-440 0 -440 401z" />
|
||||||
|
<glyph unicode="V" horiz-adv-x="1079" d="M201 1462h100l117 -950q26 -217 35 -365h4q51 111 124 247l572 1068h117l-799 -1462h-88z" />
|
||||||
|
<glyph unicode="W" horiz-adv-x="1702" d="M238 1462h100l47 -1031l4 -165l-2 -86h6q85 226 170 398l434 884h105l61 -878q19 -266 19 -410h6q30 86 61.5 163t493.5 1125h108q-169 -365 -330.5 -731t-328.5 -731h-78l-78 1075q-11 142 -11 219l1 47h-8q-27 -76 -62 -153.5t-563 -1187.5h-82z" />
|
||||||
|
<glyph unicode="X" horiz-adv-x="971" d="M-135 0l608 766l-272 696h106l240 -626l483 626h119l-555 -719l285 -743h-107l-254 678l-526 -678h-127z" />
|
||||||
|
<glyph unicode="Y" horiz-adv-x="965" d="M193 1462h100l201 -817l544 817h117l-631 -932l-108 -530h-105l119 545z" />
|
||||||
|
<glyph unicode="Z" d="M-12 0l22 92l1069 1276h-764l23 94h887l-19 -88l-1069 -1280h799l-23 -94h-925z" />
|
||||||
|
<glyph unicode="[" horiz-adv-x="537" d="M-57 -324l376 1786h429l-19 -90h-330l-340 -1605h330l-20 -91h-426z" />
|
||||||
|
<glyph unicode="\" horiz-adv-x="641" d="M209 1462h86l242 -1462h-82z" />
|
||||||
|
<glyph unicode="]" horiz-adv-x="537" d="M-176 -324l18 91h330l340 1605h-330l21 90h426l-377 -1786h-428z" />
|
||||||
|
<glyph unicode="^" horiz-adv-x="1047" d="M70 569l587 906h91l260 -906h-105l-217 809l-500 -809h-116z" />
|
||||||
|
<glyph unicode="_" horiz-adv-x="801" d="M-182 -291l18 86h807l-18 -86h-807z" />
|
||||||
|
<glyph unicode="`" horiz-adv-x="1135" d="M487 1548v21h115q46 -129 164 -303v-25h-66q-50 52 -114 144.5t-99 162.5z" />
|
||||||
|
<glyph unicode="a" horiz-adv-x="1133" d="M102 354q0 197 75 376t200.5 276.5t277.5 97.5q232 0 279 -219h6l59 202h80l-229 -1087h-82l45 274h-6q-84 -142 -187 -218t-237 -76q-281 0 -281 374zM205 365q0 -152 50 -223.5t151 -71.5q89 0 177.5 62t159 166t107.5 230t37 213q0 79 -26 141.5t-77 99t-127 36.5 q-124 0 -224 -82t-164 -245.5t-64 -325.5z" />
|
||||||
|
<glyph unicode="b" horiz-adv-x="1151" d="M76 0l327 1556h95q-131 -628 -162 -751h6q93 156 199 229.5t231 73.5q281 0 281 -375q0 -203 -76 -380t-201 -273t-276 -96q-113 0 -186 59t-97 166h-6l-55 -209h-80zM268 346q0 -129 64 -202.5t166 -73.5q124 0 224 83t164 245t64 325q0 152 -49 223.5t-151 71.5 q-91 0 -180 -61.5t-160.5 -169.5t-106.5 -235t-35 -206z" />
|
||||||
|
<glyph unicode="c" horiz-adv-x="887" d="M102 397q0 193 73.5 361.5t198.5 257t290 88.5q134 0 241 -43l-28 -90q-107 47 -218 47q-129 0 -232.5 -77t-162.5 -222t-59 -320q0 -158 73.5 -243.5t208.5 -85.5q71 0 131.5 13t131.5 46v-92q-116 -57 -273 -57q-174 0 -274.5 110.5t-100.5 306.5z" />
|
||||||
|
<glyph unicode="d" horiz-adv-x="1133" d="M102 354q0 193 71.5 370t197.5 278.5t284 101.5q230 0 279 -219h4q12 66 143 671h99l-330 -1556h-82l45 274h-6q-173 -294 -424 -294q-281 0 -281 374zM205 365q0 -295 201 -295q89 0 178.5 62.5t160 168t106.5 231t36 209.5q0 126 -61.5 201.5t-168.5 75.5 q-124 0 -224 -83t-164 -242.5t-64 -327.5z" />
|
||||||
|
<glyph unicode="e" horiz-adv-x="928" d="M102 395q0 181 71 347t195.5 264t274.5 98q114 0 182 -61t68 -166q0 -181 -163.5 -276t-485.5 -95h-33q-6 -44 -6 -98q0 -165 74 -251.5t213 -86.5q132 0 276 73v-94q-140 -69 -299 -69q-173 0 -270 109.5t-97 305.5zM225 594h49q517 0 517 270q0 67 -43.5 110.5 t-116.5 43.5q-131 0 -243.5 -115.5t-162.5 -308.5z" />
|
||||||
|
<glyph unicode="f" horiz-adv-x="578" d="M-233 -383q53 -16 100 -16q88 0 134 53t75 186l246 1166h-205l14 67l205 14l35 160q35 168 116.5 244t227.5 76q73 0 166 -31l-25 -80q-87 27 -147 27q-96 0 -153.5 -53.5t-84.5 -178.5l-35 -164h248l-16 -81h-248l-252 -1190q-33 -161 -104 -234.5t-195 -73.5 q-48 0 -102 19v90z" />
|
||||||
|
<glyph unicode="g" horiz-adv-x="1040" d="M-88 -217q0 236 309 334q-78 42 -78 123q0 123 191 202q-71 36 -110.5 105.5t-39.5 157.5q0 111 53.5 204t148 146t206.5 53q69 0 147 -21h361l-17 -79l-243 -11q26 -28 43.5 -84t17.5 -114q0 -109 -54.5 -206.5t-148 -145.5t-213.5 -48q-63 0 -77 9q-80 -33 -124 -73 t-44 -81t31.5 -64.5t113.5 -31.5l121 -11q346 -31 346 -264q0 -112 -65 -197.5t-187 -131.5t-291 -46q-186 0 -291.5 72t-105.5 203zM14 -207q0 -101 81 -150t224 -49q203 0 317 74.5t114 204.5q0 85 -62.5 130.5t-218.5 57.5l-160 15q-157 -45 -226 -114.5t-69 -168.5z M285 711q0 -112 58.5 -170t164.5 -58q88 0 154 37t102.5 114t36.5 169q0 104 -56 161.5t-157 57.5q-93 0 -161 -43t-105 -116t-37 -152z" />
|
||||||
|
<glyph unicode="h" horiz-adv-x="1143" d="M76 0l332 1556h96l-86 -411q-44 -200 -66 -279h6q78 113 186.5 175.5t229.5 62.5q124 0 192 -65t68 -183q0 -70 -24 -182l-148 -674h-98l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -188t-103.5 -286l-102 -477h-98z" />
|
||||||
|
<glyph unicode="i" horiz-adv-x="475" d="M76 0l231 1087h96l-229 -1087h-98zM350 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" />
|
||||||
|
<glyph unicode="j" horiz-adv-x="475" d="M-279 -381q47 -22 113 -22q82 0 128.5 51.5t72.5 177.5l266 1261h96l-268 -1271q-35 -165 -106.5 -236.5t-188.5 -71.5q-62 0 -113 19v92zM350 1366q0 55 22 88t60 33q57 0 57 -72q0 -57 -22 -90t-57 -33q-29 0 -44.5 19.5t-15.5 54.5z" />
|
||||||
|
<glyph unicode="k" horiz-adv-x="944" d="M76 0l330 1556h96l-166 -780l-70 -299h4l609 610h125l-474 -469l297 -618h-106l-264 559l-205 -188l-80 -371h-96z" />
|
||||||
|
<glyph unicode="l" horiz-adv-x="475" d="M76 0l334 1556h94l-334 -1556h-94z" />
|
||||||
|
<glyph unicode="m" horiz-adv-x="1751" d="M72 0l231 1087h80l-33 -210h6q80 113 181.5 170t212.5 57q106 0 163 -67t60 -195h6q77 129 181 195.5t222 66.5q117 0 182.5 -61.5t65.5 -176.5q0 -29 -2.5 -56.5t-19.5 -119.5l-152 -690h-100l149 680q25 120 25 176q0 77 -43 119.5t-119 42.5q-157 0 -277.5 -137.5 t-168.5 -362.5l-109 -518h-102l147 674q25 125 25 162q0 182 -154 182q-106 0 -200 -67.5t-159 -188.5t-100 -287l-100 -475h-98z" />
|
||||||
|
<glyph unicode="n" horiz-adv-x="1143" d="M76 0l231 1087h82l-37 -221h6q164 238 416 238q130 0 195 -64t65 -184q0 -70 -24 -182l-148 -674h-98l149 692q21 92 21 156q0 80 -43.5 125t-134.5 45q-112 0 -210.5 -67t-166 -187.5t-103.5 -286.5l-102 -477h-98z" />
|
||||||
|
<glyph unicode="o" horiz-adv-x="1124" d="M98 403q0 191 73 358t197 257t281 90q180 0 278.5 -108.5t98.5 -299.5q0 -197 -71.5 -368.5t-195.5 -261.5t-286 -90q-184 0 -279.5 109.5t-95.5 313.5zM201 408q0 -342 282 -342q127 0 225.5 77.5t157 228t58.5 330.5q0 154 -73 237t-210 83q-124 0 -223 -78.5 t-158 -225t-59 -310.5z" />
|
||||||
|
<glyph unicode="p" horiz-adv-x="1149" d="M-33 -492l336 1579h82l-45 -274h6q91 153 195.5 224t228.5 71q135 0 208 -92.5t73 -282.5q0 -195 -72 -371t-197.5 -277t-283.5 -101q-230 0 -279 219h-4q-13 -72 -149 -695h-99zM266 346q0 -125 61.5 -200.5t168.5 -75.5q124 0 225 84t164 243.5t63 325.5 q0 295 -200 295q-87 0 -174 -58.5t-161.5 -167.5t-110.5 -237.5t-36 -208.5z" />
|
||||||
|
<glyph unicode="q" horiz-adv-x="1157" d="M98 354q0 201 75.5 379t200.5 274.5t277 96.5q109 0 183.5 -58t99.5 -167h6l55 208h80l-327 -1556h-95l98 470l64 282h-6q-93 -156 -199 -229.5t-231 -73.5q-281 0 -281 374zM201 365q0 -143 45.5 -219t154.5 -76q92 0 182 62.5t160.5 171.5t105 236.5t34.5 200.5 q0 130 -63.5 203.5t-166.5 73.5q-124 0 -224 -83t-164 -245t-64 -325z" />
|
||||||
|
<glyph unicode="r" horiz-adv-x="752" d="M72 0l231 1087h80l-29 -204h6q73 94 123 135.5t106.5 64.5t123.5 23q69 0 123 -14l-21 -93q-47 15 -113 15q-94 0 -179 -64t-153 -192t-100 -277l-100 -481h-98z" />
|
||||||
|
<glyph unicode="s" horiz-adv-x="827" d="M25 55v107q74 -46 153 -71t148 -25q138 0 211 57.5t73 163.5q0 42 -15.5 74t-50 61.5t-132.5 85.5q-148 80 -200 145.5t-52 159.5q0 128 98.5 209.5t259.5 81.5q75 0 158.5 -17.5t140.5 -46.5l-35 -88q-136 64 -264 64q-116 0 -186 -53t-70 -138q0 -55 17 -88t60.5 -68.5 t119.5 -76.5q114 -63 161.5 -103.5t70 -86.5t22.5 -107q0 -144 -103 -229.5t-280 -85.5q-173 0 -305 75z" />
|
||||||
|
<glyph unicode="t" horiz-adv-x="616" d="M113 1006l14 67l184 17l97 253h55l-55 -256h286l-18 -81h-283l-135 -635q-22 -99 -22 -164q0 -139 126 -139q68 0 152 26v-86q-101 -28 -170 -28q-99 0 -153 54.5t-54 158.5q0 73 29 206l129 607h-182z" />
|
||||||
|
<glyph unicode="u" horiz-adv-x="1143" d="M109 227q0 60 22 170l150 690h100l-152 -698q-22 -106 -22 -158q0 -74 47.5 -117.5t138.5 -43.5q110 0 207.5 65.5t164 187t99.5 279.5l105 485h98l-231 -1087h-80l28 205h-6q-167 -221 -403 -221q-131 0 -198.5 62t-67.5 181z" />
|
||||||
|
<glyph unicode="v" horiz-adv-x="895" d="M104 1087h101l108 -735q26 -165 33 -254h6q51 115 129 256l406 733h102l-600 -1087h-113z" />
|
||||||
|
<glyph unicode="w" horiz-adv-x="1393" d="M121 1087h92l13 -821l-3 -157h6q61 134 150 297l373 681h77l64 -681q14 -147 14 -297h6l24 61l101 236l320 681h96l-508 -1087h-108l-60 686q-14 224 -14 266h-6q-34 -92 -144 -290l-356 -662h-117z" />
|
||||||
|
<glyph unicode="x" horiz-adv-x="922" d="M-72 0l471 559l-245 528h100l207 -462l373 462h120l-448 -534l258 -553h-98l-224 483l-393 -483h-121z" />
|
||||||
|
<glyph unicode="y" horiz-adv-x="920" d="M-217 -379q71 -27 137 -27q80 0 147 49.5t130 164.5t100 184l-174 1095h100l82 -548q51 -351 55 -449h11q43 105 186 367l348 630h103l-713 -1290q-72 -127 -122.5 -178t-114 -81t-146.5 -30q-68 0 -129 21v92z" />
|
||||||
|
<glyph unicode="z" horiz-adv-x="887" d="M-29 0l15 72l776 932h-543l17 83h659l-18 -83l-762 -920h602l-17 -84h-729z" />
|
||||||
|
<glyph unicode="{" horiz-adv-x="709" d="M59 528l21 78q126 0 191 49t89 158l89 393q30 135 106 195.5t215 60.5h29l-17 -86q-86 -2 -129 -20.5t-69.5 -61.5t-44.5 -120l-74 -338q-30 -134 -91.5 -194.5t-164.5 -78.5v-4q68 -18 105.5 -68.5t37.5 -121.5q0 -52 -24 -164l-47 -225q-13 -58 -13 -101 q0 -61 37.5 -89t138.5 -28v-86h-20q-256 0 -256 199q0 45 16 115l56 252q18 90 18 127q0 159 -199 159z" />
|
||||||
|
<glyph unicode="|" d="M584 -510v2071h100v-2071h-100z" />
|
||||||
|
<glyph unicode="}" horiz-adv-x="709" d="M-41 -238q96 2 138 21t68.5 61t43.5 121l74 338q27 126 87.5 189.5t168.5 82.5v5q-75 20 -109.5 72.5t-34.5 117.5q0 55 18 131l54 258q12 61 12 101q0 44 -18 69t-54 36t-116 11l20 86h21q131 0 189.5 -51t58.5 -147q0 -41 -17 -115l-55 -252q-19 -95 -19 -127 q0 -77 49.5 -118.5t149.5 -41.5l-20 -78q-125 0 -191 -48.5t-90 -157.5l-88 -394q-32 -139 -108.5 -197.5t-213.5 -58.5h-18v86z" />
|
||||||
|
<glyph unicode="~" d="M127 625v94q108 110 233 110q61 0 115 -13.5t156 -57.5q126 -58 219 -58q54 0 107.5 29t117.5 96v-96q-111 -113 -233 -113q-117 0 -271 72q-62 29 -112.5 43t-108.5 14q-49 0 -108 -30.5t-115 -89.5z" />
|
||||||
|
<glyph unicode="¢" d="M250 600q0 184 63.5 341t178 253t256.5 111l36 178h90l-38 -176q116 -4 217 -43l-29 -90q-107 47 -217 47q-130 0 -233 -76t-162.5 -221t-59.5 -322q0 -164 74.5 -247t208.5 -83q127 0 264 60v-92q-118 -58 -281 -58l-40 -202h-93l45 215q-132 25 -206 132.5t-74 272.5z " />
|
||||||
|
<glyph unicode="£" d="M-4 0l16 84q93 11 165.5 95.5t107.5 236.5l57 260h-199l17 82h198l76 350q41 187 155 279t290 92q170 0 313 -78l-39 -84l-54 26q-108 50 -231 50q-134 0 -220.5 -74.5t-117.5 -220.5l-73 -340h409l-18 -82h-408l-57 -268q-50 -225 -188 -314h759l-20 -94h-938z" />
|
||||||
|
<glyph unicode="¥" d="M166 289l18 84h299l41 190h-301l17 76h258l-215 823h100l201 -817l544 817h117l-559 -823h266l-16 -76h-315l-39 -190h317l-18 -84h-316l-59 -289h-105l64 289h-299z" />
|
||||||
|
<glyph unicode="©" horiz-adv-x="1704" d="M147 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM240 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89q174 0 325 85.5t243 239t92 334.5q0 178 -89 330 t-240.5 241t-330.5 89q-182 0 -335 -92t-238.5 -243t-85.5 -325zM537 725q0 207 110 332t297 125q119 0 227 -52l-36 -83q-99 45 -191 45q-142 0 -222.5 -94.5t-80.5 -264.5q0 -186 74.5 -275t220.5 -89q85 0 199 43v-88q-104 -45 -209 -45q-187 0 -288 116t-101 330z" />
|
||||||
|
<glyph unicode="­" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||||
|
<glyph unicode="®" horiz-adv-x="1704" d="M150 731q0 207 103.5 382t276.5 272.5t371 97.5q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-204 0 -376.5 100.5t-273.5 273t-101 377.5zM242 731q0 -178 88.5 -329.5t240.5 -240.5t330 -89q174 0 325 85.5t243 239t92 334.5q0 178 -89 330 t-240.5 241t-330.5 89q-182 0 -335 -92t-238.5 -243t-85.5 -325zM657 291v880h211q143 0 222 -62t79 -191q0 -80 -39.5 -141t-109.5 -93l237 -393h-120l-211 360h-168v-360h-101zM758 731h112q93 0 144 46.5t51 135.5q0 172 -197 172h-110v-354z" />
|
||||||
|
<glyph unicode="´" horiz-adv-x="1135" d="M580 1241v21q66 51 150.5 142t129.5 165h137v-23q-51 -66 -157.5 -158.5t-192.5 -146.5h-67z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="523" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="196" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="87" />
|
||||||
|
<glyph unicode="‐" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||||
|
<glyph unicode="‑" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||||
|
<glyph unicode="‒" horiz-adv-x="629" d="M82 502l18 90h457l-16 -90h-459z" />
|
||||||
|
<glyph unicode="–" horiz-adv-x="983" d="M66 502l18 90h807l-17 -90h-808z" />
|
||||||
|
<glyph unicode="—" horiz-adv-x="1966" d="M68 502l18 90h1788l-16 -90h-1790z" />
|
||||||
|
<glyph unicode="‘" horiz-adv-x="299" d="M129 983q41 100 116 231t161 248h73q-66 -106 -129.5 -242.5t-103.5 -258.5h-113z" />
|
||||||
|
<glyph unicode="’" horiz-adv-x="299" d="M129 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74z" />
|
||||||
|
<glyph unicode="“" horiz-adv-x="631" d="M129 983q41 100 116 231t161 248h73q-66 -106 -129.5 -242.5t-103.5 -258.5h-113zM463 983q43 104 120 238.5t156 240.5h74q-66 -106 -129.5 -242.5t-103.5 -258.5h-113z" />
|
||||||
|
<glyph unicode="”" horiz-adv-x="631" d="M129 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74zM463 961q66 106 129.5 242.5t103.5 258.5h113l4 -22q-43 -105 -117.5 -235.5t-158.5 -243.5h-74z" />
|
||||||
|
<glyph unicode="•" horiz-adv-x="793" d="M248 682q0 137 63 213t172 76q76 0 116 -39.5t40 -118.5q0 -125 -66 -207t-176 -82q-149 0 -149 158z" />
|
||||||
|
<glyph unicode="…" horiz-adv-x="1489" d="M69 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73zM569 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73zM1071 55q0 56 25 88.5t69 32.5q66 0 66 -72q0 -53 -25 -87.5t-67 -34.5q-68 0 -68 73z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode="€" d="M80 541l16 82h172q5 101 35 217h-170l19 82h174q95 273 270 417t399 144q166 0 287 -90l-53 -82q-102 78 -238 78q-186 0 -330.5 -120.5t-226.5 -346.5h457l-21 -82h-460q-30 -98 -39 -217h442l-20 -82h-424q0 -243 89 -356t265 -113q115 0 252 57v-94q-129 -55 -270 -55 q-209 0 -325 139.5t-116 394.5v27h-184z" />
|
||||||
|
<glyph unicode="™" horiz-adv-x="1534" d="M174 1384v78h522v-78h-219v-643h-86v643h-217zM772 741v721h125l221 -606l223 606h125v-721h-86v398l4 207h-6l-227 -605h-74l-221 609h-6l4 -201v-408h-82z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1085" d="M0 1085h1085v-1085h-1085v1085z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
||||||
|
After Width: | Height: | Size: 27 KiB |
|
|
@ -0,0 +1,146 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>
|
||||||
|
This is a custom SVG webfont generated by Font Squirrel.
|
||||||
|
Copyright : Digitized data copyright 20102011 Google Corporation
|
||||||
|
Foundry : Ascender Corporation
|
||||||
|
Foundry URL : httpwwwascendercorpcom
|
||||||
|
</metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="OpenSansRegular" horiz-adv-x="1171" >
|
||||||
|
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||||
|
<missing-glyph horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="	" horiz-adv-x="532" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="532" />
|
||||||
|
<glyph unicode="!" horiz-adv-x="547" d="M152 106q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5zM170 1462h207l-51 -1059h-105z" />
|
||||||
|
<glyph unicode=""" horiz-adv-x="821" d="M133 1462h186l-40 -528h-105zM502 1462h186l-41 -528h-104z" />
|
||||||
|
<glyph unicode="#" horiz-adv-x="1323" d="M51 430v129h287l68 340h-277v127h299l82 436h139l-82 -436h305l84 436h134l-84 -436h264v-127h-289l-66 -340h283v-129h-307l-84 -430h-137l84 430h-303l-82 -430h-136l80 430h-262zM475 559h303l66 340h-303z" />
|
||||||
|
<glyph unicode="$" d="M131 170v156q83 -37 191.5 -60.5t197.5 -23.5v440q-205 65 -287.5 151t-82.5 222q0 131 101.5 215t268.5 102v182h129v-180q184 -5 355 -74l-52 -131q-149 59 -303 70v-434q157 -50 235 -97.5t115 -109t37 -149.5q0 -136 -102 -224.5t-285 -111.5v-232h-129v223 q-112 0 -217 17.5t-172 48.5zM319 1057q0 -76 45 -122t156 -87v387q-99 -16 -150 -62.5t-51 -115.5zM649 252q217 30 217 184q0 72 -44.5 116.5t-172.5 88.5v-389z" />
|
||||||
|
<glyph unicode="%" horiz-adv-x="1686" d="M104 1026q0 227 74.5 342t220.5 115q145 0 223 -119t78 -338q0 -228 -76.5 -344.5t-224.5 -116.5q-140 0 -217.5 119t-77.5 342zM242 1026q0 -170 37 -255t120 -85q164 0 164 340q0 338 -164 338q-83 0 -120 -84t-37 -254zM365 0l811 1462h147l-811 -1462h-147zM985 440 q0 227 74.5 342t220.5 115q142 0 221.5 -117.5t79.5 -339.5q0 -227 -76.5 -343.5t-224.5 -116.5q-142 0 -218.5 119t-76.5 341zM1122 440q0 -171 37 -255.5t121 -84.5t124 83.5t40 256.5q0 171 -40 253.5t-124 82.5t-121 -82.5t-37 -253.5z" />
|
||||||
|
<glyph unicode="&" horiz-adv-x="1495" d="M113 379q0 130 69.5 230t249.5 202q-85 95 -115.5 144t-48.5 102t-18 110q0 150 98 234t273 84q162 0 255 -83.5t93 -232.5q0 -107 -68 -197.5t-225 -183.5l407 -391q56 62 89.5 145.5t56.5 182.5h168q-68 -286 -205 -434l299 -291h-229l-185 178q-118 -106 -240 -152 t-272 -46q-215 0 -333.5 106t-118.5 293zM285 383q0 -117 77.5 -185.5t206.5 -68.5q241 0 400 154l-437 424q-111 -68 -157 -112.5t-68 -95.5t-22 -116zM414 1171q0 -69 36 -131.5t123 -150.5q129 75 179.5 138.5t50.5 146.5q0 77 -51.5 125.5t-137.5 48.5q-89 0 -144.5 -48 t-55.5 -129z" />
|
||||||
|
<glyph unicode="'" horiz-adv-x="453" d="M133 1462h186l-40 -528h-105z" />
|
||||||
|
<glyph unicode="(" horiz-adv-x="606" d="M82 561q0 265 77.5 496t223.5 405h162q-144 -193 -216.5 -424t-72.5 -475q0 -240 74 -469t213 -418h-160q-147 170 -224 397t-77 488z" />
|
||||||
|
<glyph unicode=")" horiz-adv-x="606" d="M61 1462h162q147 -175 224 -406.5t77 -494.5t-77.5 -490t-223.5 -395h-160q139 188 213 417.5t74 469.5q0 244 -72.5 475t-216.5 424z" />
|
||||||
|
<glyph unicode="*" horiz-adv-x="1130" d="M86 1090l29 182l391 -111l-43 395h194l-43 -395l398 111l26 -182l-381 -31l248 -326l-172 -94l-176 362l-160 -362l-176 94l242 326z" />
|
||||||
|
<glyph unicode="+" d="M104 653v138h410v428h139v-428h412v-138h-412v-426h-139v426h-410z" />
|
||||||
|
<glyph unicode="," horiz-adv-x="502" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125z" />
|
||||||
|
<glyph unicode="-" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||||
|
<glyph unicode="." horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
|
||||||
|
<glyph unicode="/" horiz-adv-x="752" d="M20 0l545 1462h166l-545 -1462h-166z" />
|
||||||
|
<glyph unicode="0" d="M102 733q0 382 119 567t363 185q238 0 361.5 -193t123.5 -559q0 -379 -119.5 -566t-365.5 -187q-236 0 -359 191.5t-123 561.5zM270 733q0 -319 75 -464.5t239 -145.5q166 0 240.5 147.5t74.5 462.5t-74.5 461.5t-240.5 146.5q-164 0 -239 -144.5t-75 -463.5z" />
|
||||||
|
<glyph unicode="1" d="M188 1163l387 299h140v-1462h-162v1042q0 130 8 246q-21 -21 -47 -44t-238 -195z" />
|
||||||
|
<glyph unicode="2" d="M100 0v143l385 387q176 178 232 254t84 148t28 155q0 117 -71 185.5t-197 68.5q-91 0 -172.5 -30t-181.5 -109l-88 113q202 168 440 168q206 0 323 -105.5t117 -283.5q0 -139 -78 -275t-292 -344l-320 -313v-8h752v-154h-961z" />
|
||||||
|
<glyph unicode="3" d="M94 59v158q95 -47 202.5 -71.5t203.5 -24.5q379 0 379 297q0 266 -418 266h-144v143h146q171 0 271 75.5t100 209.5q0 107 -73.5 168t-199.5 61q-96 0 -181 -26t-194 -96l-84 112q90 71 207.5 111.5t247.5 40.5q213 0 331 -97.5t118 -267.5q0 -140 -78.5 -229 t-222.5 -119v-8q176 -22 261 -112t85 -236q0 -209 -145 -321.5t-412 -112.5q-116 0 -212.5 17.5t-187.5 61.5z" />
|
||||||
|
<glyph unicode="4" d="M43 336v145l694 989h176v-983h217v-151h-217v-336h-159v336h-711zM209 487h545v486q0 143 10 323h-8q-48 -96 -90 -159z" />
|
||||||
|
<glyph unicode="5" d="M133 59v160q70 -45 174 -70.5t205 -25.5q176 0 273.5 83t97.5 240q0 306 -375 306q-95 0 -254 -29l-86 55l55 684h727v-153h-585l-37 -439q115 23 229 23q231 0 363.5 -114.5t132.5 -313.5q0 -227 -144.5 -356t-398.5 -129q-247 0 -377 79z" />
|
||||||
|
<glyph unicode="6" d="M117 625q0 431 167.5 644.5t495.5 213.5q113 0 178 -19v-143q-77 25 -176 25q-235 0 -359 -146.5t-136 -460.5h12q110 172 348 172q197 0 310.5 -119t113.5 -323q0 -228 -124.5 -358.5t-336.5 -130.5q-227 0 -360 170.5t-133 474.5zM287 506q0 -103 40 -192t113.5 -141 t167.5 -52q142 0 220.5 89.5t78.5 258.5q0 145 -73 228t-218 83q-90 0 -165 -37t-119.5 -102t-44.5 -135z" />
|
||||||
|
<glyph unicode="7" d="M94 1309v153h973v-133l-598 -1329h-184l606 1309h-797z" />
|
||||||
|
<glyph unicode="8" d="M104 373q0 251 306 391q-138 78 -198 168.5t-60 202.5q0 159 117.5 253.5t314.5 94.5q200 0 317 -93t117 -257q0 -108 -67 -197t-214 -162q178 -85 253 -178.5t75 -216.5q0 -182 -127 -290.5t-348 -108.5q-234 0 -360 102.5t-126 290.5zM268 369q0 -120 83.5 -187 t234.5 -67q149 0 232 70t83 192q0 97 -78 172.5t-272 146.5q-149 -64 -216 -141.5t-67 -185.5zM315 1128q0 -92 59 -158t218 -132q143 60 202.5 129t59.5 161q0 101 -72.5 160.5t-199.5 59.5q-125 0 -196 -60t-71 -160z" />
|
||||||
|
<glyph unicode="9" d="M106 991q0 228 127.5 360t335.5 132q149 0 260.5 -76.5t171.5 -223t60 -345.5q0 -858 -664 -858q-116 0 -184 20v143q80 -26 182 -26q240 0 362.5 148.5t133.5 455.5h-12q-55 -83 -146 -126.5t-205 -43.5q-194 0 -308 116t-114 324zM270 993q0 -144 72 -226.5t219 -82.5 q91 0 167.5 37t120.5 101t44 134q0 105 -41 194t-114.5 140t-168.5 51q-143 0 -221 -92t-78 -256z" />
|
||||||
|
<glyph unicode=":" horiz-adv-x="545" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM152 989q0 135 118 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
|
||||||
|
<glyph unicode=";" horiz-adv-x="545" d="M63 -264q27 104 59.5 257t45.5 245h182l15 -23q-26 -100 -75 -232.5t-102 -246.5h-125zM147 989q0 135 119 135q123 0 123 -135q0 -65 -33 -100t-90 -35q-58 0 -88.5 35t-30.5 100z" />
|
||||||
|
<glyph unicode="<" d="M104 664v98l961 479v-149l-782 -371l782 -328v-151z" />
|
||||||
|
<glyph unicode="=" d="M119 449v137h930v-137h-930zM119 858v137h930v-137h-930z" />
|
||||||
|
<glyph unicode=">" d="M104 242v151l783 326l-783 373v149l961 -479v-98z" />
|
||||||
|
<glyph unicode="?" horiz-adv-x="879" d="M27 1384q189 99 395 99q191 0 297 -94t106 -265q0 -73 -19.5 -128.5t-57.5 -105t-164 -159.5q-101 -86 -133.5 -143t-32.5 -152v-33h-129v54q0 117 36 192.5t134 159.5q136 115 171.5 173t35.5 140q0 102 -65.5 157.5t-188.5 55.5q-79 0 -154 -18.5t-172 -67.5zM240 106 q0 136 120 136q58 0 89.5 -35t31.5 -101q0 -64 -32 -99.5t-89 -35.5q-52 0 -86 31.5t-34 103.5z" />
|
||||||
|
<glyph unicode="@" horiz-adv-x="1841" d="M121 571q0 260 107 463t305 314.5t454 111.5q215 0 382.5 -90.5t259 -257t91.5 -383.5q0 -142 -44 -260t-124 -183t-184 -65q-86 0 -145 52t-70 133h-8q-40 -87 -114.5 -136t-176.5 -49q-150 0 -234.5 102.5t-84.5 278.5q0 204 118 331.5t310 127.5q68 0 154 -12.5 t155 -34.5l-25 -470v-22q0 -178 133 -178q91 0 148 107.5t57 279.5q0 181 -74 317t-210.5 209.5t-313.5 73.5q-223 0 -388 -92.5t-252 -264t-87 -396.5q0 -305 161 -469t464 -164q210 0 436 86v-133q-192 -84 -436 -84q-363 0 -563.5 199.5t-200.5 557.5zM686 598 q0 -254 195 -254q207 0 225 313l14 261q-72 20 -157 20q-130 0 -203.5 -90t-73.5 -250z" />
|
||||||
|
<glyph unicode="A" horiz-adv-x="1296" d="M0 0l578 1468h143l575 -1468h-176l-182 465h-586l-180 -465h-172zM412 618h473l-170 453q-33 86 -68 211q-22 -96 -63 -211z" />
|
||||||
|
<glyph unicode="B" horiz-adv-x="1327" d="M201 0v1462h413q291 0 421 -87t130 -275q0 -130 -72.5 -214.5t-211.5 -109.5v-10q333 -57 333 -350q0 -196 -132.5 -306t-370.5 -110h-510zM371 145h305q177 0 266.5 68.5t89.5 214.5q0 136 -91.5 200t-278.5 64h-291v-547zM371 836h280q180 0 259 56.5t79 190.5 q0 123 -88 177.5t-280 54.5h-250v-479z" />
|
||||||
|
<glyph unicode="C" horiz-adv-x="1292" d="M125 733q0 226 84.5 396t244 262t375.5 92q230 0 402 -84l-72 -146q-166 78 -332 78q-241 0 -380.5 -160.5t-139.5 -439.5q0 -287 134.5 -443.5t383.5 -156.5q153 0 349 55v-149q-152 -57 -375 -57q-323 0 -498.5 196t-175.5 557z" />
|
||||||
|
<glyph unicode="D" horiz-adv-x="1493" d="M201 0v1462h448q341 0 530 -189t189 -528q0 -362 -196.5 -553.5t-565.5 -191.5h-405zM371 147h207q304 0 457 149.5t153 442.5q0 286 -143.5 431t-426.5 145h-247v-1168z" />
|
||||||
|
<glyph unicode="E" horiz-adv-x="1139" d="M201 0v1462h815v-151h-645v-471h606v-150h-606v-538h645v-152h-815z" />
|
||||||
|
<glyph unicode="F" horiz-adv-x="1057" d="M201 0v1462h815v-151h-645v-535h606v-151h-606v-625h-170z" />
|
||||||
|
<glyph unicode="G" horiz-adv-x="1491" d="M125 731q0 228 91.5 399.5t263.5 262t403 90.5q234 0 436 -86l-66 -150q-198 84 -381 84q-267 0 -417 -159t-150 -441q0 -296 144.5 -449t424.5 -153q152 0 297 35v450h-327v152h497v-711q-116 -37 -236 -56t-278 -19q-332 0 -517 197.5t-185 553.5z" />
|
||||||
|
<glyph unicode="H" horiz-adv-x="1511" d="M201 0v1462h170v-622h770v622h170v-1462h-170v688h-770v-688h-170z" />
|
||||||
|
<glyph unicode="I" horiz-adv-x="571" d="M201 0v1462h170v-1462h-170z" />
|
||||||
|
<glyph unicode="J" horiz-adv-x="547" d="M-160 -213q71 -20 148 -20q99 0 150.5 60t51.5 173v1462h170v-1448q0 -190 -96 -294.5t-276 -104.5q-94 0 -148 27v145z" />
|
||||||
|
<glyph unicode="K" horiz-adv-x="1257" d="M201 0v1462h170v-725l663 725h201l-588 -635l610 -827h-200l-533 709l-153 -136v-573h-170z" />
|
||||||
|
<glyph unicode="L" horiz-adv-x="1063" d="M201 0v1462h170v-1308h645v-154h-815z" />
|
||||||
|
<glyph unicode="M" horiz-adv-x="1849" d="M201 0v1462h256l463 -1206h8l467 1206h254v-1462h-170v942q0 162 14 352h-8l-500 -1294h-137l-496 1296h-8q14 -154 14 -366v-930h-157z" />
|
||||||
|
<glyph unicode="N" horiz-adv-x="1544" d="M201 0v1462h192l797 -1222h8q-2 28 -9 174q-5 114 -5 177v32v839h159v-1462h-194l-799 1227h-8q16 -216 16 -396v-831h-157z" />
|
||||||
|
<glyph unicode="O" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -351 -177.5 -552t-493.5 -201q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5q-243 0 -369.5 -153.5 t-126.5 -446.5z" />
|
||||||
|
<glyph unicode="P" horiz-adv-x="1233" d="M201 0v1462h379q548 0 548 -426q0 -222 -151.5 -341.5t-433.5 -119.5h-172v-575h-170zM371 721h153q226 0 327 73t101 234q0 145 -95 216t-296 71h-190v-594z" />
|
||||||
|
<glyph unicode="Q" horiz-adv-x="1595" d="M125 735q0 357 176 553.5t500 196.5q315 0 492 -200t177 -552q0 -281 -113 -467t-319 -252l348 -362h-247l-285 330l-55 -2q-323 0 -498.5 197.5t-175.5 557.5zM305 733q0 -297 126.5 -450.5t367.5 -153.5q243 0 367 153t124 451q0 295 -123.5 447.5t-365.5 152.5 q-243 0 -369.5 -153.5t-126.5 -446.5z" />
|
||||||
|
<glyph unicode="R" horiz-adv-x="1266" d="M201 0v1462h401q269 0 397.5 -103t128.5 -310q0 -290 -294 -392l397 -657h-201l-354 608h-305v-608h-170zM371 754h233q180 0 264 71.5t84 214.5q0 145 -85.5 209t-274.5 64h-221v-559z" />
|
||||||
|
<glyph unicode="S" horiz-adv-x="1124" d="M106 47v164q90 -38 196 -60t210 -22q170 0 256 64.5t86 179.5q0 76 -30.5 124.5t-102 89.5t-217.5 93q-204 73 -291.5 173t-87.5 261q0 169 127 269t336 100q218 0 401 -80l-53 -148q-181 76 -352 76q-135 0 -211 -58t-76 -161q0 -76 28 -124.5t94.5 -89t203.5 -89.5 q230 -82 316.5 -176t86.5 -244q0 -193 -140 -301t-380 -108q-260 0 -400 67z" />
|
||||||
|
<glyph unicode="T" horiz-adv-x="1133" d="M18 1311v151h1096v-151h-463v-1311h-170v1311h-463z" />
|
||||||
|
<glyph unicode="U" horiz-adv-x="1491" d="M186 520v942h170v-954q0 -183 100 -281t294 -98q185 0 285 98.5t100 282.5v952h170v-946q0 -250 -151 -393t-415 -143t-408.5 144t-144.5 396z" />
|
||||||
|
<glyph unicode="V" horiz-adv-x="1219" d="M0 1462h180l336 -946q58 -163 92 -317q36 162 94 323l334 940h183l-527 -1462h-168z" />
|
||||||
|
<glyph unicode="W" horiz-adv-x="1896" d="M27 1462h180l231 -903q48 -190 70 -344q27 183 80 358l262 889h180l275 -897q48 -155 81 -350q19 142 72 346l230 901h180l-391 -1462h-168l-295 979q-21 65 -47 164t-27 119q-22 -132 -70 -289l-286 -973h-168z" />
|
||||||
|
<glyph unicode="X" horiz-adv-x="1182" d="M8 0l486 764l-453 698h188l363 -579l366 579h181l-453 -692l488 -770h-193l-393 643l-400 -643h-180z" />
|
||||||
|
<glyph unicode="Y" horiz-adv-x="1147" d="M0 1462h186l387 -731l390 731h184l-488 -895v-567h-172v559z" />
|
||||||
|
<glyph unicode="Z" horiz-adv-x="1169" d="M82 0v133l776 1176h-752v153h959v-133l-776 -1175h798v-154h-1005z" />
|
||||||
|
<glyph unicode="[" horiz-adv-x="674" d="M166 -324v1786h457v-141h-289v-1503h289v-142h-457z" />
|
||||||
|
<glyph unicode="\" horiz-adv-x="752" d="M23 1462h163l547 -1462h-166z" />
|
||||||
|
<glyph unicode="]" horiz-adv-x="674" d="M51 -182h289v1503h-289v141h457v-1786h-457v142z" />
|
||||||
|
<glyph unicode="^" horiz-adv-x="1110" d="M49 551l434 922h99l477 -922h-152l-372 745l-334 -745h-152z" />
|
||||||
|
<glyph unicode="_" horiz-adv-x="918" d="M-4 -184h926v-131h-926v131z" />
|
||||||
|
<glyph unicode="`" horiz-adv-x="1182" d="M393 1548v21h203q32 -69 89 -159.5t101 -143.5v-25h-110q-65 52 -154 148t-129 159z" />
|
||||||
|
<glyph unicode="a" horiz-adv-x="1139" d="M94 303q0 332 531 348l186 6v68q0 129 -55.5 190.5t-177.5 61.5q-137 0 -310 -84l-51 127q81 44 177.5 69t193.5 25q196 0 290.5 -87t94.5 -279v-748h-123l-33 156h-8q-82 -103 -163.5 -139.5t-203.5 -36.5q-163 0 -255.5 84t-92.5 239zM268 301q0 -90 54.5 -137 t152.5 -47q155 0 243.5 85t88.5 238v99l-166 -7q-198 -7 -285.5 -61.5t-87.5 -169.5z" />
|
||||||
|
<glyph unicode="b" horiz-adv-x="1255" d="M176 0v1556h166v-378q0 -127 -8 -228h8q116 164 344 164q216 0 335.5 -147.5t119.5 -417.5t-120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12l-35 -141h-119zM342 549q0 -231 77 -330.5t247 -99.5q153 0 228 111.5t75 320.5q0 214 -75 319t-232 105 q-170 0 -245 -97.5t-75 -328.5z" />
|
||||||
|
<glyph unicode="c" horiz-adv-x="975" d="M115 541q0 275 132.5 425t377.5 150q79 0 158 -17t124 -40l-51 -141q-55 22 -120 36.5t-115 14.5q-334 0 -334 -426q0 -202 81.5 -310t241.5 -108q137 0 281 59v-147q-110 -57 -277 -57q-238 0 -368.5 146.5t-130.5 414.5z" />
|
||||||
|
<glyph unicode="d" horiz-adv-x="1255" d="M115 545q0 271 120 421t334 150q223 0 342 -162h13l-7 79l-4 77v446h166v-1556h-135l-22 147h-9q-115 -167 -344 -167q-215 0 -334.5 147t-119.5 418zM287 543q0 -210 77 -317t226 -107q170 0 246.5 92.5t76.5 298.5v35q0 233 -77.5 332.5t-247.5 99.5 q-146 0 -223.5 -113.5t-77.5 -320.5z" />
|
||||||
|
<glyph unicode="e" horiz-adv-x="1149" d="M115 539q0 265 130.5 421t350.5 156q206 0 326 -135.5t120 -357.5v-105h-755q5 -193 97.5 -293t260.5 -100q177 0 350 74v-148q-88 -38 -166.5 -54.5t-189.5 -16.5q-243 0 -383.5 148t-140.5 411zM291 653h573q0 157 -70 240.5t-200 83.5q-132 0 -210.5 -86t-92.5 -238z " />
|
||||||
|
<glyph unicode="f" horiz-adv-x="694" d="M29 967v75l196 60v61q0 404 353 404q87 0 204 -35l-43 -133q-96 31 -164 31q-94 0 -139 -62.5t-45 -200.5v-71h279v-129h-279v-967h-166v967h-196z" />
|
||||||
|
<glyph unicode="g" horiz-adv-x="1122" d="M39 -186q0 100 64 173t180 99q-42 19 -70.5 59t-28.5 93q0 60 32 105t101 87q-85 35 -138.5 119t-53.5 192q0 180 108 277.5t306 97.5q86 0 155 -20h379v-105l-203 -24q28 -35 50 -91.5t22 -127.5q0 -161 -110 -257t-302 -96q-49 0 -92 8q-106 -56 -106 -141 q0 -45 37 -66.5t127 -21.5h194q178 0 273.5 -75t95.5 -218q0 -182 -146 -277.5t-426 -95.5q-215 0 -331.5 80t-116.5 226zM199 -184q0 -89 75 -135t215 -46q209 0 309.5 62.5t100.5 169.5q0 89 -55 123.5t-207 34.5h-199q-113 0 -176 -54t-63 -155zM289 745q0 -115 65 -174 t181 -59q243 0 243 236q0 247 -246 247q-117 0 -180 -63t-63 -187z" />
|
||||||
|
<glyph unicode="h" horiz-adv-x="1257" d="M176 0v1556h166v-471q0 -85 -8 -141h10q49 79 139.5 124.5t206.5 45.5q201 0 301.5 -95.5t100.5 -303.5v-715h-166v709q0 134 -61 200t-191 66q-173 0 -252.5 -94t-79.5 -308v-573h-166z" />
|
||||||
|
<glyph unicode="i" horiz-adv-x="518" d="M162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5zM176 0v1096h166v-1096h-166z" />
|
||||||
|
<glyph unicode="j" horiz-adv-x="518" d="M-111 -332q69 -20 136 -20q78 0 114.5 42.5t36.5 129.5v1276h166v-1264q0 -324 -299 -324q-95 0 -154 25v135zM162 1393q0 57 28 83.5t70 26.5q40 0 69 -27t29 -83t-29 -83.5t-69 -27.5q-42 0 -70 27.5t-28 83.5z" />
|
||||||
|
<glyph unicode="k" horiz-adv-x="1075" d="M176 0v1556h164v-825q0 -55 -8 -170h8q43 61 131 160l354 375h197l-444 -467l475 -629h-201l-387 518l-125 -108v-410h-164z" />
|
||||||
|
<glyph unicode="l" horiz-adv-x="518" d="M176 0v1556h166v-1556h-166z" />
|
||||||
|
<glyph unicode="m" horiz-adv-x="1905" d="M176 0v1096h135l27 -150h8q47 80 132.5 125t191.5 45q257 0 336 -186h8q49 86 142 136t212 50q186 0 278.5 -95.5t92.5 -305.5v-715h-166v713q0 131 -56 196.5t-174 65.5q-155 0 -229 -89t-74 -274v-612h-166v713q0 131 -56 196.5t-175 65.5q-156 0 -228.5 -93.5 t-72.5 -306.5v-575h-166z" />
|
||||||
|
<glyph unicode="n" horiz-adv-x="1257" d="M176 0v1096h135l27 -150h8q51 81 143 125.5t205 44.5q198 0 298 -95.5t100 -305.5v-715h-166v709q0 134 -61 200t-191 66q-172 0 -252 -93t-80 -307v-575h-166z" />
|
||||||
|
<glyph unicode="o" horiz-adv-x="1237" d="M115 549q0 268 134 417.5t372 149.5q230 0 365.5 -153t135.5 -414q0 -268 -135 -418.5t-373 -150.5q-147 0 -261 69t-176 198t-62 302zM287 549q0 -210 84 -320t247 -110t247.5 109.5t84.5 320.5q0 209 -84.5 317.5t-249.5 108.5q-163 0 -246 -107t-83 -319z" />
|
||||||
|
<glyph unicode="p" horiz-adv-x="1255" d="M176 -492v1588h135l23 -150h8q64 90 149 130t195 40q218 0 336.5 -149t118.5 -418q0 -270 -120.5 -419.5t-334.5 -149.5q-107 0 -195.5 39.5t-148.5 121.5h-12q12 -96 12 -182v-451h-166zM342 549q0 -231 77 -330.5t247 -99.5q142 0 222.5 115t80.5 317 q0 205 -80.5 314.5t-226.5 109.5q-168 0 -243 -93t-77 -296v-37z" />
|
||||||
|
<glyph unicode="q" horiz-adv-x="1255" d="M115 545q0 269 120 420t334 151q225 0 346 -170h9l24 150h131v-1588h-166v469q0 100 11 170h-13q-115 -167 -346 -167q-212 0 -331 149t-119 416zM287 543q0 -207 76.5 -315.5t226.5 -108.5q166 0 242 89t81 300v37q0 230 -78 331t-247 101q-146 0 -223.5 -113.5 t-77.5 -320.5z" />
|
||||||
|
<glyph unicode="r" horiz-adv-x="836" d="M176 0v1096h137l19 -203h8q61 107 147 165t189 58q73 0 131 -12l-23 -154q-68 15 -120 15q-133 0 -227.5 -108t-94.5 -269v-588h-166z" />
|
||||||
|
<glyph unicode="s" horiz-adv-x="977" d="M106 827q0 134 109 211.5t299 77.5q177 0 346 -72l-59 -135q-165 68 -299 68q-118 0 -178 -37t-60 -102q0 -44 22.5 -75t72.5 -59t192 -81q195 -71 263.5 -143t68.5 -181q0 -153 -114 -236t-320 -83q-218 0 -340 69v154q79 -40 169.5 -63t174.5 -23q130 0 200 41.5 t70 126.5q0 64 -55.5 109.5t-216.5 107.5q-153 57 -217.5 99.5t-96 96.5t-31.5 129z" />
|
||||||
|
<glyph unicode="t" horiz-adv-x="723" d="M31 967v80l157 69l70 234h96v-254h318v-129h-318v-645q0 -99 47 -152t129 -53q44 0 85 6.5t65 13.5v-127q-27 -13 -79.5 -21.5t-94.5 -8.5q-318 0 -318 335v652h-157z" />
|
||||||
|
<glyph unicode="u" horiz-adv-x="1257" d="M164 379v717h168v-711q0 -134 61 -200t191 -66q172 0 251.5 94t79.5 307v576h166v-1096h-137l-24 147h-9q-51 -81 -141.5 -124t-206.5 -43q-200 0 -299.5 95t-99.5 304z" />
|
||||||
|
<glyph unicode="v" horiz-adv-x="1026" d="M0 1096h178l236 -650q80 -228 94 -296h8q11 53 69.5 219.5t262.5 726.5h178l-416 -1096h-194z" />
|
||||||
|
<glyph unicode="w" horiz-adv-x="1593" d="M23 1096h174q106 -413 161.5 -629t63.5 -291h8q11 57 35.5 147.5t42.5 143.5l201 629h180l196 -629q56 -172 76 -289h8q4 36 21.5 111t208.5 807h172l-303 -1096h-197l-201 643q-19 59 -71 268h-8q-40 -175 -70 -270l-207 -641h-192z" />
|
||||||
|
<glyph unicode="x" horiz-adv-x="1073" d="M39 0l401 561l-381 535h189l289 -420l288 420h187l-381 -535l401 -561h-188l-307 444l-310 -444h-188z" />
|
||||||
|
<glyph unicode="y" horiz-adv-x="1032" d="M2 1096h178l240 -625q79 -214 98 -309h8q13 51 54.5 174.5t271.5 759.5h178l-471 -1248q-70 -185 -163.5 -262.5t-229.5 -77.5q-76 0 -150 17v133q55 -12 123 -12q171 0 244 192l61 156z" />
|
||||||
|
<glyph unicode="z" horiz-adv-x="958" d="M82 0v113l598 854h-561v129h743v-129l-590 -838h605v-129h-795z" />
|
||||||
|
<glyph unicode="{" horiz-adv-x="776" d="M61 498v141q130 2 188 48t58 142v306q0 155 108 241t290 86v-139q-230 -6 -230 -199v-295q0 -215 -223 -254v-12q223 -39 223 -254v-297q0 -102 58.5 -148t171.5 -48v-140q-190 2 -294 87t-104 239v303q0 104 -63 148.5t-183 44.5z" />
|
||||||
|
<glyph unicode="|" horiz-adv-x="1128" d="M494 -496v2052h141v-2052h-141z" />
|
||||||
|
<glyph unicode="}" horiz-adv-x="776" d="M72 -184q111 2 169 48t58 148v297q0 114 55 174t168 80v12q-223 39 -223 254v295q0 193 -227 199v139q184 0 289.5 -87t105.5 -240v-306q0 -97 59 -142.5t189 -47.5v-141q-122 0 -185 -44.5t-63 -148.5v-303q0 -153 -102.5 -238.5t-292.5 -87.5v140z" />
|
||||||
|
<glyph unicode="~" d="M104 592v151q100 109 244 109q68 0 124.5 -14t145.5 -52q66 -28 115 -41.5t96 -13.5q54 0 118 32t118 89v-150q-102 -110 -244 -110q-72 0 -135 16.5t-135 48.5q-75 32 -120 44t-93 12q-53 0 -116.5 -33.5t-117.5 -87.5z" />
|
||||||
|
<glyph unicode="¢" d="M190 741q0 508 396 570v172h135v-164q75 -3 146 -19.5t120 -39.5l-49 -140q-133 51 -242 51q-172 0 -253 -105.5t-81 -322.5q0 -212 79.5 -313.5t246.5 -101.5q141 0 283 59v-147q-105 -54 -252 -60v-200h-133v206q-203 32 -299.5 168.5t-96.5 386.5z" />
|
||||||
|
<glyph unicode="£" d="M63 0v141q205 47 205 291v223h-198v127h198v316q0 178 112 280.5t302 102.5t360 -84l-61 -133q-154 77 -297 77q-123 0 -185.5 -62t-62.5 -202v-295h422v-127h-422v-221q0 -100 -32.5 -168t-106.5 -112h795v-154h-1029z" />
|
||||||
|
<glyph unicode="¥" d="M31 1462h178l375 -727l379 727h174l-416 -770h262v-127h-317v-170h317v-127h-317v-268h-164v268h-316v127h316v170h-316v127h256z" />
|
||||||
|
<glyph unicode="©" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323 t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM481 731q0 209 110.5 332t301.5 123q128 0 246 -60l-58 -118q-108 51 -188 51q-125 0 -192.5 -87t-67.5 -241q0 -168 63.5 -249t194.5 -81q86 0 211 45v-124q-48 -20 -98.5 -34t-120.5 -14 q-194 0 -298 120.5t-104 336.5z" />
|
||||||
|
<glyph unicode="­" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||||
|
<glyph unicode="®" horiz-adv-x="1704" d="M100 731q0 200 100 375t275 276t377 101q200 0 375 -100t276 -275t101 -377q0 -197 -97 -370t-272 -277t-383 -104q-207 0 -382 103.5t-272.5 276.5t-97.5 371zM205 731q0 -173 87 -323.5t237.5 -237t322.5 -86.5q174 0 323 87t236.5 235.5t87.5 324.5q0 174 -87 323 t-235.5 236.5t-324.5 87.5q-174 0 -323 -87t-236.5 -235.5t-87.5 -324.5zM575 285v891h261q166 0 243.5 -65t77.5 -198q0 -80 -42.5 -141.5t-119.5 -91.5l238 -395h-168l-207 354h-135v-354h-148zM723 762h108q80 0 128.5 41.5t48.5 105.5q0 75 -43 107.5t-136 32.5h-106 v-287z" />
|
||||||
|
<glyph unicode="´" horiz-adv-x="1182" d="M393 1241v25q48 62 103.5 150t87.5 153h202v-21q-44 -65 -131 -160t-151 -147h-111z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="784" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1569" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="523" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="261" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="196" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="87" />
|
||||||
|
<glyph unicode="‐" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||||
|
<glyph unicode="‑" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||||
|
<glyph unicode="‒" horiz-adv-x="659" d="M84 473v152h491v-152h-491z" />
|
||||||
|
<glyph unicode="–" horiz-adv-x="1024" d="M82 473v152h860v-152h-860z" />
|
||||||
|
<glyph unicode="—" horiz-adv-x="2048" d="M82 473v152h1884v-152h-1884z" />
|
||||||
|
<glyph unicode="‘" horiz-adv-x="348" d="M25 983q22 90 71 224t105 255h123q-66 -254 -103 -501h-184z" />
|
||||||
|
<glyph unicode="’" horiz-adv-x="348" d="M25 961q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122z" />
|
||||||
|
<glyph unicode="“" horiz-adv-x="717" d="M25 983q22 90 71 224t105 255h123q-66 -254 -103 -501h-184zM391 983q56 215 178 479h123q-30 -115 -59.5 -259.5t-42.5 -241.5h-184z" />
|
||||||
|
<glyph unicode="”" horiz-adv-x="717" d="M25 961q70 285 102 501h182l15 -22q-26 -100 -75 -232.5t-102 -246.5h-122zM391 961q26 100 59 254t46 247h182l14 -22q-24 -91 -72 -224t-104 -255h-125z" />
|
||||||
|
<glyph unicode="•" horiz-adv-x="770" d="M164 748q0 121 56.5 184t164.5 63q105 0 163 -62t58 -185q0 -119 -57.5 -183.5t-163.5 -64.5q-107 0 -164 65.5t-57 182.5z" />
|
||||||
|
<glyph unicode="…" horiz-adv-x="1606" d="M152 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM682 106q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5zM1213 106 q0 67 30.5 101.5t87.5 34.5q58 0 90.5 -34.5t32.5 -101.5q0 -65 -33 -100t-90 -35q-51 0 -84.5 31.5t-33.5 103.5z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="313" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="392" />
|
||||||
|
<glyph unicode="€" horiz-adv-x="1208" d="M63 506v129h152l-2 42v44l2 80h-152v129h164q39 261 185 407t383 146q201 0 366 -97l-71 -139q-166 86 -295 86q-319 0 -398 -403h510v-129h-524l-2 -57v-64l2 -45h463v-129h-447q37 -180 138.5 -278.5t271.5 -98.5q156 0 309 66v-150q-146 -65 -317 -65 q-237 0 -381.5 134.5t-190.5 391.5h-166z" />
|
||||||
|
<glyph unicode="™" horiz-adv-x="1589" d="M37 1356v106h543v-106h-211v-615h-123v615h-209zM647 741v721h187l196 -559l203 559h180v-721h-127v420l6 137h-8l-211 -557h-104l-201 559h-8l6 -129v-430h-119z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1095" d="M0 1095h1095v-1095h-1095v1095z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
||||||
|
After Width: | Height: | Size: 25 KiB |