From f872de223d180e87a89f4840ef4ecd0897f3c7b4 Mon Sep 17 00:00:00 2001 From: Thong Nguyen Date: Thu, 3 Dec 2015 16:18:06 +0000 Subject: [PATCH] Added support for disabling buffers in options using STK_DISABLE_BUFFER. Changed bufferSizeInSeconds from a UInt32 to Float32 --- .../ExampleApp.xcodeproj/project.pbxproj | 7 +++- ExampleApp/ExampleApp/AppDelegate.m | 6 ++-- ExampleApp/ExampleApp/AudioPlayerView.m | 16 ++++----- ExampleApp/ExampleApp/ExampleApp-Info.plist | 2 +- .../AppIcon.appiconset/Contents.json | 15 +++++++++ .../ExampleApp/Images.xcassets/Contents.json | 6 ++++ .../LaunchImage.launchimage/Contents.json | 28 +++++++++++++++- .../LaunchImage.launchimage/TX6sV.png | Bin 0 -> 16733 bytes .../LaunchImage.launchimage/dBEHd.png | Bin 0 -> 8522 bytes .../ExampleAppTests-Info.plist | 2 +- .../StreamingKit.xcodeproj/project.pbxproj | 7 +++- .../contents.xcworkspacedata | 7 ++++ StreamingKit/StreamingKit/STKAudioPlayer.h | 9 ++++- StreamingKit/StreamingKit/STKAudioPlayer.m | 31 +++++++++++++++++- .../STKAutoRecoveringHTTPDataSource.m | 2 ++ .../StreamingKitMacTests-Info.plist | 2 +- .../StreamingKitTests-Info.plist | 2 +- 17 files changed, 122 insertions(+), 20 deletions(-) create mode 100644 ExampleApp/ExampleApp/Images.xcassets/Contents.json create mode 100644 ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/TX6sV.png create mode 100644 ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/dBEHd.png create mode 100644 StreamingKit/StreamingKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/ExampleApp/ExampleApp.xcodeproj/project.pbxproj b/ExampleApp/ExampleApp.xcodeproj/project.pbxproj index 046b397..53b60b7 100644 --- a/ExampleApp/ExampleApp.xcodeproj/project.pbxproj +++ b/ExampleApp/ExampleApp.xcodeproj/project.pbxproj @@ -230,7 +230,7 @@ A1115929188D686000641365 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0510; + LastUpgradeCheck = 0710; ORGANIZATIONNAME = "Thong Nguyen"; TargetAttributes = { A111594B188D686000641365 = { @@ -346,6 +346,7 @@ 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; @@ -422,6 +423,7 @@ 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; }; @@ -438,6 +440,7 @@ 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; }; @@ -459,6 +462,7 @@ "$(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; @@ -477,6 +481,7 @@ 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; diff --git a/ExampleApp/ExampleApp/AppDelegate.m b/ExampleApp/ExampleApp/AppDelegate.m index d0680af..bb3d37c 100644 --- a/ExampleApp/ExampleApp/AppDelegate.m +++ b/ExampleApp/ExampleApp/AppDelegate.m @@ -32,6 +32,7 @@ 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]; @@ -39,7 +40,6 @@ audioPlayer.meteringEnabled = YES; audioPlayer.volume = 1; - AudioPlayerView* audioPlayerView = [[AudioPlayerView alloc] initWithFrame:self.window.bounds andAudioPlayer:audioPlayer]; audioPlayerView.delegate = self; @@ -47,9 +47,9 @@ [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; - [self.window addSubview:audioPlayerView]; - [self.window makeKeyAndVisible]; + + [self.window.rootViewController.view addSubview:audioPlayerView]; return YES; } diff --git a/ExampleApp/ExampleApp/AudioPlayerView.m b/ExampleApp/ExampleApp/AudioPlayerView.m index a93ea0b..5be5e70 100644 --- a/ExampleApp/ExampleApp/AudioPlayerView.m +++ b/ExampleApp/ExampleApp/AudioPlayerView.m @@ -58,27 +58,27 @@ CGSize size = CGSizeMake(220, 50); playFromHTTPButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - playFromHTTPButton.frame = CGRectMake((320 - size.width) / 2, frame.size.height * 0.10, size.width, size.height); + 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((320 - size.width) / 2, frame.size.height * 0.10 + 35, size.width, size.height); + 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((320 - size.width) / 2, frame.size.height * 0.10 + 70, size.width, size.height); + 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((320 - size.width) / 2, frame.size.height * 0.10 + 105, size.width, size.height); + 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((320 - size.width) / 2, frame.size.height * 0.10 + 140, size.width, size.height); + 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]; @@ -89,12 +89,12 @@ [playButton addTarget:self action:@selector(playButtonPressed) forControlEvents:UIControlEventTouchUpInside]; stopButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - stopButton.frame = CGRectMake((320 - size.width) - 30, 400, size.width, size.height); + 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((320 - size.width) - 30, 430, size.width, size.height); + 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]; @@ -106,7 +106,7 @@ repeatSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(30, frame.size.height * 0.15 + 180, size.width, size.height)]; - enableEqSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(320 - size.width - 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]; diff --git a/ExampleApp/ExampleApp/ExampleApp-Info.plist b/ExampleApp/ExampleApp/ExampleApp-Info.plist index f2f0135..ef8abcd 100644 --- a/ExampleApp/ExampleApp/ExampleApp-Info.plist +++ b/ExampleApp/ExampleApp/ExampleApp-Info.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - abstractpath.com.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/ExampleApp/ExampleApp/Images.xcassets/AppIcon.appiconset/Contents.json b/ExampleApp/ExampleApp/Images.xcassets/AppIcon.appiconset/Contents.json index 91bf9c1..36d2c80 100644 --- a/ExampleApp/ExampleApp/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ExampleApp/ExampleApp/Images.xcassets/AppIcon.appiconset/Contents.json @@ -5,16 +5,31 @@ "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", diff --git a/ExampleApp/ExampleApp/Images.xcassets/Contents.json b/ExampleApp/ExampleApp/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/ExampleApp/ExampleApp/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/Contents.json b/ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/Contents.json index 6f870a4..83b8ad2 100644 --- a/ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -1,5 +1,31 @@ { "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", @@ -10,9 +36,9 @@ { "orientation" : "portrait", "idiom" : "iphone", - "subtype" : "retina4", "extent" : "full-screen", "minimum-system-version" : "7.0", + "subtype" : "retina4", "scale" : "2x" }, { diff --git a/ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/TX6sV.png b/ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/TX6sV.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5242baa308ee53c65d5849b003dd29365c06b7 GIT binary patch literal 16733 zcmeHOO>7%Q6rMDpF%^-_4O%3o8<0TM-XGg*dx@L+ml$vw97{E-kl5@_;#IOg>~63V z4vk7VK;Z(Xa)EN;h7?jEqzDmC{79voAdL{>0uo^0)?>;%Ck`B}P!8OlW$De1=grUC z@4fe}XZF>Z=_kgH9Y0108LLi}>V%B!5E6Mea+KHn^5)qqT-+a)o8hcGAGUR$k-X{7 zF+Qd7y$F&KWnCy7EvB*L?#}+InC;Ykj zsX#3=C!9;wq?%V`Eo*AkXS1u*4P$lD$eP0BX*$u-cn3BMb=t9)oIva3gkHZIFGIB` z&|Z^pF(>Rzs#%+%Mb~FE6;H$rNtUUq#^q#6RpnDukz_@b_*ad|NiC&nN}BF}1U{N? z&TI8jWq&Mwl@nTF=xL(ZZnxv@MBMckL^+$yLLZ6}<1J#riWBOcm=lcmdnmEM@GUR2 zT!%uB`kcEQ<^(>|y(QRQt#;6{6YLv`n@sHJo+!s9(Y9e-z1BfkXMay)VC$f<;xVz# z0(aRr`2Cn4?<;fL9X=2=c5|whkP{?Gms+7<6`xvB~tfUG_Ih{`=l3cT#%qvPFo6i)AQdvz`(y6{~)d@n~ zF<5_Gi;ugnn>|!lEBZ_iUBBVFOML{)wA|1QTCPWnvnqY0rW=+66_3IV+FNgl`PPff ztoW`?dluHL0W;X3%MbPnw=bz6BM}=!G|B@3A(UPl;^NGi)-V@q zYu`X%AVXKjKpZKY05O7!XdI3ML=Jif!~+Z+7#;x!m^&~(B6;ABfCLHIBLqYwNJx+X z2S|{RAOQ}LAR$3Qg2WvG2@(<{2#83KkRSmL?t~zn?ryI`+bw$Gw`%v)>qp<~{U?or zpb5|f1WkY@;L#Cd0h$0&fQ|r631b1808xOBfUy9d6!Bphvms_f%!Zf^F&knw{14gi zjqP;<_UzX3yWhUG{p@{EmZCPG2*v+nf+;ezvtB&0rqjs9hm^aYyj^?y(#TIwNzKgo zbHk(OaO(`fhg)a3bp|-NldUs+Zv$Uy0j%J$3(OsW1I!(mI{*imJMdg8-~i91;<;2j wm&zSsFhTOJ-|AlZWaGxe;49wJ^*?Uz4vl_wd^fT+`Y}{h%hRO~3eR8s3+^jkZ2$lO literal 0 HcmV?d00001 diff --git a/ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/dBEHd.png b/ExampleApp/ExampleApp/Images.xcassets/LaunchImage.launchimage/dBEHd.png new file mode 100644 index 0000000000000000000000000000000000000000..8f82b77b1e19a4cd017499276539a958f1850f73 GIT binary patch literal 8522 zcmeHLXHZnx5E!0=cG=0zokIr- z<#4~`=IDIE0RZm-lqmvcI>V^6I=l?g3lF@b=Vrn{%3%VD45W|c733tN)eYy&=w~pl zKBS>R#MYP|P8b~>7{y>LM0u0Ek7R=Lesu7I@S9ERqka!udMa0^TDP9|Do+s$Af{vPs11tC z02W6}Q36OQftYc4hyWn+1J;dPT;AYDGN9L7G*|p^yoh#Ma0jX65=9KRoCea8RM>;W z++5@+KTe0~IK7O`0h<(6ks6<5773&j&6}kb0McU_cCuaC^u|#a;czn1XzFvqvoDCZ zkJ;LeZ%wx4yQ=~)>KV|nB_vwP8mK@V=(=^EXMxD+EJga2)kwz@8r7#DeP+OX$$b|a zjf`8E{{G2{i9X#rh^0-Fx&IcT<{Z|1^TMY9#f{aKH_ykokrHQ+T10DaYFd`{Gmo_0 zCc9xfI2EI{QAV-7!QOSOPRAAl7o;CIrt^qaPl;NR$UGJSxh?RLr*qqWY(!|CPf@MxRY_Is60t#lp`=%{ns1Aw#Y z+#;~1Qk4c$0Myfwg2ifV%hk+6SmGnq2M4PuHmqfCK)CB_AhZy2`@kcYtOW{!ApD`N z#q5ICqOVoirLe|Mp>giiA~j~usFmDlKHHF{Rr6OO$%xb%Ne|m_4ulif-h^{SlQJcT ztZ`Or6VXL-bG!;nbm@Rxn3ZOEtU@D@2-*m()DpjgEHPGk zP5Bgx$&qEfp?RO8-QH6?C5ACQwf)i)R;4JJjOq4#Cz^p6WoUyK_AN7sWZeZZk@{N5 z;}b$;adyp*j}=hn*RvL%Dj=+gSg~t+>_tR})WDL-5P3m3Y>ujF!}Z~YecCx3N4TX9 z4Uox_5#BJa;X4+WqxXcj{LrU5W?KpIFu1l5R}WpxVNqJYaA=(@H(dl&f)8`+fX?HG zuui&8&CZJ^Tr)zssZ!dkTyd`k>|IJo`Gz5IJrzm4^Wqn-RnowfeP2(1*t9kI#)))^kwU zv6OlXak^0Dhh9NS*YQ4X?Z0+aup()by&_U6FE>LDDyb`JUTU&*$5Dl3JjrA2uBRc{ zG=FyDQozk&`u7530&H1Q`WSHsE0?^4!~}T0cD`}G)?AfL(R?;4t4gE7VjW4X)}YI0 z#ixac!5u_RoA#RyWs_$!8Ys!H6p7@yWU^&csC&J*n7xpc_WW#Mn!a21uus+W=Og~2 zo3KsS&)F+llyKrwN^W92C5~C~rL>2eBD-h<{(~{}Osy(3(Tx90Df zG*Qm=R^!~`uJx|<4|s`rIeGOAW(^inObjqt0$B?B3i=JLEv@%kdy=J7mBf1`rcB1Oq|ZLSU^`^3^^@lkqI|DeWp~i5LL+2Q&CuveJC4a7-yKD z)`O@m{(ydk&Mjjpp6nyW7olCz{x%3(CPdlGqS}SHsyP30|KB&2NT|a4sq@)Svj<#$ za*1C4l>BfC?(Tw$|I6is8Bqkhjkc{%avXiQS)k4tWt!ThgeXz=z6YroEi1)TtTIlrq;~o;2$l>EI2QO4c=>!x+jokA$hsIwh{Wqc(Ox< z;$FO%%Sb_h5!48Ycsk7`Y9|_NUf5e)mg$wZYV)2+`J?isd*jOEin7BJ!xraSWU*z9 zWz9ylZfWO2MxfWZw(Yllw>v;~AP)h8FaoKDv^=oB=6j9vMYM`M-r-|O|GZjMI!28_ zEheZiXtKJH)2Z>@twPS#=_Fh%&Y3#oWWd{=b`qN@o5q(JdyK?1G42(nUg5D815y2vv zix-}cY|Jl(jiJUU#{HO*L>tez`()s1mP4``b4BQcp~^k_WEE0@w+1qUsJ$?i+LpORGof)cUF3b*}swy}y zSEA_QgC`$nICwnt6mfy#vzur^*KVWydGo}gfGS>J0~h4k>ZYLTrvxr@6lUa;A^vlN zz4K>`;Gz~IPi;PjqS%xfB5oGZNPUs2f8Yt#$f+muD<3uRqKU2i_=;dO6!YMP;{qx}1r^vs*fQ)h zOlF~T=&4Qb+Qp6qHowY`Qt!I)mX)iU%CDZ|%?Qj4x*fY6)^*lPS5=B4@@Cc&)?LpO z8oGMSHxPCbZjx|OqkA#0yV*OHU?wp=$LF-D8-9Dfg?jHLOeI5Q_WRxXF)nv?pNW}O zvXRxJRPqB?qx=d+NxFW!%8ps zM|TPK%6VWWs4EV!*cOF~NBIYcd>XXI-$(mR+u=se)407ar}Z4|)Yy)kR;X0KSuH;E zTr9y)9yWhwp7Kckoa?OTtm0N&mr+B--HMbVjFk&!!MEzEpX2HbTbe9xXt~Pg1LJm2 zcbc5iP}P#J+v>~Jl@Z3FfJ=OvxaNv}FTRDsN~6ki%c}Eg{m`MXZWYU|!M^u{*Uw|U z(w900wN{Bkg4?!YS7K&0~>bz~$iCdR#Ry_UH-i=AV6gs-ouKl=QYx1{*lM?C&3p&=^fz zVq%eL*Z*tgan-~D#yQ4P)g8}%oz4M*{;EEUk zv(^B}Cjr3ZcKh5*%^f{@MMqr?<~{JPN1Olv(%NF=^)_o{99L|6e!Tqw04jUvcAPy( z0EkimfY}QG>@z|D>e>G=SP$-ajZ^<&5Ze*HUk$sT?i&8L@7G}8_uY;DW!v#Q$R{?la2YK#PB_<8S{^zgUa= zjI!U{zR}(P5zTF%QT7?-zp~A^J zdj7)Qb)QkbOak_(#r;zJ30mCODEk^^U!&}qXY84U>@&)rXPQ4&nqmw8P)5NHQ3HZh W3YTerF;8 literal 0 HcmV?d00001 diff --git a/ExampleApp/ExampleAppTests/ExampleAppTests-Info.plist b/ExampleApp/ExampleAppTests/ExampleAppTests-Info.plist index 12b70c6..169b6f7 100644 --- a/ExampleApp/ExampleAppTests/ExampleAppTests-Info.plist +++ b/ExampleApp/ExampleAppTests/ExampleAppTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - abstractpath.com.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/StreamingKit/StreamingKit.xcodeproj/project.pbxproj b/StreamingKit/StreamingKit.xcodeproj/project.pbxproj index 5f8109d..e013273 100644 --- a/StreamingKit/StreamingKit.xcodeproj/project.pbxproj +++ b/StreamingKit/StreamingKit.xcodeproj/project.pbxproj @@ -425,7 +425,7 @@ isa = PBXProject; attributes = { CLASSPREFIX = STK; - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0710; ORGANIZATIONNAME = "Thong Nguyen"; }; buildConfigurationList = A1E7C4C3188D57F50010896F /* Build configuration list for PBXProject "StreamingKit" */; @@ -633,6 +633,7 @@ ); 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; @@ -653,6 +654,7 @@ 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; @@ -676,6 +678,7 @@ 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; @@ -776,6 +779,7 @@ "$(inherited)", ); INFOPLIST_FILE = "StreamingKitTests/StreamingKitTests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "abstractpath.com.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = xctest; }; @@ -792,6 +796,7 @@ 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; }; diff --git a/StreamingKit/StreamingKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StreamingKit/StreamingKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/StreamingKit/StreamingKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.h b/StreamingKit/StreamingKit/STKAudioPlayer.h index 0ce6d53..e4dd707 100644 --- a/StreamingKit/StreamingKit/STKAudioPlayer.h +++ b/StreamingKit/StreamingKit/STKAudioPlayer.h @@ -80,6 +80,11 @@ typedef enum } STKAudioPlayerErrorCode; +/// +/// 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 @@ -91,7 +96,7 @@ typedef struct /// 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) - UInt32 bufferSizeInSeconds; + Float32 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) @@ -101,6 +106,8 @@ typedef struct } STKAudioPlayerOptions; +#define STK_DISABLE_BUFFER (0xffffffff) + typedef void(^STKFrameFilter)(UInt32 channelsPerFrame, UInt32 bytesPerFrame, UInt32 frameCount, void* frames); @interface STKFrameFilterEntry : NSObject diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.m b/StreamingKit/StreamingKit/STKAudioPlayer.m index c5fa73b..cb15d47 100755 --- a/StreamingKit/StreamingKit/STKAudioPlayer.m +++ b/StreamingKit/StreamingKit/STKAudioPlayer.m @@ -96,6 +96,34 @@ static void PopulateOptionsWithDefault(STKAudioPlayerOptions* options) } } +static void NormalizeDisabledBuffers(STKAudioPlayerOptions* options) +{ + if (options->bufferSizeInSeconds == STK_DISABLE_BUFFER) + { + options->bufferSizeInSeconds = 0; + } + + if (options->readBufferSize == STK_DISABLE_BUFFER) + { + options->readBufferSize = 0; + } + + if (options->secondsRequiredToStartPlaying == STK_DISABLE_BUFFER) + { + options->secondsRequiredToStartPlaying = 0; + } + + if (options->secondsRequiredToStartPlayingAfterBufferUnderun == STK_DISABLE_BUFFER) + { + options->secondsRequiredToStartPlayingAfterBufferUnderun = 0; + } + + if (options->gracePeriodAfterSeekInSeconds == STK_DISABLE_BUFFER) + { + options->gracePeriodAfterSeekInSeconds = 0; + } +} + #define CHECK_STATUS_AND_REPORT(call) \ if ((status = (call))) \ { \ @@ -491,6 +519,7 @@ static void AudioFileStreamPacketsProc(void* clientData, UInt32 numberBytes, UIn self->equalizerEnabled = optionsIn.equalizerBandFrequencies[0] != 0; PopulateOptionsWithDefault(&options); + NormalizeDisabledBuffers(&options); framesRequiredToStartPlaying = canonicalAudioStreamBasicDescription.mSampleRate * options.secondsRequiredToStartPlaying; framesRequiredToPlayAfterRebuffering = canonicalAudioStreamBasicDescription.mSampleRate * options.secondsRequiredToStartPlayingAfterBufferUnderun; @@ -877,7 +906,7 @@ static void AudioFileStreamPacketsProc(void* clientData, UInt32 numberBytes, UIn } case kAudioFileStreamProperty_ReadyToProducePackets: { - if (!audioConverterAudioStreamBasicDescription.mFormatID == kAudioFormatLinearPCM) + if (audioConverterAudioStreamBasicDescription.mFormatID != kAudioFormatLinearPCM) { discontinuous = YES; } diff --git a/StreamingKit/StreamingKit/STKAutoRecoveringHTTPDataSource.m b/StreamingKit/StreamingKit/STKAutoRecoveringHTTPDataSource.m index 37fa5e5..445d44d 100644 --- a/StreamingKit/StreamingKit/STKAutoRecoveringHTTPDataSource.m +++ b/StreamingKit/StreamingKit/STKAutoRecoveringHTTPDataSource.m @@ -101,6 +101,8 @@ static void PopulateOptionsWithDefault(STKAutoRecoveringHTTPDataSourceOptions* o @implementation STKAutoRecoveringHTTPDataSource +@dynamic innerDataSource; + -(STKHTTPDataSource*) innerHTTPDataSource { return (STKHTTPDataSource*)self.innerDataSource; diff --git a/StreamingKit/StreamingKitMacTests/StreamingKitMacTests-Info.plist b/StreamingKit/StreamingKitMacTests/StreamingKitMacTests-Info.plist index 552d5b1..169b6f7 100644 --- a/StreamingKit/StreamingKitMacTests/StreamingKitMacTests-Info.plist +++ b/StreamingKit/StreamingKitMacTests/StreamingKitMacTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - com.abstractpath.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType diff --git a/StreamingKit/StreamingKitTests/StreamingKitTests-Info.plist b/StreamingKit/StreamingKitTests/StreamingKitTests-Info.plist index 12b70c6..169b6f7 100644 --- a/StreamingKit/StreamingKitTests/StreamingKitTests-Info.plist +++ b/StreamingKit/StreamingKitTests/StreamingKitTests-Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - abstractpath.com.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType