Implemented Hively Player support

CQTexperiment
Chris Moeller 2013-10-29 15:51:55 -07:00
parent 240d7ae8ff
commit d20973235b
18 changed files with 3903 additions and 0 deletions

View File

@ -141,6 +141,7 @@
8359009D17FF06570060F3ED /* ArchiveSource.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8359FF3117FEF35D0060F3ED /* ArchiveSource.bundle */; };
8360EF6D17F92E56005208A4 /* HighlyComplete.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8360EF0517F92B24005208A4 /* HighlyComplete.bundle */; };
836D28A818086386005B7299 /* MiniModeMenuTitleTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 836D28A718086386005B7299 /* MiniModeMenuTitleTransformer.m */; };
836FB5A718206F2500B3AD2D /* Hively.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 836FB5471820538800B3AD2D /* Hively.bundle */; };
8375B36517FFEF130092A79F /* Opus.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8375B05717FFEA410092A79F /* Opus.bundle */; };
83790D501809F4980073CF51 /* NSObject+SPInvocationGrabbing.m in Sources */ = {isa = PBXBuildFile; fileRef = 83790D4D1809F4980073CF51 /* NSObject+SPInvocationGrabbing.m */; };
83790D511809F4980073CF51 /* SPMediaKeyTap.m in Sources */ = {isa = PBXBuildFile; fileRef = 83790D4F1809F4980073CF51 /* SPMediaKeyTap.m */; };
@ -433,6 +434,20 @@
remoteGlobalIDString = 8360EEE417F92AC8005208A4;
remoteInfo = HighlyComplete;
};
836FB5461820538800B3AD2D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 836FB5421820538700B3AD2D /* Hively.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 836FB52D1820538700B3AD2D;
remoteInfo = Hively;
};
836FB5A518206F1500B3AD2D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 836FB5421820538700B3AD2D /* Hively.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 836FB52C1820538700B3AD2D;
remoteInfo = Hively;
};
8375B05617FFEA410092A79F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 8375B05117FFEA400092A79F /* Opus.xcodeproj */;
@ -605,6 +620,7 @@
dstPath = "";
dstSubfolderSpec = 13;
files = (
836FB5A718206F2500B3AD2D /* Hively.bundle in CopyFiles */,
83A0F4E31816DBF900119DB4 /* playptmod.bundle in CopyFiles */,
83B06704180D579E008E3612 /* MIDI.bundle in CopyFiles */,
8375B36517FFEF130092A79F /* Opus.bundle in CopyFiles */,
@ -850,6 +866,7 @@
8360EF0017F92B23005208A4 /* HighlyComplete.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = HighlyComplete.xcodeproj; path = Plugins/HighlyComplete/HighlyComplete.xcodeproj; sourceTree = "<group>"; };
836D28A618086386005B7299 /* MiniModeMenuTitleTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MiniModeMenuTitleTransformer.h; path = Window/MiniModeMenuTitleTransformer.h; sourceTree = "<group>"; };
836D28A718086386005B7299 /* MiniModeMenuTitleTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MiniModeMenuTitleTransformer.m; path = Window/MiniModeMenuTitleTransformer.m; sourceTree = "<group>"; };
836FB5421820538700B3AD2D /* Hively.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Hively.xcodeproj; path = Plugins/Hively/Hively.xcodeproj; sourceTree = "<group>"; };
8375B05117FFEA400092A79F /* Opus.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Opus.xcodeproj; path = Plugins/Opus/Opus.xcodeproj; sourceTree = "<group>"; };
83790D4C1809F4980073CF51 /* NSObject+SPInvocationGrabbing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SPInvocationGrabbing.h"; sourceTree = "<group>"; };
83790D4D1809F4980073CF51 /* NSObject+SPInvocationGrabbing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SPInvocationGrabbing.m"; sourceTree = "<group>"; };
@ -1203,6 +1220,7 @@
8375B05117FFEA400092A79F /* Opus.xcodeproj */,
83B0669C180D5668008E3612 /* MIDI.xcodeproj */,
83A0F4841816CE5E00119DB4 /* playptmod.xcodeproj */,
836FB5421820538700B3AD2D /* Hively.xcodeproj */,
);
name = PlugIns;
sourceTree = "<group>";
@ -1533,6 +1551,14 @@
name = Products;
sourceTree = "<group>";
};
836FB5431820538700B3AD2D /* Products */ = {
isa = PBXGroup;
children = (
836FB5471820538800B3AD2D /* Hively.bundle */,
);
name = Products;
sourceTree = "<group>";
};
8375B05217FFEA400092A79F /* Products */ = {
isa = PBXGroup;
children = (
@ -1728,6 +1754,7 @@
buildRules = (
);
dependencies = (
836FB5A618206F1500B3AD2D /* PBXTargetDependency */,
83A0F4E21816DBE800119DB4 /* PBXTargetDependency */,
83E6B7641816138800D4576D /* PBXTargetDependency */,
83B06703180D5776008E3612 /* PBXTargetDependency */,
@ -1833,6 +1860,10 @@
ProductGroup = 8360EF0117F92B23005208A4 /* Products */;
ProjectRef = 8360EF0017F92B23005208A4 /* HighlyComplete.xcodeproj */;
},
{
ProductGroup = 836FB5431820538700B3AD2D /* Products */;
ProjectRef = 836FB5421820538700B3AD2D /* Hively.xcodeproj */;
},
{
ProductGroup = 17C808840C3BD181005707C4 /* Products */;
ProjectRef = 17C808830C3BD181005707C4 /* HTTPSource.xcodeproj */;
@ -2013,6 +2044,13 @@
remoteRef = 8360EF0417F92B24005208A4 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
836FB5471820538800B3AD2D /* Hively.bundle */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = Hively.bundle;
remoteRef = 836FB5461820538800B3AD2D /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
8375B05717FFEA410092A79F /* Opus.bundle */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
@ -2374,6 +2412,11 @@
name = General;
targetProxy = 17F5623A0C3BD9280019975C /* PBXContainerItemProxy */;
};
836FB5A618206F1500B3AD2D /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = Hively;
targetProxy = 836FB5A518206F1500B3AD2D /* PBXContainerItemProxy */;
};
8375B36217FFEF010092A79F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = ArchiveSource;

View File

@ -0,0 +1,306 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
836FB564182053D700B3AD2D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 836FB562182053D700B3AD2D /* InfoPlist.strings */; };
836FB591182054B700B3AD2D /* hvl_replay.c in Sources */ = {isa = PBXBuildFile; fileRef = 836FB58D182054B700B3AD2D /* hvl_replay.c */; };
836FB592182054B700B3AD2D /* hvl_replay.h in Headers */ = {isa = PBXBuildFile; fileRef = 836FB58E182054B700B3AD2D /* hvl_replay.h */; settings = {ATTRIBUTES = (Public, ); }; };
836FB593182054B700B3AD2D /* blip_buf.c in Sources */ = {isa = PBXBuildFile; fileRef = 836FB58F182054B700B3AD2D /* blip_buf.c */; };
836FB594182054B700B3AD2D /* blip_buf.h in Headers */ = {isa = PBXBuildFile; fileRef = 836FB590182054B700B3AD2D /* blip_buf.h */; settings = {ATTRIBUTES = (Public, ); }; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
836FB556182053D700B3AD2D /* HivelyPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HivelyPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; };
836FB561182053D700B3AD2D /* HivelyPlayer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HivelyPlayer-Info.plist"; sourceTree = "<group>"; };
836FB563182053D700B3AD2D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
836FB58D182054B700B3AD2D /* hvl_replay.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hvl_replay.c; sourceTree = "<group>"; };
836FB58E182054B700B3AD2D /* hvl_replay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hvl_replay.h; sourceTree = "<group>"; };
836FB58F182054B700B3AD2D /* blip_buf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blip_buf.c; sourceTree = "<group>"; };
836FB590182054B700B3AD2D /* blip_buf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blip_buf.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
836FB552182053D700B3AD2D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
836FB54C182053D700B3AD2D = {
isa = PBXGroup;
children = (
836FB55F182053D700B3AD2D /* HivelyPlayer */,
836FB558182053D700B3AD2D /* Frameworks */,
836FB557182053D700B3AD2D /* Products */,
);
sourceTree = "<group>";
};
836FB557182053D700B3AD2D /* Products */ = {
isa = PBXGroup;
children = (
836FB556182053D700B3AD2D /* HivelyPlayer.framework */,
);
name = Products;
sourceTree = "<group>";
};
836FB558182053D700B3AD2D /* Frameworks */ = {
isa = PBXGroup;
children = (
836FB55B182053D700B3AD2D /* Other Frameworks */,
);
name = Frameworks;
sourceTree = "<group>";
};
836FB55B182053D700B3AD2D /* Other Frameworks */ = {
isa = PBXGroup;
children = (
);
name = "Other Frameworks";
sourceTree = "<group>";
};
836FB55F182053D700B3AD2D /* HivelyPlayer */ = {
isa = PBXGroup;
children = (
836FB58D182054B700B3AD2D /* hvl_replay.c */,
836FB58E182054B700B3AD2D /* hvl_replay.h */,
836FB58F182054B700B3AD2D /* blip_buf.c */,
836FB590182054B700B3AD2D /* blip_buf.h */,
836FB560182053D700B3AD2D /* Supporting Files */,
);
path = HivelyPlayer;
sourceTree = "<group>";
};
836FB560182053D700B3AD2D /* Supporting Files */ = {
isa = PBXGroup;
children = (
836FB561182053D700B3AD2D /* HivelyPlayer-Info.plist */,
836FB562182053D700B3AD2D /* InfoPlist.strings */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
836FB553182053D700B3AD2D /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
836FB592182054B700B3AD2D /* hvl_replay.h in Headers */,
836FB594182054B700B3AD2D /* blip_buf.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
836FB555182053D700B3AD2D /* HivelyPlayer */ = {
isa = PBXNativeTarget;
buildConfigurationList = 836FB57E182053D700B3AD2D /* Build configuration list for PBXNativeTarget "HivelyPlayer" */;
buildPhases = (
836FB551182053D700B3AD2D /* Sources */,
836FB552182053D700B3AD2D /* Frameworks */,
836FB553182053D700B3AD2D /* Headers */,
836FB554182053D700B3AD2D /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = HivelyPlayer;
productName = HivelyPlayer;
productReference = 836FB556182053D700B3AD2D /* HivelyPlayer.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
836FB54D182053D700B3AD2D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0500;
ORGANIZATIONNAME = "Christopher Snowhill";
};
buildConfigurationList = 836FB550182053D700B3AD2D /* Build configuration list for PBXProject "HivelyPlayer" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 836FB54C182053D700B3AD2D;
productRefGroup = 836FB557182053D700B3AD2D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
836FB555182053D700B3AD2D /* HivelyPlayer */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
836FB554182053D700B3AD2D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
836FB564182053D700B3AD2D /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
836FB551182053D700B3AD2D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
836FB593182054B700B3AD2D /* blip_buf.c in Sources */,
836FB591182054B700B3AD2D /* hvl_replay.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
836FB562182053D700B3AD2D /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
836FB563182053D700B3AD2D /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
836FB57C182053D700B3AD2D /* 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.7;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SKIP_INSTALL = YES;
};
name = Debug;
};
836FB57D182053D700B3AD2D /* 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.7;
SDKROOT = macosx;
SKIP_INSTALL = YES;
};
name = Release;
};
836FB57F182053D700B3AD2D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
INFOPLIST_FILE = "HivelyPlayer/HivelyPlayer-Info.plist";
INSTALL_PATH = "@loader_path/../Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = framework;
};
name = Debug;
};
836FB580182053D700B3AD2D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
INFOPLIST_FILE = "HivelyPlayer/HivelyPlayer-Info.plist";
INSTALL_PATH = "@loader_path/../Frameworks";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = framework;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
836FB550182053D700B3AD2D /* Build configuration list for PBXProject "HivelyPlayer" */ = {
isa = XCConfigurationList;
buildConfigurations = (
836FB57C182053D700B3AD2D /* Debug */,
836FB57D182053D700B3AD2D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
836FB57E182053D700B3AD2D /* Build configuration list for PBXNativeTarget "HivelyPlayer" */ = {
isa = XCConfigurationList;
buildConfigurations = (
836FB57F182053D700B3AD2D /* Debug */,
836FB580182053D700B3AD2D /* Release */,
);
defaultConfigurationIsVisible = 0;
};
/* End XCConfigurationList section */
};
rootObject = 836FB54D182053D700B3AD2D /* Project object */;
}

View File

@ -0,0 +1,30 @@
<?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>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>net.kode54.hivelyplayer</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2013 Christopher Snowhill. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,334 @@
/* blip_buf 1.1.0. http://www.slack.net/~ant/ */
#include "blip_buf.h"
#include <assert.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
/* Library Copyright (C) 2003-2009 Shay Green. This library is free software;
you can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This
library is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
details. You should have received a copy of the GNU Lesser General Public
License along with this module; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
#if defined (BLARGG_TEST) && BLARGG_TEST
#include "blargg_test.h"
#endif
/* Equivalent to ULONG_MAX >= 0xFFFFFFFF00000000.
Avoids constants that don't fit in 32 bits. */
#if ULONG_MAX/0xFFFFFFFF > 0xFFFFFFFF
typedef unsigned long fixed_t;
enum { pre_shift = 32 };
#elif defined(ULLONG_MAX)
typedef unsigned long long fixed_t;
enum { pre_shift = 32 };
#else
typedef unsigned fixed_t;
enum { pre_shift = 0 };
#endif
enum { time_bits = pre_shift + 20 };
static fixed_t const time_unit = (fixed_t) 1 << time_bits;
enum { bass_shift = 9 }; /* affects high-pass filter breakpoint frequency */
enum { end_frame_extra = 2 }; /* allows deltas slightly after frame length */
enum { half_width = 8 };
enum { buf_extra = half_width*2 + end_frame_extra };
enum { phase_bits = 5 };
enum { phase_count = 1 << phase_bits };
enum { delta_bits = 15 };
enum { delta_unit = 1 << delta_bits };
enum { frac_bits = time_bits - pre_shift };
/* We could eliminate avail and encode whole samples in offset, but that would
limit the total buffered samples to blip_max_frame. That could only be
increased by decreasing time_bits, which would reduce resample ratio accuracy.
*/
/** Sample buffer that resamples to output rate and accumulates samples
until they're read out */
struct hvl_blip_t
{
fixed_t factor;
fixed_t offset;
int avail;
int size;
fixed_t integrator;
};
typedef int buf_t;
/* probably not totally portable */
#define SAMPLES( buf ) ((buf_t*) ((buf) + 1))
/* Arithmetic (sign-preserving) right shift */
#define ARITH_SHIFT( n, shift ) \
((n) >> (shift))
enum { max_sample = +32767 };
enum { min_sample = -32768 };
#define CLAMP( n ) \
{\
if ( (short) n != n )\
n = ARITH_SHIFT( n, 16 ) ^ max_sample;\
}
static void check_assumptions( void )
{
int n;
#if INT_MAX < 0x7FFFFFFF || UINT_MAX < 0xFFFFFFFF
#error "int must be at least 32 bits"
#endif
assert( (-3 >> 1) == -2 ); /* right shift must preserve sign */
n = max_sample * 2;
CLAMP( n );
assert( n == max_sample );
n = min_sample * 2;
CLAMP( n );
assert( n == min_sample );
assert( hvl_blip_max_ratio <= time_unit );
assert( hvl_blip_max_frame <= (fixed_t) -1 >> time_bits );
}
size_t hvl_blip_size( int size )
{
assert( size >= 0 );
return sizeof (hvl_blip_t) + (size + buf_extra) * sizeof (buf_t);
}
void hvl_blip_new_inplace( hvl_blip_t* m, int size )
{
assert( size >= 0 );
if ( m )
{
m->factor = time_unit / hvl_blip_max_ratio;
m->size = size;
hvl_blip_clear( m );
check_assumptions();
}
}
void hvl_blip_set_rates( hvl_blip_t* m, double clock_rate, double sample_rate )
{
double factor = time_unit * sample_rate / clock_rate;
m->factor = (fixed_t) factor;
/* Fails if clock_rate exceeds maximum, relative to sample_rate */
assert( 0 <= factor - m->factor && factor - m->factor < 1 );
/* Avoid requiring math.h. Equivalent to
m->factor = (int) ceil( factor ) */
if ( m->factor < factor )
m->factor++;
/* At this point, factor is most likely rounded up, but could still
have been rounded down in the floating-point calculation. */
}
void hvl_blip_clear( hvl_blip_t* m )
{
/* We could set offset to 0, factor/2, or factor-1. 0 is suitable if
factor is rounded up. factor-1 is suitable if factor is rounded down.
Since we don't know rounding direction, factor/2 accommodates either,
with the slight loss of showing an error in half the time. Since for
a 64-bit factor this is years, the halving isn't a problem. */
m->offset = m->factor / 2;
m->avail = 0;
m->integrator = 0;
memset( SAMPLES( m ), 0, (m->size + buf_extra) * sizeof (buf_t) );
}
int hvl_blip_clocks_needed( const hvl_blip_t* m, int samples )
{
fixed_t needed;
/* Fails if buffer can't hold that many more samples */
assert( samples >= 0 && m->avail + samples <= m->size );
needed = (fixed_t) samples * time_unit;
if ( needed < m->offset )
return 0;
return (needed - m->offset + m->factor - 1) / m->factor;
}
void hvl_blip_end_frame( hvl_blip_t* m, unsigned t )
{
fixed_t off = t * m->factor + m->offset;
m->avail += off >> time_bits;
m->offset = off & (time_unit - 1);
/* Fails if buffer size was exceeded */
assert( m->avail <= m->size );
}
int hvl_blip_samples_avail( const hvl_blip_t* m )
{
return m->avail;
}
static void remove_samples( hvl_blip_t* m, int count )
{
buf_t* buf = SAMPLES( m );
int remain = m->avail + buf_extra - count;
m->avail -= count;
memmove( &buf [0], &buf [count], remain * sizeof buf [0] );
memset( &buf [remain], 0, count * sizeof buf [0] );
}
int hvl_blip_read_samples( hvl_blip_t* m, int out [], int count, int gain )
{
assert( count >= 0 );
if ( count > m->avail )
count = m->avail;
if ( count )
{
buf_t const* in = SAMPLES( m );
buf_t const* end = in + count;
fixed_t sum = m->integrator;
do
{
/* Eliminate fraction */
int s = ARITH_SHIFT( sum, delta_bits );
sum += *in++;
*out = s * gain;
out += 2;
/* High-pass filter */
sum -= s << (delta_bits - bass_shift);
}
while ( in != end );
m->integrator = sum;
remove_samples( m, count );
}
return count;
}
/* Things that didn't help performance on x86:
__attribute__((aligned(128)))
#define short int
restrict
*/
/* Sinc_Generator( 0.9, 0.55, 4.5 ) */
static short const bl_step [phase_count + 1] [half_width] =
{
{ 43, -115, 350, -488, 1136, -914, 5861,21022},
{ 44, -118, 348, -473, 1076, -799, 5274,21001},
{ 45, -121, 344, -454, 1011, -677, 4706,20936},
{ 46, -122, 336, -431, 942, -549, 4156,20829},
{ 47, -123, 327, -404, 868, -418, 3629,20679},
{ 47, -122, 316, -375, 792, -285, 3124,20488},
{ 47, -120, 303, -344, 714, -151, 2644,20256},
{ 46, -117, 289, -310, 634, -17, 2188,19985},
{ 46, -114, 273, -275, 553, 117, 1758,19675},
{ 44, -108, 255, -237, 471, 247, 1356,19327},
{ 43, -103, 237, -199, 390, 373, 981,18944},
{ 42, -98, 218, -160, 310, 495, 633,18527},
{ 40, -91, 198, -121, 231, 611, 314,18078},
{ 38, -84, 178, -81, 153, 722, 22,17599},
{ 36, -76, 157, -43, 80, 824, -241,17092},
{ 34, -68, 135, -3, 8, 919, -476,16558},
{ 32, -61, 115, 34, -60, 1006, -683,16001},
{ 29, -52, 94, 70, -123, 1083, -862,15422},
{ 27, -44, 73, 106, -184, 1152,-1015,14824},
{ 25, -36, 53, 139, -239, 1211,-1142,14210},
{ 22, -27, 34, 170, -290, 1261,-1244,13582},
{ 20, -20, 16, 199, -335, 1301,-1322,12942},
{ 18, -12, -3, 226, -375, 1331,-1376,12293},
{ 15, -4, -19, 250, -410, 1351,-1408,11638},
{ 13, 3, -35, 272, -439, 1361,-1419,10979},
{ 11, 9, -49, 292, -464, 1362,-1410,10319},
{ 9, 16, -63, 309, -483, 1354,-1383, 9660},
{ 7, 22, -75, 322, -496, 1337,-1339, 9005},
{ 6, 26, -85, 333, -504, 1312,-1280, 8355},
{ 4, 31, -94, 341, -507, 1278,-1205, 7713},
{ 3, 35, -102, 347, -506, 1238,-1119, 7082},
{ 1, 40, -110, 350, -499, 1190,-1021, 6464},
{ 0, 43, -115, 350, -488, 1136, -914, 5861}
};
/* Shifting by pre_shift allows calculation using unsigned int rather than
possibly-wider fixed_t. On 32-bit platforms, this is likely more efficient.
And by having pre_shift 32, a 32-bit platform can easily do the shift by
simply ignoring the low half. */
void hvl_blip_add_delta( hvl_blip_t* m, unsigned time, int delta )
{
unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift);
buf_t* out = SAMPLES( m ) + m->avail + (fixed >> frac_bits);
int const phase_shift = frac_bits - phase_bits;
int phase = fixed >> phase_shift & (phase_count - 1);
short const* in = bl_step [phase];
short const* rev = bl_step [phase_count - phase];
int interp = fixed >> (phase_shift - delta_bits) & (delta_unit - 1);
int delta2 = (delta * interp) >> delta_bits;
delta -= delta2;
/* Fails if buffer size was exceeded */
assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] );
out [0] += in[0]*delta + in[half_width+0]*delta2;
out [1] += in[1]*delta + in[half_width+1]*delta2;
out [2] += in[2]*delta + in[half_width+2]*delta2;
out [3] += in[3]*delta + in[half_width+3]*delta2;
out [4] += in[4]*delta + in[half_width+4]*delta2;
out [5] += in[5]*delta + in[half_width+5]*delta2;
out [6] += in[6]*delta + in[half_width+6]*delta2;
out [7] += in[7]*delta + in[half_width+7]*delta2;
in = rev;
out [ 8] += in[7]*delta + in[7-half_width]*delta2;
out [ 9] += in[6]*delta + in[6-half_width]*delta2;
out [10] += in[5]*delta + in[5-half_width]*delta2;
out [11] += in[4]*delta + in[4-half_width]*delta2;
out [12] += in[3]*delta + in[3-half_width]*delta2;
out [13] += in[2]*delta + in[2-half_width]*delta2;
out [14] += in[1]*delta + in[1-half_width]*delta2;
out [15] += in[0]*delta + in[0-half_width]*delta2;
}
void hvl_blip_add_delta_fast( hvl_blip_t* m, unsigned time, int delta )
{
unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift);
buf_t* out = SAMPLES( m ) + m->avail + (fixed >> frac_bits);
int interp = fixed >> (frac_bits - delta_bits) & (delta_unit - 1);
int delta2 = delta * interp;
/* Fails if buffer size was exceeded */
assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] );
out [7] += delta * delta_unit - delta2;
out [8] += delta2;
}

View File

@ -0,0 +1,69 @@
/** \file
Sample buffer that resamples from input clock rate to output sample rate */
#include <stdlib.h>
/* blip_buf 1.1.0 */
#ifndef HVL_BLIP_BUF_H
#define HVL_BLIP_BUF_H
#ifdef __cplusplus
extern "C" {
#endif
/** First parameter of most functions is blip_t*, or const blip_t* if nothing
is changed. */
typedef struct hvl_blip_t hvl_blip_t;
/** Returns the size of a blip_t object of the given sample count. */
size_t hvl_blip_size( int sample_count );
/** Creates new buffer that can hold at most sample_count samples. Sets rates
so that there are blip_max_ratio clocks per sample. */
void hvl_blip_new_inplace( hvl_blip_t*, int sample_count );
/** Sets approximate input clock rate and output sample rate. For every
clock_rate input clocks, approximately sample_rate samples are generated. */
void hvl_blip_set_rates( hvl_blip_t*, double clock_rate, double sample_rate );
enum { /** Maximum clock_rate/sample_rate ratio. For a given sample_rate,
clock_rate must not be greater than sample_rate*blip_max_ratio. */
hvl_blip_max_ratio = 1 << 20 };
/** Clears entire buffer. Afterwards, blip_samples_avail() == 0. */
void hvl_blip_clear( hvl_blip_t* );
/** Adds positive/negative delta into buffer at specified clock time. */
void hvl_blip_add_delta( hvl_blip_t*, unsigned int clock_time, int delta );
/** Same as blip_add_delta(), but uses faster, lower-quality synthesis. */
void hvl_blip_add_delta_fast( hvl_blip_t*, unsigned int clock_time, int delta );
/** Length of time frame, in clocks, needed to make sample_count additional
samples available. */
int hvl_blip_clocks_needed( const hvl_blip_t*, int sample_count );
enum { /** Maximum number of samples that can be generated from one time frame. */
hvl_blip_max_frame = 4000 };
/** Makes input clocks before clock_duration available for reading as output
samples. Also begins new time frame at clock_duration, so that clock time 0 in
the new time frame specifies the same clock as clock_duration in the old time
frame specified. Deltas can have been added slightly past clock_duration (up to
however many clocks there are in two output samples). */
void hvl_blip_end_frame( hvl_blip_t*, unsigned int clock_duration );
/** Number of buffered samples available for reading. */
int hvl_blip_samples_avail( const hvl_blip_t* );
/** Reads and removes at most 'count' samples and writes them to 'out'. If
'stereo' is true, writes output to every other element of 'out', allowing easy
interleaving of two buffers into a stereo sample stream. Outputs 16-bit signed
samples. Returns number of samples actually read. */
int hvl_blip_read_samples( hvl_blip_t*, int out [], int count, int gain );
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,239 @@
#ifdef __cplusplus
extern "C" {
#endif
#include "blip_buf.h"
#include <stdint.h>
typedef int8_t int8;
typedef uint8_t uint8;
typedef int16_t int16;
typedef uint16_t uint16;
typedef int32_t int32;
typedef uint32_t uint32;
typedef double float64;
typedef char TEXT;
typedef signed char BOOL;
#define TRUE 1
#define FALSE 0
// Woohoo!
#define MAX_CHANNELS 16
#define Period2Freq(period) (3546897.f / (period))
struct hvl_envelope
{
int16 aFrames, aVolume;
int16 dFrames, dVolume;
int16 sFrames;
int16 rFrames, rVolume;
int16 pad;
};
struct hvl_plsentry
{
uint8 ple_Note;
uint8 ple_Waveform;
int16 ple_Fixed;
int8 ple_FX[2];
int8 ple_FXParam[2];
};
struct hvl_plist
{
int16 pls_Speed;
int16 pls_Length;
struct hvl_plsentry *pls_Entries;
};
struct hvl_instrument
{
TEXT ins_Name[128];
uint8 ins_Volume;
uint8 ins_WaveLength;
uint8 ins_FilterLowerLimit;
uint8 ins_FilterUpperLimit;
uint8 ins_FilterSpeed;
uint8 ins_SquareLowerLimit;
uint8 ins_SquareUpperLimit;
uint8 ins_SquareSpeed;
uint8 ins_VibratoDelay;
uint8 ins_VibratoSpeed;
uint8 ins_VibratoDepth;
uint8 ins_HardCutRelease;
uint8 ins_HardCutReleaseFrames;
struct hvl_envelope ins_Envelope;
struct hvl_plist ins_PList;
};
struct hvl_position
{
uint8 pos_Track[MAX_CHANNELS];
int8 pos_Transpose[MAX_CHANNELS];
};
struct hvl_step
{
uint8 stp_Note;
uint8 stp_Instrument;
uint8 stp_FX;
uint8 stp_FXParam;
uint8 stp_FXb;
uint8 stp_FXbParam;
};
struct hvl_voice
{
int16 vc_Track;
int16 vc_NextTrack;
int16 vc_Transpose;
int16 vc_NextTranspose;
int16 vc_OverrideTranspose; // 1.5
int32 vc_ADSRVolume;
struct hvl_envelope vc_ADSR;
struct hvl_instrument *vc_Instrument;
uint32 vc_SamplePos;
uint32 vc_Delta;
uint16 vc_InstrPeriod;
uint16 vc_TrackPeriod;
uint16 vc_VibratoPeriod;
uint16 vc_WaveLength;
int16 vc_NoteMaxVolume;
uint16 vc_PerfSubVolume;
uint8 vc_NewWaveform;
uint8 vc_Waveform;
uint8 vc_PlantPeriod;
uint8 vc_VoiceVolume;
uint8 vc_PlantSquare;
uint8 vc_IgnoreSquare;
uint8 vc_FixedNote;
int16 vc_VolumeSlideUp;
int16 vc_VolumeSlideDown;
int16 vc_HardCut;
uint8 vc_HardCutRelease;
int16 vc_HardCutReleaseF;
uint8 vc_PeriodSlideOn;
int16 vc_PeriodSlideSpeed;
int16 vc_PeriodSlidePeriod;
int16 vc_PeriodSlideLimit;
int16 vc_PeriodSlideWithLimit;
int16 vc_PeriodPerfSlideSpeed;
int16 vc_PeriodPerfSlidePeriod;
uint8 vc_PeriodPerfSlideOn;
int16 vc_VibratoDelay;
int16 vc_VibratoSpeed;
int16 vc_VibratoCurrent;
int16 vc_VibratoDepth;
int16 vc_SquareOn;
int16 vc_SquareInit;
int16 vc_SquareWait;
int16 vc_SquareLowerLimit;
int16 vc_SquareUpperLimit;
int16 vc_SquarePos;
int16 vc_SquareSign;
int16 vc_SquareSlidingIn;
int16 vc_SquareReverse;
uint8 vc_FilterOn;
uint8 vc_FilterInit;
int16 vc_FilterWait;
int16 vc_FilterSpeed;
int16 vc_FilterUpperLimit;
int16 vc_FilterLowerLimit;
int16 vc_FilterPos;
int16 vc_FilterSign;
int16 vc_FilterSlidingIn;
int16 vc_IgnoreFilter;
int16 vc_PerfCurrent;
int16 vc_PerfSpeed;
int16 vc_PerfWait;
struct hvl_plist *vc_PerfList;
int8 *vc_AudioPointer;
int8 *vc_AudioSource;
uint8 vc_NoteDelayOn;
uint8 vc_NoteCutOn;
int16 vc_NoteDelayWait;
int16 vc_NoteCutWait;
int16 vc_AudioPeriod;
int16 vc_AudioVolume;
int32 vc_WNRandom;
int8 *vc_MixSource;
int8 vc_SquareTempBuffer[0x80];
int8 vc_VoiceBuffer[0x282*4];
uint8 vc_VoiceNum;
uint8 vc_TrackMasterVolume;
uint8 vc_TrackOn;
int16 vc_VoicePeriod;
uint32 vc_Pan;
uint32 vc_SetPan; // New for 1.4
uint32 vc_PanMultLeft;
uint32 vc_PanMultRight;
uint32 vc_RingSamplePos;
uint32 vc_RingDelta;
int8 *vc_RingMixSource;
uint8 vc_RingPlantPeriod;
int16 vc_RingInstrPeriod;
int16 vc_RingBasePeriod;
int16 vc_RingAudioPeriod;
int8 *vc_RingAudioSource;
uint8 vc_RingNewWaveform;
uint8 vc_RingWaveform;
uint8 vc_RingFixedPeriod;
int8 vc_RingVoiceBuffer[0x282*4];
int32 vc_LastAmp[2];
uint32 vc_LastClock[2];
};
struct hvl_tune
{
TEXT ht_Name[128];
uint16 ht_SongNum;
uint32 ht_Frequency;
float64 ht_FreqF;
int8 *ht_WaveformTab[MAX_CHANNELS];
uint16 ht_Restart;
uint16 ht_PositionNr;
uint8 ht_SpeedMultiplier;
uint8 ht_TrackLength;
uint8 ht_TrackNr;
uint8 ht_InstrumentNr;
uint8 ht_SubsongNr;
uint16 ht_PosJump;
uint32 ht_PlayingTime;
int16 ht_Tempo;
int16 ht_PosNr;
int16 ht_StepWaitFrames;
int16 ht_NoteNr;
uint16 ht_PosJumpNote;
uint8 ht_GetNewPosition;
uint8 ht_PatternBreak;
uint8 ht_SongEndReached;
uint8 ht_Stereo;
uint16 *ht_Subsongs;
uint16 ht_Channels;
struct hvl_position *ht_Positions;
struct hvl_step ht_Tracks[256][64];
struct hvl_instrument *ht_Instruments;
struct hvl_voice ht_Voices[MAX_CHANNELS];
hvl_blip_t *ht_BlipBuffers[2];
int32 ht_defstereo;
int32 ht_defpanleft;
int32 ht_defpanright;
int32 ht_mixgain;
uint8 ht_Version;
};
void hvl_DecodeFrame( struct hvl_tune *ht, int8 *buf1, int8 *buf2, int32 bufmod );
void hvl_InitReplayer( void );
BOOL hvl_InitSubsong( struct hvl_tune *ht, uint32 nr );
struct hvl_tune *hvl_LoadTune( const uint8 *buf, uint32 buflen, uint32 freq, uint32 defstereo );
void hvl_FreeTune( struct hvl_tune *ht );
void hvl_play_irq( struct hvl_tune *ht );
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,378 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
836FB5311820538700B3AD2D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 836FB5301820538700B3AD2D /* Cocoa.framework */; };
836FB53B1820538700B3AD2D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 836FB5391820538700B3AD2D /* InfoPlist.strings */; };
836FB5971820554E00B3AD2D /* HivelyPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 836FB58A182053D800B3AD2D /* HivelyPlayer.framework */; };
836FB5991820556100B3AD2D /* HivelyPlayer.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 836FB58A182053D800B3AD2D /* HivelyPlayer.framework */; };
836FB5A01820556F00B3AD2D /* HVLDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 836FB59B1820556F00B3AD2D /* HVLDecoder.m */; };
836FB5A11820556F00B3AD2D /* HVLMetadataReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 836FB59D1820556F00B3AD2D /* HVLMetadataReader.m */; };
836FB5A21820556F00B3AD2D /* HVLContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 836FB59F1820556F00B3AD2D /* HVLContainer.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
836FB589182053D800B3AD2D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 836FB584182053D700B3AD2D /* HivelyPlayer.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 836FB556182053D700B3AD2D;
remoteInfo = HivelyPlayer;
};
836FB5951820554300B3AD2D /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 836FB584182053D700B3AD2D /* HivelyPlayer.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 836FB555182053D700B3AD2D;
remoteInfo = HivelyPlayer;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
836FB5981820555500B3AD2D /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
836FB5991820556100B3AD2D /* HivelyPlayer.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
836FB52D1820538700B3AD2D /* Hively.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hively.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
836FB5301820538700B3AD2D /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
836FB5331820538700B3AD2D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
836FB5341820538700B3AD2D /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
836FB5351820538700B3AD2D /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
836FB5381820538700B3AD2D /* Hively-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Hively-Info.plist"; sourceTree = "<group>"; };
836FB53A1820538700B3AD2D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
836FB53C1820538700B3AD2D /* Hively-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Hively-Prefix.pch"; sourceTree = "<group>"; };
836FB584182053D700B3AD2D /* HivelyPlayer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = HivelyPlayer.xcodeproj; path = ../../Frameworks/HivelyPlayer/HivelyPlayer.xcodeproj; sourceTree = "<group>"; };
836FB59A1820556F00B3AD2D /* HVLDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HVLDecoder.h; sourceTree = "<group>"; };
836FB59B1820556F00B3AD2D /* HVLDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HVLDecoder.m; sourceTree = "<group>"; };
836FB59C1820556F00B3AD2D /* HVLMetadataReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HVLMetadataReader.h; sourceTree = "<group>"; };
836FB59D1820556F00B3AD2D /* HVLMetadataReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HVLMetadataReader.m; sourceTree = "<group>"; };
836FB59E1820556F00B3AD2D /* HVLContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HVLContainer.h; sourceTree = "<group>"; };
836FB59F1820556F00B3AD2D /* HVLContainer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HVLContainer.m; sourceTree = "<group>"; };
836FB5A31820557E00B3AD2D /* Plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Plugin.h; path = ../../../Audio/Plugin.h; sourceTree = "<group>"; };
836FB5A41820558900B3AD2D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../../Utils/Logging.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
836FB52A1820538700B3AD2D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
836FB5971820554E00B3AD2D /* HivelyPlayer.framework in Frameworks */,
836FB5311820538700B3AD2D /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
836FB5241820538700B3AD2D = {
isa = PBXGroup;
children = (
836FB5361820538700B3AD2D /* Hively */,
836FB52F1820538700B3AD2D /* Frameworks */,
836FB52E1820538700B3AD2D /* Products */,
);
sourceTree = "<group>";
};
836FB52E1820538700B3AD2D /* Products */ = {
isa = PBXGroup;
children = (
836FB52D1820538700B3AD2D /* Hively.bundle */,
);
name = Products;
sourceTree = "<group>";
};
836FB52F1820538700B3AD2D /* Frameworks */ = {
isa = PBXGroup;
children = (
836FB5301820538700B3AD2D /* Cocoa.framework */,
836FB5321820538700B3AD2D /* Other Frameworks */,
836FB584182053D700B3AD2D /* HivelyPlayer.xcodeproj */,
);
name = Frameworks;
sourceTree = "<group>";
};
836FB5321820538700B3AD2D /* Other Frameworks */ = {
isa = PBXGroup;
children = (
836FB5331820538700B3AD2D /* Foundation.framework */,
836FB5341820538700B3AD2D /* CoreData.framework */,
836FB5351820538700B3AD2D /* AppKit.framework */,
);
name = "Other Frameworks";
sourceTree = "<group>";
};
836FB5361820538700B3AD2D /* Hively */ = {
isa = PBXGroup;
children = (
836FB5A41820558900B3AD2D /* Logging.h */,
836FB5A31820557E00B3AD2D /* Plugin.h */,
836FB59A1820556F00B3AD2D /* HVLDecoder.h */,
836FB59B1820556F00B3AD2D /* HVLDecoder.m */,
836FB59C1820556F00B3AD2D /* HVLMetadataReader.h */,
836FB59D1820556F00B3AD2D /* HVLMetadataReader.m */,
836FB59E1820556F00B3AD2D /* HVLContainer.h */,
836FB59F1820556F00B3AD2D /* HVLContainer.m */,
836FB5371820538700B3AD2D /* Supporting Files */,
);
path = Hively;
sourceTree = "<group>";
};
836FB5371820538700B3AD2D /* Supporting Files */ = {
isa = PBXGroup;
children = (
836FB5381820538700B3AD2D /* Hively-Info.plist */,
836FB5391820538700B3AD2D /* InfoPlist.strings */,
836FB53C1820538700B3AD2D /* Hively-Prefix.pch */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
836FB585182053D700B3AD2D /* Products */ = {
isa = PBXGroup;
children = (
836FB58A182053D800B3AD2D /* HivelyPlayer.framework */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
836FB52C1820538700B3AD2D /* Hively */ = {
isa = PBXNativeTarget;
buildConfigurationList = 836FB53F1820538700B3AD2D /* Build configuration list for PBXNativeTarget "Hively" */;
buildPhases = (
836FB5291820538700B3AD2D /* Sources */,
836FB52A1820538700B3AD2D /* Frameworks */,
836FB52B1820538700B3AD2D /* Resources */,
836FB5981820555500B3AD2D /* CopyFiles */,
);
buildRules = (
);
dependencies = (
836FB5961820554300B3AD2D /* PBXTargetDependency */,
);
name = Hively;
productName = Hively;
productReference = 836FB52D1820538700B3AD2D /* Hively.bundle */;
productType = "com.apple.product-type.bundle";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
836FB5251820538700B3AD2D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0500;
ORGANIZATIONNAME = "Christopher Snowhill";
};
buildConfigurationList = 836FB5281820538700B3AD2D /* Build configuration list for PBXProject "Hively" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 836FB5241820538700B3AD2D;
productRefGroup = 836FB52E1820538700B3AD2D /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 836FB585182053D700B3AD2D /* Products */;
ProjectRef = 836FB584182053D700B3AD2D /* HivelyPlayer.xcodeproj */;
},
);
projectRoot = "";
targets = (
836FB52C1820538700B3AD2D /* Hively */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
836FB58A182053D800B3AD2D /* HivelyPlayer.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = HivelyPlayer.framework;
remoteRef = 836FB589182053D800B3AD2D /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
836FB52B1820538700B3AD2D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
836FB53B1820538700B3AD2D /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
836FB5291820538700B3AD2D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
836FB5A11820556F00B3AD2D /* HVLMetadataReader.m in Sources */,
836FB5A21820556F00B3AD2D /* HVLContainer.m in Sources */,
836FB5A01820556F00B3AD2D /* HVLDecoder.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
836FB5961820554300B3AD2D /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = HivelyPlayer;
targetProxy = 836FB5951820554300B3AD2D /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
836FB5391820538700B3AD2D /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
836FB53A1820538700B3AD2D /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
836FB53D1820538700B3AD2D /* 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.7;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Debug;
};
836FB53E1820538700B3AD2D /* 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.7;
SDKROOT = macosx;
};
name = Release;
};
836FB5401820538700B3AD2D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Hively/Hively-Prefix.pch";
INFOPLIST_FILE = "Hively/Hively-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = bundle;
};
name = Debug;
};
836FB5411820538700B3AD2D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Hively/Hively-Prefix.pch";
INFOPLIST_FILE = "Hively/Hively-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = bundle;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
836FB5281820538700B3AD2D /* Build configuration list for PBXProject "Hively" */ = {
isa = XCConfigurationList;
buildConfigurations = (
836FB53D1820538700B3AD2D /* Debug */,
836FB53E1820538700B3AD2D /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
836FB53F1820538700B3AD2D /* Build configuration list for PBXNativeTarget "Hively" */ = {
isa = XCConfigurationList;
buildConfigurations = (
836FB5401820538700B3AD2D /* Debug */,
836FB5411820538700B3AD2D /* Release */,
);
defaultConfigurationIsVisible = 0;
};
/* End XCConfigurationList section */
};
rootObject = 836FB5251820538700B3AD2D /* Project object */;
}

View File

@ -0,0 +1,17 @@
//
// HVLContainer.h
// Hively
//
// Created by Christopher Snowhill on 10/29/13.
// Copyright 2013 __NoWork, Inc__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "Plugin.h"
@interface HVLContainer : NSObject <CogContainer> {
}
@end

View File

@ -0,0 +1,68 @@
//
// HVLContainer.m
// Hively
//
// Created by Christopher Snowhill on 10/29/13.
// Copyright 2013 __NoWork, Inc__. All rights reserved.
//
#import "HVLContainer.h"
#import "HVLDecoder.h"
#import "Logging.h"
@implementation HVLContainer
+ (NSArray *)fileTypes
{
return [HVLDecoder fileTypes];
}
+ (NSArray *)mimeTypes
{
return nil;
}
+ (NSArray *)urlsForContainerURL:(NSURL *)url
{
if ([url fragment]) {
// input url already has fragment defined - no need to expand further
return [NSMutableArray arrayWithObject:url];
}
id audioSourceClass = NSClassFromString(@"AudioSource");
id<CogSource> source = [audioSourceClass audioSourceForURL:url];
if (![source open:url])
return 0;
if (![source seekable])
return 0;
[source seek:0 whence:SEEK_END];
long size = [source tell];
[source seek:0 whence:SEEK_SET];
void * data = malloc(size);
[source read:data amount:size];
struct hvl_tune * tune = hvl_LoadTune( data, size, 44100, 2 );
free( data );
if ( !tune )
return nil;
int subsongNr = tune->ht_SubsongNr;
hvl_FreeTune( tune );
NSMutableArray *tracks = [NSMutableArray array];
for (int i = 0; i <= subsongNr; ++i) {
[tracks addObject:[NSURL URLWithString:[[url absoluteString] stringByAppendingFormat:@"#%i", i]]];
}
return tracks;
}
@end

View File

@ -0,0 +1,26 @@
//
// HVLDecoder.h
// Hively
//
// Created by Christopher Snowhill on 10/29/13.
// Copyright 2013 __NoWork, Inc__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import <HivelyPlayer/hvl_replay.h>
#import "Plugin.h"
@interface HVLDecoder : NSObject <CogDecoder> {
struct hvl_tune *tune;
int32_t *buffer;
long trackNumber;
long totalFrames;
long framesLength;
long framesFade;
long framesRead;
long framesInBuffer;
}
@end

View File

@ -0,0 +1,194 @@
//
// HVLDecoder.m
// Hively
//
// Created by Christopher Snowhill on 10/29/13.
// Copyright 2013 __NoWork, Inc__. All rights reserved.
//
#import "HVLDecoder.h"
#import "Logging.h"
@implementation HVLDecoder
void oneTimeInit()
{
static BOOL initialized = NO;
if (!initialized)
{
hvl_InitReplayer();
initialized = YES;
}
}
+ (void)initialize
{
if ([self class] == [HVLDecoder class])
oneTimeInit();
}
- (BOOL)open:(id<CogSource>)s
{
[s seek:0 whence:SEEK_END];
long size = [s tell];
[s seek:0 whence:SEEK_SET];
void * data = malloc(size);
[s read:data amount:size];
tune = hvl_LoadTune( data, size, 44100, 2 );
free( data );
if ( !tune )
return NO;
unsigned long safety = 2 * 60 * 60 * 50 * tune->ht_SpeedMultiplier;
NSURL * url = [s url];
if ([[url fragment] length] == 0)
trackNumber = 0;
else
trackNumber = [[url fragment] intValue];
hvl_InitSubsong( tune, trackNumber );
unsigned long loops = 0;
while ( loops < 2 && safety )
{
while ( !tune->ht_SongEndReached && safety )
{
hvl_play_irq( tune );
--safety;
}
tune->ht_SongEndReached = 0;
++loops;
}
framesLength = tune->ht_PlayingTime * 44100 / (tune->ht_SpeedMultiplier * 50);
framesFade = 44100 * 8;
totalFrames = framesLength + framesFade;
framesRead = 0;
framesInBuffer = 0;
buffer = malloc( sizeof(int32_t) * (44100 / 50) * 2 );
hvl_InitSubsong( tune, trackNumber );
[self willChangeValueForKey:@"properties"];
[self didChangeValueForKey:@"properties"];
return YES;
}
- (NSDictionary *)properties
{
return [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:0], @"bitrate",
[NSNumber numberWithFloat:44100], @"sampleRate",
[NSNumber numberWithDouble:totalFrames], @"totalFrames",
[NSNumber numberWithInt:32], @"bitsPerSample", //Samples are short
[NSNumber numberWithBool:YES], @"floatingPoint",
[NSNumber numberWithInt:2], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:YES], @"seekable",
@"host", @"endian",
nil];
}
- (int)readAudio:(void *)buf frames:(UInt32)frames
{
int total = 0;
while ( total < frames ) {
if ( framesInBuffer )
{
float * outbuffer = (( float * ) buf) + total * 2;
int framesToCopy = frames - total;
if ( framesToCopy > framesInBuffer )
framesToCopy = framesInBuffer;
for ( int i = 0; i < framesToCopy; ++i )
{
outbuffer[ 0 ] = buffer[ i * 2 + 0 ] * (1.0f / 16777216.0f);
outbuffer[ 1 ] = buffer[ i * 2 + 1 ] * (1.0f / 16777216.0f);
outbuffer += 2;
}
framesInBuffer -= framesToCopy;
total += framesToCopy;
if (framesInBuffer)
{
memcpy(buffer, buffer + framesToCopy * 2, sizeof(int32_t) * framesInBuffer * 2);
break;
}
}
hvl_DecodeFrame( tune, buffer, buffer + 1, 8 );
framesInBuffer = 44100 / 50;
}
if ( framesRead + total > framesLength ) {
long fadeStart = (framesLength > framesRead) ? framesLength : framesRead;
long fadeEnd = (framesRead + total) > totalFrames ? totalFrames : (framesRead + total);
long fadePos;
float * buff = ( float * ) buf;
float fadeScale = (float)(totalFrames - fadeStart) / (float)framesFade;
float fadeStep = 1.0 / (float)framesFade;
for (fadePos = fadeStart; fadePos < fadeEnd; ++fadePos) {
buff[ 0 ] *= fadeScale;
buff[ 1 ] *= fadeScale;
buff += 2;
fadeScale -= fadeStep;
if (fadeScale <= 0.0) break;
}
total = fadePos - fadeStart;
}
framesRead += total;
return total;
}
- (long)seek:(long)frame
{
if (frame < framesRead) {
hvl_InitSubsong( tune, trackNumber );
framesRead = 0;
}
while (framesRead < frame) {
hvl_play_irq( tune );
framesRead += 44100 / 50;
}
return framesRead;
}
- (void)close
{
if ( tune ) {
hvl_FreeTune( tune );
tune = NULL;
}
if ( buffer ) {
free( buffer );
buffer = NULL;
}
}
+ (NSArray *)fileTypes
{
return [NSArray arrayWithObjects:@"hvl", @"ahx", nil];
}
+ (NSArray *)mimeTypes
{
return nil;
}
+ (float)priority
{
return 1.0;
}
@end

View File

@ -0,0 +1,17 @@
//
// HVLMetadataReader.h
// Hively
//
// Created by Christopher Snowhill on 10/29/13.
// Copyright 2013 __NoWork, Inc__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "Plugin.h"
@interface HVLMetadataReader : NSObject <CogMetadataReader> {
}
@end

View File

@ -0,0 +1,60 @@
//
// HVLMetadataReader.m
// Hively
//
// Created by Christopher Snowhill on 10/29/13.
// Copyright 2013 __NoWork, Inc__. All rights reserved.
//
#import "HVLMetadataReader.h"
#import "HVLDecoder.h"
#import "Logging.H"
@implementation HVLMetadataReader
+ (NSArray *)fileTypes
{
return [HVLDecoder fileTypes];
}
+ (NSArray *)mimeTypes
{
return [HVLDecoder mimeTypes];
}
+ (NSDictionary *)metadataForURL:(NSURL *)url
{
id audioSourceClass = NSClassFromString(@"AudioSource");
id<CogSource> source = [audioSourceClass audioSourceForURL:url];
if (![source open:url])
return 0;
if (![source seekable])
return 0;
[source seek:0 whence:SEEK_END];
long size = [source tell];
[source seek:0 whence:SEEK_SET];
void * data = malloc(size);
[source read:data amount:size];
struct hvl_tune * tune = hvl_LoadTune( data, size, 44100, 2 );
free( data );
if ( !tune )
return nil;
NSString *title = [[NSString stringWithUTF8String: tune->ht_Name] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
hvl_FreeTune( tune );
if (title == nil) {
title = @"";
}
return [NSDictionary dictionaryWithObject:title forKey:@"title"];
}
@end

View File

@ -0,0 +1,30 @@
<?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>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>net.kode54.hively</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</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>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2013 Christopher Snowhill. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>

View File

@ -0,0 +1,9 @@
//
// Prefix header
//
// The contents of this file are implicitly included at the beginning of every source file.
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif

View File

@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */