├── .hgignore ├── Classes ├── TSLibraryImport.h ├── TSLibraryImport.m ├── iPodLibraryAccessAppDelegate.h ├── iPodLibraryAccessAppDelegate.m ├── iPodLibraryAccessViewController.h └── iPodLibraryAccessViewController.m ├── LICENSE ├── MainWindow.xib ├── README.md ├── Tests-Info.plist ├── Tests.m ├── iPodLibraryAccess-Info.plist ├── iPodLibraryAccess.xcodeproj └── project.pbxproj ├── iPodLibraryAccessViewController.xib ├── iPodLibraryAccess_Prefix.pch ├── main.m └── quicktime_parse ├── main.c └── test.mov /.hgignore: -------------------------------------------------------------------------------- 1 | syntax: glob 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /Classes/TSLibraryImport.h: -------------------------------------------------------------------------------- 1 | // 2 | //The MIT License 3 | // 4 | //Copyright (c) 2010 tapsquare, llc., (http://www.tapsquare.com, art@tapsquare.com) 5 | // 6 | //Permission is hereby granted, free of charge, to any person obtaining a copy 7 | //of this software and associated documentation files (the "Software"), to deal 8 | //in the Software without restriction, including without limitation the rights 9 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | //copies of the Software, and to permit persons to whom the Software is 11 | //furnished to do so, subject to the following conditions: 12 | // 13 | //The above copyright notice and this permission notice shall be included in 14 | //all copies or substantial portions of the Software. 15 | // 16 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | //THE SOFTWARE. 23 | // 24 | 25 | #define TSLibraryImportErrorDomain @"TSLibraryImportErrorDomain" 26 | 27 | #define TSUnknownError @"TSUnknownError" 28 | #define TSFileExistsError @"TSFileExistsError" 29 | 30 | #define kTSUnknownError -65536 31 | #define kTSFileExistsError -48 //dupFNErr 32 | 33 | typedef NSInteger AVAssetExportSessionStatus; 34 | 35 | @class AVAssetExportSession; 36 | 37 | @interface TSLibraryImport : NSObject { 38 | AVAssetExportSession* exportSession; 39 | NSError* movieFileErr; 40 | } 41 | 42 | /** 43 | * Pass in the NSURL* you get from an MPMediaItem's 44 | * MPMediaItemPropertyAssetURL property to get the file's extension. 45 | * 46 | * Helpful in constructing the destination url for the 47 | * imported file. 48 | */ 49 | + (NSString*)extensionForAssetURL:(NSURL*)assetURL; 50 | 51 | /** 52 | * @param: assetURL The NSURL* returned by MPMediaItemPropertyAssetURL property of MPMediaItem. 53 | * @param: destURL The file URL to write the imported file to. You'll get an exception if a file 54 | * exists at this location. 55 | * @param completionBlock This block is called when the import completes. Note that 56 | * completion doesn't imply success. Be sure to check the status and error properties 57 | * of the TSLibraryImport* instance from your completionBlock. 58 | */ 59 | - (void)importAsset:(NSURL*)assetURL toURL:(NSURL*)destURL completionBlock:(void (^)(TSLibraryImport* import))completionBlock; 60 | 61 | @property (readonly) NSError* error; 62 | @property (readonly) AVAssetExportSessionStatus status; 63 | @property (readonly) float progress; 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /Classes/TSLibraryImport.m: -------------------------------------------------------------------------------- 1 | // 2 | //The MIT License 3 | // 4 | //Copyright (c) 2010 tapsquare, llc., (http://www.tapsquare.com, art@tapsquare.com) 5 | // 6 | //Permission is hereby granted, free of charge, to any person obtaining a copy 7 | //of this software and associated documentation files (the "Software"), to deal 8 | //in the Software without restriction, including without limitation the rights 9 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | //copies of the Software, and to permit persons to whom the Software is 11 | //furnished to do so, subject to the following conditions: 12 | // 13 | //The above copyright notice and this permission notice shall be included in 14 | //all copies or substantial portions of the Software. 15 | // 16 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | //THE SOFTWARE. 23 | // 24 | 25 | #import "TSLibraryImport.h" 26 | #import 27 | 28 | @interface TSLibraryImport() 29 | 30 | + (BOOL)validIpodLibraryURL:(NSURL*)url; 31 | - (void)extractQuicktimeMovie:(NSURL*)movieURL toFile:(NSURL*)destURL; 32 | 33 | @end 34 | 35 | 36 | @implementation TSLibraryImport 37 | 38 | + (BOOL)validIpodLibraryURL:(NSURL*)url { 39 | NSString* IPOD_SCHEME = @"ipod-library"; 40 | if (nil == url) return NO; 41 | if (nil == url.scheme) return NO; 42 | if ([url.scheme compare:IPOD_SCHEME] != NSOrderedSame) return NO; 43 | if ([url.pathExtension compare:@"mp3"] != NSOrderedSame && 44 | [url.pathExtension compare:@"aif"] != NSOrderedSame && 45 | [url.pathExtension compare:@"m4a"] != NSOrderedSame && 46 | [url.pathExtension compare:@"wav"] != NSOrderedSame) { 47 | return NO; 48 | } 49 | return YES; 50 | } 51 | 52 | + (NSString*)extensionForAssetURL:(NSURL*)assetURL { 53 | if (nil == assetURL) 54 | @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"nil assetURL" userInfo:nil]; 55 | if (![TSLibraryImport validIpodLibraryURL:assetURL]) 56 | @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"Invalid iPod Library URL: %@", assetURL] userInfo:nil]; 57 | return assetURL.pathExtension; 58 | } 59 | 60 | - (void)doMp3ImportToFile:(NSURL*)destURL completionBlock:(void (^)(TSLibraryImport* import))completionBlock { 61 | //TODO: instead of putting this in the same directory as the dest file, we should probably stuff 62 | //this in tmp 63 | NSURL* tmpURL = [[destURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"mov"]; 64 | [[NSFileManager defaultManager] removeItemAtURL:tmpURL error:nil]; 65 | exportSession.outputURL = tmpURL; 66 | 67 | exportSession.outputFileType = AVFileTypeQuickTimeMovie; 68 | [exportSession exportAsynchronouslyWithCompletionHandler:^(void) { 69 | if (exportSession.status == AVAssetExportSessionStatusFailed) { 70 | completionBlock(self); 71 | } else if (exportSession.status == AVAssetExportSessionStatusCancelled) { 72 | completionBlock(self); 73 | } else { 74 | @try { 75 | [self extractQuicktimeMovie:tmpURL toFile:destURL]; 76 | } 77 | @catch (NSException * e) { 78 | OSStatus code = noErr; 79 | if ([e.name compare:TSUnknownError]) code = kTSUnknownError; 80 | else if ([e.name compare:TSFileExistsError]) code = kTSFileExistsError; 81 | NSDictionary* errorDict = [NSDictionary dictionaryWithObject:e.reason forKey:NSLocalizedDescriptionKey]; 82 | 83 | movieFileErr = [[NSError alloc] initWithDomain:TSLibraryImportErrorDomain code:code userInfo:errorDict]; 84 | } 85 | //clean up the tmp .mov file 86 | [[NSFileManager defaultManager] removeItemAtURL:tmpURL error:nil]; 87 | completionBlock(self); 88 | } 89 | [exportSession release]; 90 | exportSession = nil; 91 | }]; 92 | } 93 | 94 | - (void)importAsset:(NSURL*)assetURL toURL:(NSURL*)destURL completionBlock:(void (^)(TSLibraryImport* import))completionBlock { 95 | if (nil == assetURL || nil == destURL) 96 | @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"nil url" userInfo:nil]; 97 | if (![TSLibraryImport validIpodLibraryURL:assetURL]) 98 | @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"Invalid iPod Library URL: %@", assetURL] userInfo:nil]; 99 | 100 | if ([[NSFileManager defaultManager] fileExistsAtPath:[destURL path]]) 101 | @throw [NSException exceptionWithName:TSFileExistsError reason:[NSString stringWithFormat:@"File already exists at url: %@", destURL] userInfo:nil]; 102 | 103 | NSDictionary * options = [[NSDictionary alloc] init]; 104 | AVURLAsset* asset = [AVURLAsset URLAssetWithURL:assetURL options:options]; 105 | if (nil == asset) 106 | @throw [NSException exceptionWithName:TSUnknownError reason:[NSString stringWithFormat:@"Couldn't create AVURLAsset with url: %@", assetURL] userInfo:nil]; 107 | 108 | exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetPassthrough]; 109 | if (nil == exportSession) 110 | @throw [NSException exceptionWithName:TSUnknownError reason:@"Couldn't create AVAssetExportSession" userInfo:nil]; 111 | 112 | if ([[assetURL pathExtension] compare:@"mp3"] == NSOrderedSame) { 113 | [self doMp3ImportToFile:destURL completionBlock:completionBlock]; 114 | return; 115 | } 116 | 117 | exportSession.outputURL = destURL; 118 | 119 | // set the output file type appropriately based on asset URL extension 120 | if ([[assetURL pathExtension] compare:@"m4a"] == NSOrderedSame) { 121 | exportSession.outputFileType = AVFileTypeAppleM4A; 122 | } else if ([[assetURL pathExtension] compare:@"wav"] == NSOrderedSame) { 123 | exportSession.outputFileType = AVFileTypeWAVE; 124 | } else if ([[assetURL pathExtension] compare:@"aif"] == NSOrderedSame) { 125 | exportSession.outputFileType = AVFileTypeAIFF; 126 | } else { 127 | @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"unrecognized file extension" userInfo:nil]; 128 | } 129 | 130 | [exportSession exportAsynchronouslyWithCompletionHandler:^(void) { 131 | completionBlock(self); 132 | [exportSession release]; 133 | exportSession = nil; 134 | }]; 135 | } 136 | 137 | - (void)extractQuicktimeMovie:(NSURL*)movieURL toFile:(NSURL*)destURL { 138 | FILE* src = fopen([[movieURL path] cStringUsingEncoding:NSUTF8StringEncoding], "r"); 139 | if (NULL == src) { 140 | @throw [NSException exceptionWithName:TSUnknownError reason:@"Couldn't open source file" userInfo:nil]; 141 | return; 142 | } 143 | char atom_name[5]; 144 | atom_name[4] = '\0'; 145 | unsigned long atom_size = 0; 146 | while (true) { 147 | if (feof(src)) { 148 | break; 149 | } 150 | fread((void*)&atom_size, 4, 1, src); 151 | fread(atom_name, 4, 1, src); 152 | atom_size = ntohl(atom_size); 153 | const size_t bufferSize = 1024*100; 154 | if (strcmp("mdat", atom_name) == 0) { 155 | FILE* dst = fopen([[destURL path] cStringUsingEncoding:NSUTF8StringEncoding], "w"); 156 | unsigned char buf[bufferSize]; 157 | if (NULL == dst) { 158 | fclose(src); 159 | @throw [NSException exceptionWithName:TSUnknownError reason:@"Couldn't open destination file" userInfo:nil]; 160 | } 161 | // Thanks to Rolf Nilsson/Roni Music for pointing out the bug here: 162 | // Quicktime atom size field includes the 8 bytes of the header itself. 163 | atom_size -= 8; 164 | while (atom_size != 0) { 165 | size_t read_size = (bufferSize < atom_size)?bufferSize:atom_size; 166 | if (fread(buf, read_size, 1, src) == 1) { 167 | fwrite(buf, read_size, 1, dst); 168 | } 169 | atom_size -= read_size; 170 | } 171 | fclose(dst); 172 | fclose(src); 173 | return; 174 | } 175 | if (atom_size == 0) 176 | break; //0 atom size means to the end of file... if it's not the mdat chunk, we're done 177 | fseek(src, atom_size, SEEK_CUR); 178 | } 179 | fclose(src); 180 | @throw [NSException exceptionWithName:TSUnknownError reason:@"Didn't find mdat chunk" userInfo:nil]; 181 | } 182 | 183 | - (NSError*)error { 184 | if (movieFileErr) { 185 | return movieFileErr; 186 | } 187 | return exportSession.error; 188 | } 189 | 190 | - (AVAssetExportSessionStatus)status { 191 | if (movieFileErr) { 192 | return AVAssetExportSessionStatusFailed; 193 | } 194 | return exportSession.status; 195 | } 196 | 197 | - (float)progress { 198 | return exportSession.progress; 199 | } 200 | 201 | - (void)dealloc { 202 | [exportSession release]; 203 | [movieFileErr release]; 204 | [super dealloc]; 205 | } 206 | @end 207 | -------------------------------------------------------------------------------- /Classes/iPodLibraryAccessAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | //The MIT License 3 | // 4 | //Copyright (c) 2010 tapsquare, llc., (http://www.tapsquare.com, art@tapsquare.com) 5 | // 6 | //Permission is hereby granted, free of charge, to any person obtaining a copy 7 | //of this software and associated documentation files (the "Software"), to deal 8 | //in the Software without restriction, including without limitation the rights 9 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | //copies of the Software, and to permit persons to whom the Software is 11 | //furnished to do so, subject to the following conditions: 12 | // 13 | //The above copyright notice and this permission notice shall be included in 14 | //all copies or substantial portions of the Software. 15 | // 16 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | //THE SOFTWARE. 23 | // 24 | 25 | 26 | #import 27 | 28 | @class iPodLibraryAccessViewController; 29 | 30 | @interface iPodLibraryAccessAppDelegate : NSObject { 31 | UIWindow *window; 32 | iPodLibraryAccessViewController *viewController; 33 | } 34 | 35 | @property (nonatomic, retain) IBOutlet UIWindow *window; 36 | @property (nonatomic, retain) IBOutlet iPodLibraryAccessViewController *viewController; 37 | 38 | @end 39 | 40 | -------------------------------------------------------------------------------- /Classes/iPodLibraryAccessAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | //The MIT License 3 | // 4 | //Copyright (c) 2010 tapsquare, llc., (http://www.tapsquare.com, art@tapsquare.com) 5 | // 6 | //Permission is hereby granted, free of charge, to any person obtaining a copy 7 | //of this software and associated documentation files (the "Software"), to deal 8 | //in the Software without restriction, including without limitation the rights 9 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | //copies of the Software, and to permit persons to whom the Software is 11 | //furnished to do so, subject to the following conditions: 12 | // 13 | //The above copyright notice and this permission notice shall be included in 14 | //all copies or substantial portions of the Software. 15 | // 16 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | //THE SOFTWARE. 23 | // 24 | 25 | #import "iPodLibraryAccessAppDelegate.h" 26 | #import "iPodLibraryAccessViewController.h" 27 | #import 28 | 29 | @implementation iPodLibraryAccessAppDelegate 30 | 31 | @synthesize window; 32 | @synthesize viewController; 33 | 34 | 35 | #pragma mark - 36 | #pragma mark Application lifecycle 37 | 38 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 39 | 40 | // Override point for customization after application launch. 41 | 42 | // Add the view controller's view to the window and display. 43 | [window addSubview:viewController.view]; 44 | [window makeKeyAndVisible]; 45 | return YES; 46 | } 47 | 48 | 49 | - (void)applicationWillResignActive:(UIApplication *)application { 50 | /* 51 | Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 52 | Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 53 | */ 54 | } 55 | 56 | 57 | - (void)applicationDidEnterBackground:(UIApplication *)application { 58 | /* 59 | Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 60 | If your application supports background execution, called instead of applicationWillTerminate: when the user quits. 61 | */ 62 | } 63 | 64 | 65 | - (void)applicationWillEnterForeground:(UIApplication *)application { 66 | /* 67 | Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background. 68 | */ 69 | } 70 | 71 | 72 | - (void)applicationDidBecomeActive:(UIApplication *)application { 73 | /* 74 | Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 75 | */ 76 | } 77 | 78 | 79 | - (void)applicationWillTerminate:(UIApplication *)application { 80 | /* 81 | Called when the application is about to terminate. 82 | See also applicationDidEnterBackground:. 83 | */ 84 | } 85 | 86 | 87 | #pragma mark - 88 | #pragma mark Memory management 89 | 90 | - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application { 91 | /* 92 | Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later. 93 | */ 94 | } 95 | 96 | 97 | - (void)dealloc { 98 | [viewController release]; 99 | [window release]; 100 | [super dealloc]; 101 | } 102 | 103 | 104 | @end 105 | -------------------------------------------------------------------------------- /Classes/iPodLibraryAccessViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | //The MIT License 3 | // 4 | //Copyright (c) 2010 tapsquare, llc., (http://www.tapsquare.com, art@tapsquare.com) 5 | // 6 | //Permission is hereby granted, free of charge, to any person obtaining a copy 7 | //of this software and associated documentation files (the "Software"), to deal 8 | //in the Software without restriction, including without limitation the rights 9 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | //copies of the Software, and to permit persons to whom the Software is 11 | //furnished to do so, subject to the following conditions: 12 | // 13 | //The above copyright notice and this permission notice shall be included in 14 | //all copies or substantial portions of the Software. 15 | // 16 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | //THE SOFTWARE. 23 | // 24 | 25 | #import 26 | #import 27 | #import 28 | 29 | @interface iPodLibraryAccessViewController : UIViewController { 30 | IBOutlet UIProgressView* progressView; 31 | IBOutlet UILabel* elapsedLabel; 32 | NSTimeInterval startTime; 33 | AVPlayer* player; 34 | } 35 | 36 | - (IBAction)pickSong:(id)sender; 37 | - (void)exportAssetAtURL:(NSURL*)assetURL withTitle:(NSString*)title; 38 | 39 | @end 40 | 41 | -------------------------------------------------------------------------------- /Classes/iPodLibraryAccessViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | //The MIT License 3 | // 4 | //Copyright (c) 2010 tapsquare, llc., (http://www.tapsquare.com, art@tapsquare.com) 5 | // 6 | //Permission is hereby granted, free of charge, to any person obtaining a copy 7 | //of this software and associated documentation files (the "Software"), to deal 8 | //in the Software without restriction, including without limitation the rights 9 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | //copies of the Software, and to permit persons to whom the Software is 11 | //furnished to do so, subject to the following conditions: 12 | // 13 | //The above copyright notice and this permission notice shall be included in 14 | //all copies or substantial portions of the Software. 15 | // 16 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | //THE SOFTWARE. 23 | // 24 | 25 | #import "iPodLibraryAccessViewController.h" 26 | #import 27 | #import "TSLibraryImport.h" 28 | 29 | @implementation iPodLibraryAccessViewController 30 | 31 | - (void)viewDidLoad { 32 | 33 | [super viewDidLoad]; 34 | [progressView setProgress:0.f]; 35 | 36 | AVAudioSession* session = [AVAudioSession sharedInstance]; 37 | NSError* error = nil; 38 | if(![session setCategory:AVAudioSessionCategoryPlayback error:&error]) { 39 | NSLog(@"Couldn't set audio session category: %@", error); 40 | } 41 | if(![session setActive:YES error:&error]) { 42 | NSLog(@"Couldn't make audio session active: %@", error); 43 | } 44 | } 45 | 46 | - (void)progressTimer:(NSTimer*)timer { 47 | TSLibraryImport* export = (TSLibraryImport*)timer.userInfo; 48 | switch (export.status) { 49 | case AVAssetExportSessionStatusExporting: 50 | { 51 | NSTimeInterval delta = [NSDate timeIntervalSinceReferenceDate] - startTime; 52 | float minutes = rintf(delta/60.f); 53 | float seconds = rintf(fmodf(delta, 60.f)); 54 | [elapsedLabel setText:[NSString stringWithFormat:@"%2.0f:%02.0f", minutes, seconds]]; 55 | [progressView setProgress:export.progress]; 56 | break; 57 | } 58 | case AVAssetExportSessionStatusCancelled: 59 | case AVAssetExportSessionStatusCompleted: 60 | case AVAssetExportSessionStatusFailed: 61 | [timer invalidate]; 62 | break; 63 | default: 64 | break; 65 | } 66 | } 67 | 68 | - (void)exportAssetAtURL:(NSURL*)assetURL withTitle:(NSString*)title { 69 | 70 | // create destination URL 71 | NSString* ext = [TSLibraryImport extensionForAssetURL:assetURL]; 72 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 73 | NSString *documentsDirectory = [paths objectAtIndex:0]; 74 | NSURL* outURL = [[NSURL fileURLWithPath:[documentsDirectory stringByAppendingPathComponent:title]] URLByAppendingPathExtension:ext]; 75 | // we're responsible for making sure the destination url doesn't already exist 76 | [[NSFileManager defaultManager] removeItemAtURL:outURL error:nil]; 77 | 78 | // create the import object 79 | TSLibraryImport* import = [[TSLibraryImport alloc] init]; 80 | startTime = [NSDate timeIntervalSinceReferenceDate]; 81 | NSTimer* timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(progressTimer:) userInfo:import repeats:YES]; 82 | [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 83 | [import importAsset:assetURL toURL:outURL completionBlock:^(TSLibraryImport* import) { 84 | /* 85 | * If the export was successful (check the status and error properties of 86 | * the TSLibraryImport instance) you know have a local copy of the file 87 | * at `outURL` You can get PCM samples for processing by opening it with 88 | * ExtAudioFile. Yay! 89 | * 90 | * Here we're just playing it with AVPlayer 91 | */ 92 | if (import.status != AVAssetExportSessionStatusCompleted) { 93 | // something went wrong with the import 94 | NSLog(@"Error importing: %@", import.error); 95 | [import release]; 96 | import = nil; 97 | return; 98 | } 99 | 100 | // import completed 101 | [import release]; 102 | import = nil; 103 | if (!player) { 104 | player = [[AVPlayer alloc] initWithURL:outURL]; 105 | } else { 106 | [player pause]; 107 | [player replaceCurrentItemWithPlayerItem:[AVPlayerItem playerItemWithURL:outURL]]; 108 | } 109 | [player play]; 110 | }]; 111 | } 112 | 113 | - (void)mediaPicker:(MPMediaPickerController *)mediaPicker 114 | didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection { 115 | [self dismissModalViewControllerAnimated:YES]; 116 | for (MPMediaItem* item in mediaItemCollection.items) { 117 | NSString* title = [item valueForProperty:MPMediaItemPropertyTitle]; 118 | NSURL* assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; 119 | if (nil == assetURL) { 120 | /** 121 | * !!!: When MPMediaItemPropertyAssetURL is nil, it typically means the file 122 | * in question is protected by DRM. (old m4p files) 123 | */ 124 | return; 125 | } 126 | [self exportAssetAtURL:assetURL withTitle:title]; 127 | } 128 | } 129 | 130 | - (void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker { 131 | [self dismissModalViewControllerAnimated:YES]; 132 | } 133 | 134 | - (void)didReceiveMemoryWarning { 135 | // Releases the view if it doesn't have a superview. 136 | [super didReceiveMemoryWarning]; 137 | 138 | // Release any cached data, images, etc that aren't in use. 139 | } 140 | 141 | - (void)viewDidUnload { 142 | // Release any retained subviews of the main view. 143 | // e.g. self.myOutlet = nil; 144 | } 145 | 146 | - (void)showMediaPicker { 147 | /* 148 | * ???: Can we filter the media picker so we don't see m4p files? 149 | */ 150 | MPMediaPickerController* mediaPicker = [[[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic] autorelease]; 151 | mediaPicker.delegate = self; 152 | [self presentModalViewController:mediaPicker animated:YES]; 153 | } 154 | 155 | - (IBAction)pickSong:(id)sender { 156 | [self showMediaPicker]; 157 | } 158 | 159 | - (void)dealloc { 160 | [player release]; 161 | [progressView release]; 162 | [elapsedLabel release]; 163 | [super dealloc]; 164 | } 165 | 166 | @end 167 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | The MIT License 3 | 4 | Copyright (c) 2010 tapsquare, llc., (http://www.tapsquare.com, art@tapsquare.com) 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in 14 | all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | THE SOFTWARE. -------------------------------------------------------------------------------- /MainWindow.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1024 5 | 10D571 6 | 786 7 | 1038.29 8 | 460.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 112 12 | 13 | 14 | YES 15 | 16 | 17 | 18 | YES 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | YES 23 | 24 | YES 25 | 26 | 27 | YES 28 | 29 | 30 | 31 | YES 32 | 33 | IBFilesOwner 34 | IBCocoaTouchFramework 35 | 36 | 37 | IBFirstResponder 38 | IBCocoaTouchFramework 39 | 40 | 41 | IBCocoaTouchFramework 42 | 43 | 44 | iPodLibraryAccessViewController 45 | 46 | 47 | 1 48 | 49 | IBCocoaTouchFramework 50 | NO 51 | 52 | 53 | 54 | 292 55 | {320, 480} 56 | 57 | 1 58 | MSAxIDEAA 59 | 60 | NO 61 | NO 62 | 63 | IBCocoaTouchFramework 64 | YES 65 | 66 | 67 | 68 | 69 | YES 70 | 71 | 72 | delegate 73 | 74 | 75 | 76 | 4 77 | 78 | 79 | 80 | viewController 81 | 82 | 83 | 84 | 11 85 | 86 | 87 | 88 | window 89 | 90 | 91 | 92 | 14 93 | 94 | 95 | 96 | 97 | YES 98 | 99 | 0 100 | 101 | 102 | 103 | 104 | 105 | -1 106 | 107 | 108 | File's Owner 109 | 110 | 111 | 3 112 | 113 | 114 | iPodLibraryAccess App Delegate 115 | 116 | 117 | -2 118 | 119 | 120 | 121 | 122 | 10 123 | 124 | 125 | 126 | 127 | 12 128 | 129 | 130 | 131 | 132 | 133 | 134 | YES 135 | 136 | YES 137 | -1.CustomClassName 138 | -2.CustomClassName 139 | 10.CustomClassName 140 | 10.IBEditorWindowLastContentRect 141 | 10.IBPluginDependency 142 | 12.IBEditorWindowLastContentRect 143 | 12.IBPluginDependency 144 | 3.CustomClassName 145 | 3.IBPluginDependency 146 | 147 | 148 | YES 149 | UIApplication 150 | UIResponder 151 | iPodLibraryAccessViewController 152 | {{234, 376}, {320, 480}} 153 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 154 | {{525, 346}, {320, 480}} 155 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 156 | iPodLibraryAccessAppDelegate 157 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 158 | 159 | 160 | 161 | YES 162 | 163 | 164 | YES 165 | 166 | 167 | 168 | 169 | YES 170 | 171 | 172 | YES 173 | 174 | 175 | 176 | 15 177 | 178 | 179 | 180 | YES 181 | 182 | UIWindow 183 | UIView 184 | 185 | IBUserSource 186 | 187 | 188 | 189 | 190 | iPodLibraryAccessAppDelegate 191 | NSObject 192 | 193 | YES 194 | 195 | YES 196 | viewController 197 | window 198 | 199 | 200 | YES 201 | iPodLibraryAccessViewController 202 | UIWindow 203 | 204 | 205 | 206 | YES 207 | 208 | YES 209 | viewController 210 | window 211 | 212 | 213 | YES 214 | 215 | viewController 216 | iPodLibraryAccessViewController 217 | 218 | 219 | window 220 | UIWindow 221 | 222 | 223 | 224 | 225 | IBProjectSource 226 | Classes/iPodLibraryAccessAppDelegate.h 227 | 228 | 229 | 230 | iPodLibraryAccessAppDelegate 231 | NSObject 232 | 233 | IBUserSource 234 | 235 | 236 | 237 | 238 | iPodLibraryAccessViewController 239 | UIViewController 240 | 241 | IBProjectSource 242 | Classes/iPodLibraryAccessViewController.h 243 | 244 | 245 | 246 | 247 | YES 248 | 249 | NSObject 250 | 251 | IBFrameworkSource 252 | Foundation.framework/Headers/NSError.h 253 | 254 | 255 | 256 | NSObject 257 | 258 | IBFrameworkSource 259 | Foundation.framework/Headers/NSFileManager.h 260 | 261 | 262 | 263 | NSObject 264 | 265 | IBFrameworkSource 266 | Foundation.framework/Headers/NSKeyValueCoding.h 267 | 268 | 269 | 270 | NSObject 271 | 272 | IBFrameworkSource 273 | Foundation.framework/Headers/NSKeyValueObserving.h 274 | 275 | 276 | 277 | NSObject 278 | 279 | IBFrameworkSource 280 | Foundation.framework/Headers/NSKeyedArchiver.h 281 | 282 | 283 | 284 | NSObject 285 | 286 | IBFrameworkSource 287 | Foundation.framework/Headers/NSObject.h 288 | 289 | 290 | 291 | NSObject 292 | 293 | IBFrameworkSource 294 | Foundation.framework/Headers/NSRunLoop.h 295 | 296 | 297 | 298 | NSObject 299 | 300 | IBFrameworkSource 301 | Foundation.framework/Headers/NSThread.h 302 | 303 | 304 | 305 | NSObject 306 | 307 | IBFrameworkSource 308 | Foundation.framework/Headers/NSURL.h 309 | 310 | 311 | 312 | NSObject 313 | 314 | IBFrameworkSource 315 | Foundation.framework/Headers/NSURLConnection.h 316 | 317 | 318 | 319 | NSObject 320 | 321 | IBFrameworkSource 322 | UIKit.framework/Headers/UIAccessibility.h 323 | 324 | 325 | 326 | NSObject 327 | 328 | IBFrameworkSource 329 | UIKit.framework/Headers/UINibLoading.h 330 | 331 | 332 | 333 | NSObject 334 | 335 | IBFrameworkSource 336 | UIKit.framework/Headers/UIResponder.h 337 | 338 | 339 | 340 | UIApplication 341 | UIResponder 342 | 343 | IBFrameworkSource 344 | UIKit.framework/Headers/UIApplication.h 345 | 346 | 347 | 348 | UIResponder 349 | NSObject 350 | 351 | 352 | 353 | UISearchBar 354 | UIView 355 | 356 | IBFrameworkSource 357 | UIKit.framework/Headers/UISearchBar.h 358 | 359 | 360 | 361 | UISearchDisplayController 362 | NSObject 363 | 364 | IBFrameworkSource 365 | UIKit.framework/Headers/UISearchDisplayController.h 366 | 367 | 368 | 369 | UIView 370 | 371 | IBFrameworkSource 372 | UIKit.framework/Headers/UITextField.h 373 | 374 | 375 | 376 | UIView 377 | UIResponder 378 | 379 | IBFrameworkSource 380 | UIKit.framework/Headers/UIView.h 381 | 382 | 383 | 384 | UIViewController 385 | 386 | IBFrameworkSource 387 | UIKit.framework/Headers/UINavigationController.h 388 | 389 | 390 | 391 | UIViewController 392 | 393 | IBFrameworkSource 394 | UIKit.framework/Headers/UIPopoverController.h 395 | 396 | 397 | 398 | UIViewController 399 | 400 | IBFrameworkSource 401 | UIKit.framework/Headers/UISplitViewController.h 402 | 403 | 404 | 405 | UIViewController 406 | 407 | IBFrameworkSource 408 | UIKit.framework/Headers/UITabBarController.h 409 | 410 | 411 | 412 | UIViewController 413 | UIResponder 414 | 415 | IBFrameworkSource 416 | UIKit.framework/Headers/UIViewController.h 417 | 418 | 419 | 420 | UIWindow 421 | UIView 422 | 423 | IBFrameworkSource 424 | UIKit.framework/Headers/UIWindow.h 425 | 426 | 427 | 428 | 429 | 0 430 | IBCocoaTouchFramework 431 | 432 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 433 | 434 | 435 | 436 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 437 | 438 | 439 | YES 440 | iPodLibraryAccess.xcodeproj 441 | 3 442 | 112 443 | 444 | 445 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | TSLibraryImport 2 | =============== 3 | 4 | In iOS4, you're able to access to the raw audio data of files stored in the user's iPod Library, but the method isn't straightforward: You must first make a local copy of the file. And *that* isn't straightforward, either. To get a local copy you must use AVAssetExportSession with the passthrough preset, write the file to a QuickTime .mov file and then extract the audio data out of the .mov file to whatever container is appropriate. (Any other method involves an extremely lengthy transcode step.) 5 | 6 | The `TSLibraryImport` class hides this complexity behind a simple interface. 7 | 8 | Use 9 | --- 10 | 11 | Add `TSLibraryImport.h` and `TSLibraryImport.m` to your project. Make sure you also add `AVFoundation.framework` to your project. 12 | 13 | To import a file: 14 | 15 | MPMediaItem* item; //obtained using MediaPlayer.framework APIs 16 | NSURL* assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; 17 | NSURL* destinationURL ...; //file URL for the location you'd like to import the asset to. 18 | TSLibraryImport* import = [[TSLibraryImport alloc] init]; 19 | [import importAsset:assetURL toURL:outURL completionBlock:^(TSLibraryImport* import) { 20 | //check the status and error properties of 21 | //TSLibraryImport 22 | } 23 | -------------------------------------------------------------------------------- /Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.yourcompany.${PRODUCT_NAME:identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | APPL 15 | CFBundleSignature 16 | ???? 17 | CFBundleVersion 18 | 1.0 19 | NSMainNibFile 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Tests.m: -------------------------------------------------------------------------------- 1 | // 2 | // Tests.m 3 | // iPodLibraryAccess 4 | // 5 | // Created by Art Gillespie on 7/10/10. 6 | // Copyright 2010 tapsquare, llc. All rights reserved. 7 | // 8 | 9 | #import "GHUnit.h" 10 | #import "TSLibraryImport.h" 11 | 12 | @interface Tests : GHTestCase 13 | @end 14 | 15 | 16 | @implementation Tests 17 | - (BOOL)shouldRunOnMainThread { 18 | // By default NO, but if you have a UI test or test dependent on running on the main thread return YES 19 | return NO; 20 | } 21 | 22 | - (void)setUpClass { 23 | // Run at start of all tests in the class 24 | } 25 | 26 | - (void)tearDownClass { 27 | // Run at end of all tests in the class 28 | } 29 | 30 | - (void)setUp { 31 | // Run before each test method 32 | } 33 | 34 | - (void)tearDown { 35 | // Run after each test method 36 | } 37 | 38 | - (void)testInvalidURL { 39 | NSURL* badURL = [NSURL URLWithString:@"lame-scheme://item/lame.txt?id=1234"]; 40 | GHAssertThrowsSpecificNamed([TSLibraryImport extensionForAssetURL:badURL], NSException, NSInvalidArgumentException, @"extensionForAsset should throw NSInvalidArgumentException for %@", badURL); 41 | } 42 | 43 | - (void)testInvalidExtension { 44 | NSURL* badExtension = [NSURL URLWithString:@"ipod-library://item/item.moo?id=879187038471087"]; 45 | GHAssertThrowsSpecificNamed([TSLibraryImport extensionForAssetURL:badExtension], NSException, NSInvalidArgumentException, @"extension for Asset should throw NSInvalidArgumentException (unrecognized file extension) for %@", badExtension); 46 | } 47 | 48 | - (void)testExtensionParsing { 49 | // pulled these from my library using iOS 4. I imagine this url scheme could 50 | // change in the future, so will have to test against future versions of 51 | // SDK. 52 | 53 | // Note that the MPMediaItemAssetURL property returns nil for .m4p (DRM'ed) 54 | // files in the library 55 | 56 | // mp3 - ipod-library://item/item.mp3?id=1425010501608620615 57 | // m4a - ipod-library://item/item.m4a?id=-5920761218465604600 58 | // aif - ipod-library://item/item.aif?id=-3986756244970330071 59 | 60 | NSURL* mp3URL = [NSURL URLWithString:@"ipod-library://item/item.mp3?id=1425010501608620615"]; 61 | NSURL* m4aURL = [NSURL URLWithString:@"ipod-library://item/item.m4a?id=-5920761218465604600"]; 62 | NSURL* aifURL = [NSURL URLWithString:@"ipod-library://item/item.aif?id=-3986756244970330071"]; 63 | 64 | GHAssertEqualStrings(@"mp3", [TSLibraryImport extensionForAssetURL:mp3URL], @"mp3 extension incorrect: %@", [TSLibraryImport extensionForAssetURL:mp3URL]); 65 | GHAssertEqualStrings(@"m4a", [TSLibraryImport extensionForAssetURL:m4aURL], @"m4a extension incorrect: %@", [TSLibraryImport extensionForAssetURL:m4aURL]); 66 | GHAssertEqualStrings(@"aif", [TSLibraryImport extensionForAssetURL:aifURL], @"aif extension incorrect: %@", [TSLibraryImport extensionForAssetURL:aifURL]); 67 | } 68 | 69 | - (void)testExportNilParameters { 70 | TSLibraryImport* import = [[[TSLibraryImport alloc] init] autorelease]; 71 | NSURL* dummyURL = [NSURL URLWithString:@"ipod-library://item/item.mp3?id=1425010501608620615"]; 72 | GHAssertThrowsSpecificNamed([import importAsset:dummyURL toURL:nil completionBlock:nil], NSException, NSInvalidArgumentException, @"nil parameter should throw NSInvalidArgumentException"); 73 | GHAssertThrowsSpecificNamed([import importAsset:nil toURL:dummyURL completionBlock:nil], NSException, NSInvalidArgumentException, @"nil parameter should throw NSInvalidArgumentException"); 74 | } 75 | 76 | - (void)testExportInvalidURL { 77 | TSLibraryImport* import = [[[TSLibraryImport alloc] init] autorelease]; 78 | NSURL* badURL = [NSURL URLWithString:@"lame-scheme://item/lame.txt?id=1234"]; 79 | 80 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 81 | NSString *documentsDirectory = [paths objectAtIndex:0]; 82 | NSURL* outURL = [NSURL fileURLWithPath:[documentsDirectory stringByAppendingPathComponent:@"test.mov"]]; 83 | 84 | GHAssertThrowsSpecificNamed([import importAsset:badURL toURL:outURL completionBlock:nil], NSException, NSInvalidArgumentException, @"importAsset: should throw NSInvalidArgumentException for %@", badURL); 85 | } 86 | 87 | @end 88 | -------------------------------------------------------------------------------- /iPodLibraryAccess-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFile 12 | 13 | CFBundleIdentifier 14 | com.yourcompany.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | NSMainNibFile 28 | MainWindow 29 | 30 | 31 | -------------------------------------------------------------------------------- /iPodLibraryAccess.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 45; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1D3623260D0F684500981E51 /* iPodLibraryAccessAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* iPodLibraryAccessAppDelegate.m */; }; 11 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 12 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 13 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 14 | 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; 15 | 2899E5220DE3E06400AC0155 /* iPodLibraryAccessViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* iPodLibraryAccessViewController.xib */; }; 16 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; }; 17 | 28D7ACF80DDB3853001CB0EB /* iPodLibraryAccessViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* iPodLibraryAccessViewController.m */; }; 18 | C835DA3B11E8A6BD00702320 /* GHUnitIPhoneTestMain.m in Sources */ = {isa = PBXBuildFile; fileRef = C835DA2D11E8A68D00702320 /* GHUnitIPhoneTestMain.m */; }; 19 | C835DA3C11E8A6C300702320 /* TSLibraryImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C8AA498C11E7DA5C00CD2D6D /* TSLibraryImport.m */; }; 20 | C835DA4011E8A6E600702320 /* libGHUnitIPhone4_0.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C835DA3F11E8A6E600702320 /* libGHUnitIPhone4_0.a */; }; 21 | C835DA4411E8A71300702320 /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = C835DA4311E8A71300702320 /* Tests.m */; }; 22 | C835DA7611E8A85600702320 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 23 | C835DA7811E8A85C00702320 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; 24 | C835DA7A11E8A86300702320 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; }; 25 | C835DB7F11E8F77F00702320 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C85FFC6711C2D2E60037DE87 /* AVFoundation.framework */; }; 26 | C85FFC6811C2D2E60037DE87 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C85FFC6711C2D2E60037DE87 /* AVFoundation.framework */; }; 27 | C87D067411C2CB1C00819944 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C87D067311C2CB1C00819944 /* MediaPlayer.framework */; }; 28 | C8AA47C011E6708800CD2D6D /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = C8AA47BF11E6708800CD2D6D /* README.md */; }; 29 | C8AA498D11E7DA5C00CD2D6D /* TSLibraryImport.m in Sources */ = {isa = PBXBuildFile; fileRef = C8AA498C11E7DA5C00CD2D6D /* TSLibraryImport.m */; }; 30 | C8E0E92811CC18ED00B51EB5 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C8E0E92711CC18ED00B51EB5 /* CoreMedia.framework */; }; 31 | /* End PBXBuildFile section */ 32 | 33 | /* Begin PBXFileReference section */ 34 | 1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 35 | 1D3623240D0F684500981E51 /* iPodLibraryAccessAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPodLibraryAccessAppDelegate.h; sourceTree = ""; }; 36 | 1D3623250D0F684500981E51 /* iPodLibraryAccessAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iPodLibraryAccessAppDelegate.m; sourceTree = ""; }; 37 | 1D6058910D05DD3D006BFB54 /* iPodLibraryAccess.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPodLibraryAccess.app; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 39 | 288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 40 | 2899E5210DE3E06400AC0155 /* iPodLibraryAccessViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = iPodLibraryAccessViewController.xib; sourceTree = ""; }; 41 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = ""; }; 42 | 28D7ACF60DDB3853001CB0EB /* iPodLibraryAccessViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPodLibraryAccessViewController.h; sourceTree = ""; }; 43 | 28D7ACF70DDB3853001CB0EB /* iPodLibraryAccessViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iPodLibraryAccessViewController.m; sourceTree = ""; }; 44 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 45 | 32CA4F630368D1EE00C91783 /* iPodLibraryAccess_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPodLibraryAccess_Prefix.pch; sourceTree = ""; }; 46 | 8D1107310486CEB800E47090 /* iPodLibraryAccess-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "iPodLibraryAccess-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = ""; }; 47 | C835DA2011E8A68D00702320 /* GHAsyncTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHAsyncTestCase.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHAsyncTestCase.h"; sourceTree = SOURCE_ROOT; }; 48 | C835DA2111E8A68D00702320 /* GHTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHTest.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTest.h"; sourceTree = SOURCE_ROOT; }; 49 | C835DA2211E8A68D00702320 /* GHTest+JUnitXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "GHTest+JUnitXML.h"; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTest+JUnitXML.h"; sourceTree = SOURCE_ROOT; }; 50 | C835DA2311E8A68D00702320 /* GHTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHTestCase.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTestCase.h"; sourceTree = SOURCE_ROOT; }; 51 | C835DA2411E8A68D00702320 /* GHTestGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHTestGroup.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTestGroup.h"; sourceTree = SOURCE_ROOT; }; 52 | C835DA2511E8A68D00702320 /* GHTestGroup+JUnitXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "GHTestGroup+JUnitXML.h"; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTestGroup+JUnitXML.h"; sourceTree = SOURCE_ROOT; }; 53 | C835DA2611E8A68D00702320 /* GHTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHTesting.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTesting.h"; sourceTree = SOURCE_ROOT; }; 54 | C835DA2711E8A68D00702320 /* GHTestMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHTestMacros.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTestMacros.h"; sourceTree = SOURCE_ROOT; }; 55 | C835DA2811E8A68D00702320 /* GHTestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHTestOperation.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTestOperation.h"; sourceTree = SOURCE_ROOT; }; 56 | C835DA2911E8A68D00702320 /* GHTestRunner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHTestRunner.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTestRunner.h"; sourceTree = SOURCE_ROOT; }; 57 | C835DA2A11E8A68D00702320 /* GHTestSuite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHTestSuite.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHTestSuite.h"; sourceTree = SOURCE_ROOT; }; 58 | C835DA2B11E8A68D00702320 /* GHUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHUnit.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHUnit.h"; sourceTree = SOURCE_ROOT; }; 59 | C835DA2C11E8A68D00702320 /* GHUnitIPhoneAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHUnitIPhoneAppDelegate.h; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHUnitIPhoneAppDelegate.h"; sourceTree = SOURCE_ROOT; }; 60 | C835DA2D11E8A68D00702320 /* GHUnitIPhoneTestMain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHUnitIPhoneTestMain.m; path = "../../../iPhone/libGHUnitIPhone4_0-0/GHUnitIPhoneTestMain.m"; sourceTree = SOURCE_ROOT; }; 61 | C835DA2E11E8A68D00702320 /* NSException+GHTestFailureExceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSException+GHTestFailureExceptions.h"; path = "../../../iPhone/libGHUnitIPhone4_0-0/NSException+GHTestFailureExceptions.h"; sourceTree = SOURCE_ROOT; }; 62 | C835DA2F11E8A68D00702320 /* NSValue+GHValueFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSValue+GHValueFormatter.h"; path = "../../../iPhone/libGHUnitIPhone4_0-0/NSValue+GHValueFormatter.h"; sourceTree = SOURCE_ROOT; }; 63 | C835DA3511E8A6AD00702320 /* Tests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tests.app; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | C835DA3711E8A6AD00702320 /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 65 | C835DA3F11E8A6E600702320 /* libGHUnitIPhone4_0.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libGHUnitIPhone4_0.a; path = "../../../iPhone/libGHUnitIPhone4_0-0/libGHUnitIPhone4_0.a"; sourceTree = SOURCE_ROOT; }; 66 | C835DA4311E8A71300702320 /* Tests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = ""; }; 67 | C85FFC6711C2D2E60037DE87 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 68 | C87D067311C2CB1C00819944 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; 69 | C8AA47BF11E6708800CD2D6D /* README.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.md; sourceTree = ""; }; 70 | C8AA498B11E7DA5C00CD2D6D /* TSLibraryImport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSLibraryImport.h; sourceTree = ""; }; 71 | C8AA498C11E7DA5C00CD2D6D /* TSLibraryImport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSLibraryImport.m; sourceTree = ""; }; 72 | C8E0E92711CC18ED00B51EB5 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; 73 | C8E956B611EBAD5500398384 /* LICENSE.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.md; sourceTree = ""; }; 74 | /* End PBXFileReference section */ 75 | 76 | /* Begin PBXFrameworksBuildPhase section */ 77 | 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { 78 | isa = PBXFrameworksBuildPhase; 79 | buildActionMask = 2147483647; 80 | files = ( 81 | 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 82 | 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 83 | 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, 84 | C87D067411C2CB1C00819944 /* MediaPlayer.framework in Frameworks */, 85 | C85FFC6811C2D2E60037DE87 /* AVFoundation.framework in Frameworks */, 86 | C8E0E92811CC18ED00B51EB5 /* CoreMedia.framework in Frameworks */, 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | C835DA3311E8A6AD00702320 /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | C835DA4011E8A6E600702320 /* libGHUnitIPhone4_0.a in Frameworks */, 95 | C835DA7611E8A85600702320 /* Foundation.framework in Frameworks */, 96 | C835DA7811E8A85C00702320 /* UIKit.framework in Frameworks */, 97 | C835DA7A11E8A86300702320 /* CoreGraphics.framework in Frameworks */, 98 | C835DB7F11E8F77F00702320 /* AVFoundation.framework in Frameworks */, 99 | ); 100 | runOnlyForDeploymentPostprocessing = 0; 101 | }; 102 | /* End PBXFrameworksBuildPhase section */ 103 | 104 | /* Begin PBXGroup section */ 105 | 080E96DDFE201D6D7F000001 /* Classes */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 1D3623240D0F684500981E51 /* iPodLibraryAccessAppDelegate.h */, 109 | 1D3623250D0F684500981E51 /* iPodLibraryAccessAppDelegate.m */, 110 | 28D7ACF60DDB3853001CB0EB /* iPodLibraryAccessViewController.h */, 111 | 28D7ACF70DDB3853001CB0EB /* iPodLibraryAccessViewController.m */, 112 | C8AA498B11E7DA5C00CD2D6D /* TSLibraryImport.h */, 113 | C8AA498C11E7DA5C00CD2D6D /* TSLibraryImport.m */, 114 | ); 115 | path = Classes; 116 | sourceTree = ""; 117 | }; 118 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 1D6058910D05DD3D006BFB54 /* iPodLibraryAccess.app */, 122 | C835DA3511E8A6AD00702320 /* Tests.app */, 123 | ); 124 | name = Products; 125 | sourceTree = ""; 126 | }; 127 | 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | C8E956B611EBAD5500398384 /* LICENSE.md */, 131 | C8AA47BF11E6708800CD2D6D /* README.md */, 132 | 080E96DDFE201D6D7F000001 /* Classes */, 133 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 134 | 29B97317FDCFA39411CA2CEA /* Resources */, 135 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 136 | 19C28FACFE9D520D11CA2CBB /* Products */, 137 | C8AA49AF11E7DED900CD2D6D /* Tests */, 138 | ); 139 | name = CustomTemplate; 140 | sourceTree = ""; 141 | }; 142 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 143 | isa = PBXGroup; 144 | children = ( 145 | 32CA4F630368D1EE00C91783 /* iPodLibraryAccess_Prefix.pch */, 146 | 29B97316FDCFA39411CA2CEA /* main.m */, 147 | ); 148 | name = "Other Sources"; 149 | sourceTree = ""; 150 | }; 151 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | 2899E5210DE3E06400AC0155 /* iPodLibraryAccessViewController.xib */, 155 | 28AD733E0D9D9553002E5188 /* MainWindow.xib */, 156 | 8D1107310486CEB800E47090 /* iPodLibraryAccess-Info.plist */, 157 | ); 158 | name = Resources; 159 | sourceTree = ""; 160 | }; 161 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 162 | isa = PBXGroup; 163 | children = ( 164 | 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */, 165 | 1D30AB110D05D00D00671497 /* Foundation.framework */, 166 | 288765A40DF7441C002DB57D /* CoreGraphics.framework */, 167 | C87D067311C2CB1C00819944 /* MediaPlayer.framework */, 168 | C85FFC6711C2D2E60037DE87 /* AVFoundation.framework */, 169 | C8E0E92711CC18ED00B51EB5 /* CoreMedia.framework */, 170 | ); 171 | name = Frameworks; 172 | sourceTree = ""; 173 | }; 174 | C835DA1F11E8A66D00702320 /* GHUnit */ = { 175 | isa = PBXGroup; 176 | children = ( 177 | C835DA3F11E8A6E600702320 /* libGHUnitIPhone4_0.a */, 178 | C835DA2011E8A68D00702320 /* GHAsyncTestCase.h */, 179 | C835DA2111E8A68D00702320 /* GHTest.h */, 180 | C835DA2211E8A68D00702320 /* GHTest+JUnitXML.h */, 181 | C835DA2311E8A68D00702320 /* GHTestCase.h */, 182 | C835DA2411E8A68D00702320 /* GHTestGroup.h */, 183 | C835DA2511E8A68D00702320 /* GHTestGroup+JUnitXML.h */, 184 | C835DA2611E8A68D00702320 /* GHTesting.h */, 185 | C835DA2711E8A68D00702320 /* GHTestMacros.h */, 186 | C835DA2811E8A68D00702320 /* GHTestOperation.h */, 187 | C835DA2911E8A68D00702320 /* GHTestRunner.h */, 188 | C835DA2A11E8A68D00702320 /* GHTestSuite.h */, 189 | C835DA2B11E8A68D00702320 /* GHUnit.h */, 190 | C835DA2C11E8A68D00702320 /* GHUnitIPhoneAppDelegate.h */, 191 | C835DA2D11E8A68D00702320 /* GHUnitIPhoneTestMain.m */, 192 | C835DA2E11E8A68D00702320 /* NSException+GHTestFailureExceptions.h */, 193 | C835DA2F11E8A68D00702320 /* NSValue+GHValueFormatter.h */, 194 | ); 195 | name = GHUnit; 196 | sourceTree = ""; 197 | }; 198 | C8AA49AF11E7DED900CD2D6D /* Tests */ = { 199 | isa = PBXGroup; 200 | children = ( 201 | C835DA3711E8A6AD00702320 /* Tests-Info.plist */, 202 | C835DA1F11E8A66D00702320 /* GHUnit */, 203 | C835DA4311E8A71300702320 /* Tests.m */, 204 | ); 205 | name = Tests; 206 | sourceTree = ""; 207 | }; 208 | /* End PBXGroup section */ 209 | 210 | /* Begin PBXNativeTarget section */ 211 | 1D6058900D05DD3D006BFB54 /* iPodLibraryAccess */ = { 212 | isa = PBXNativeTarget; 213 | buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "iPodLibraryAccess" */; 214 | buildPhases = ( 215 | 1D60588D0D05DD3D006BFB54 /* Resources */, 216 | 1D60588E0D05DD3D006BFB54 /* Sources */, 217 | 1D60588F0D05DD3D006BFB54 /* Frameworks */, 218 | ); 219 | buildRules = ( 220 | ); 221 | dependencies = ( 222 | ); 223 | name = iPodLibraryAccess; 224 | productName = iPodLibraryAccess; 225 | productReference = 1D6058910D05DD3D006BFB54 /* iPodLibraryAccess.app */; 226 | productType = "com.apple.product-type.application"; 227 | }; 228 | C835DA3411E8A6AD00702320 /* Tests */ = { 229 | isa = PBXNativeTarget; 230 | buildConfigurationList = C835DA3A11E8A6AE00702320 /* Build configuration list for PBXNativeTarget "Tests" */; 231 | buildPhases = ( 232 | C835DA3111E8A6AD00702320 /* Resources */, 233 | C835DA3211E8A6AD00702320 /* Sources */, 234 | C835DA3311E8A6AD00702320 /* Frameworks */, 235 | ); 236 | buildRules = ( 237 | ); 238 | dependencies = ( 239 | ); 240 | name = Tests; 241 | productName = Tests; 242 | productReference = C835DA3511E8A6AD00702320 /* Tests.app */; 243 | productType = "com.apple.product-type.application"; 244 | }; 245 | /* End PBXNativeTarget section */ 246 | 247 | /* Begin PBXProject section */ 248 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 249 | isa = PBXProject; 250 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "iPodLibraryAccess" */; 251 | compatibilityVersion = "Xcode 3.1"; 252 | developmentRegion = English; 253 | hasScannedForEncodings = 1; 254 | knownRegions = ( 255 | English, 256 | Japanese, 257 | French, 258 | German, 259 | ); 260 | mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; 261 | projectDirPath = ""; 262 | projectRoot = ""; 263 | targets = ( 264 | 1D6058900D05DD3D006BFB54 /* iPodLibraryAccess */, 265 | C835DA3411E8A6AD00702320 /* Tests */, 266 | ); 267 | }; 268 | /* End PBXProject section */ 269 | 270 | /* Begin PBXResourcesBuildPhase section */ 271 | 1D60588D0D05DD3D006BFB54 /* Resources */ = { 272 | isa = PBXResourcesBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 276 | 2899E5220DE3E06400AC0155 /* iPodLibraryAccessViewController.xib in Resources */, 277 | C8AA47C011E6708800CD2D6D /* README.md in Resources */, 278 | ); 279 | runOnlyForDeploymentPostprocessing = 0; 280 | }; 281 | C835DA3111E8A6AD00702320 /* Resources */ = { 282 | isa = PBXResourcesBuildPhase; 283 | buildActionMask = 2147483647; 284 | files = ( 285 | ); 286 | runOnlyForDeploymentPostprocessing = 0; 287 | }; 288 | /* End PBXResourcesBuildPhase section */ 289 | 290 | /* Begin PBXSourcesBuildPhase section */ 291 | 1D60588E0D05DD3D006BFB54 /* Sources */ = { 292 | isa = PBXSourcesBuildPhase; 293 | buildActionMask = 2147483647; 294 | files = ( 295 | 1D60589B0D05DD56006BFB54 /* main.m in Sources */, 296 | 1D3623260D0F684500981E51 /* iPodLibraryAccessAppDelegate.m in Sources */, 297 | 28D7ACF80DDB3853001CB0EB /* iPodLibraryAccessViewController.m in Sources */, 298 | C8AA498D11E7DA5C00CD2D6D /* TSLibraryImport.m in Sources */, 299 | ); 300 | runOnlyForDeploymentPostprocessing = 0; 301 | }; 302 | C835DA3211E8A6AD00702320 /* Sources */ = { 303 | isa = PBXSourcesBuildPhase; 304 | buildActionMask = 2147483647; 305 | files = ( 306 | C835DA3B11E8A6BD00702320 /* GHUnitIPhoneTestMain.m in Sources */, 307 | C835DA3C11E8A6C300702320 /* TSLibraryImport.m in Sources */, 308 | C835DA4411E8A71300702320 /* Tests.m in Sources */, 309 | ); 310 | runOnlyForDeploymentPostprocessing = 0; 311 | }; 312 | /* End PBXSourcesBuildPhase section */ 313 | 314 | /* Begin XCBuildConfiguration section */ 315 | 1D6058940D05DD3E006BFB54 /* Debug */ = { 316 | isa = XCBuildConfiguration; 317 | buildSettings = { 318 | ALWAYS_SEARCH_USER_PATHS = NO; 319 | COPY_PHASE_STRIP = NO; 320 | GCC_DYNAMIC_NO_PIC = NO; 321 | GCC_OPTIMIZATION_LEVEL = 0; 322 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 323 | GCC_PREFIX_HEADER = iPodLibraryAccess_Prefix.pch; 324 | INFOPLIST_FILE = "iPodLibraryAccess-Info.plist"; 325 | IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; 326 | PRODUCT_NAME = iPodLibraryAccess; 327 | SDKROOT = iphoneos; 328 | }; 329 | name = Debug; 330 | }; 331 | 1D6058950D05DD3E006BFB54 /* Release */ = { 332 | isa = XCBuildConfiguration; 333 | buildSettings = { 334 | ALWAYS_SEARCH_USER_PATHS = NO; 335 | COPY_PHASE_STRIP = YES; 336 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 337 | GCC_PREFIX_HEADER = iPodLibraryAccess_Prefix.pch; 338 | INFOPLIST_FILE = "iPodLibraryAccess-Info.plist"; 339 | PRODUCT_NAME = iPodLibraryAccess; 340 | SDKROOT = iphoneos; 341 | VALIDATE_PRODUCT = YES; 342 | }; 343 | name = Release; 344 | }; 345 | C01FCF4F08A954540054247B /* Debug */ = { 346 | isa = XCBuildConfiguration; 347 | buildSettings = { 348 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 349 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 350 | GCC_C_LANGUAGE_STANDARD = c99; 351 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 352 | GCC_WARN_UNUSED_VARIABLE = YES; 353 | PREBINDING = NO; 354 | SDKROOT = iphoneos; 355 | }; 356 | name = Debug; 357 | }; 358 | C01FCF5008A954540054247B /* Release */ = { 359 | isa = XCBuildConfiguration; 360 | buildSettings = { 361 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 362 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 363 | GCC_C_LANGUAGE_STANDARD = c99; 364 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 365 | GCC_WARN_UNUSED_VARIABLE = YES; 366 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 367 | PREBINDING = NO; 368 | SDKROOT = iphoneos4.0; 369 | }; 370 | name = Release; 371 | }; 372 | C835DA3811E8A6AE00702320 /* Debug */ = { 373 | isa = XCBuildConfiguration; 374 | buildSettings = { 375 | ALWAYS_SEARCH_USER_PATHS = NO; 376 | CODE_SIGN_IDENTITY = "iPhone Developer"; 377 | COPY_PHASE_STRIP = NO; 378 | GCC_DYNAMIC_NO_PIC = NO; 379 | GCC_OPTIMIZATION_LEVEL = 0; 380 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 381 | GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/UIKit.framework/Headers/UIKit.h"; 382 | INFOPLIST_FILE = "Tests-Info.plist"; 383 | INSTALL_PATH = "$(HOME)/Applications"; 384 | LIBRARY_SEARCH_PATHS = ( 385 | "$(inherited)", 386 | "\"$(SRCROOT)/../../../iPhone/libGHUnitIPhone4_0-0\"", 387 | ); 388 | OTHER_LDFLAGS = ( 389 | "-framework", 390 | Foundation, 391 | "-framework", 392 | UIKit, 393 | "-all_load", 394 | "-ObjC", 395 | ); 396 | PREBINDING = NO; 397 | PRODUCT_NAME = Tests; 398 | SDKROOT = iphoneos; 399 | }; 400 | name = Debug; 401 | }; 402 | C835DA3911E8A6AE00702320 /* Release */ = { 403 | isa = XCBuildConfiguration; 404 | buildSettings = { 405 | ALWAYS_SEARCH_USER_PATHS = NO; 406 | CODE_SIGN_IDENTITY = "iPhone Developer"; 407 | COPY_PHASE_STRIP = YES; 408 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 409 | GCC_ENABLE_FIX_AND_CONTINUE = NO; 410 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 411 | GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/UIKit.framework/Headers/UIKit.h"; 412 | INFOPLIST_FILE = "Tests-Info.plist"; 413 | INSTALL_PATH = "$(HOME)/Applications"; 414 | LIBRARY_SEARCH_PATHS = ( 415 | "$(inherited)", 416 | "\"$(SRCROOT)/../../../iPhone/libGHUnitIPhone4_0-0\"", 417 | ); 418 | OTHER_LDFLAGS = ( 419 | "-framework", 420 | Foundation, 421 | "-framework", 422 | UIKit, 423 | ); 424 | PREBINDING = NO; 425 | PRODUCT_NAME = Tests; 426 | SDKROOT = iphoneos; 427 | ZERO_LINK = NO; 428 | }; 429 | name = Release; 430 | }; 431 | /* End XCBuildConfiguration section */ 432 | 433 | /* Begin XCConfigurationList section */ 434 | 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "iPodLibraryAccess" */ = { 435 | isa = XCConfigurationList; 436 | buildConfigurations = ( 437 | 1D6058940D05DD3E006BFB54 /* Debug */, 438 | 1D6058950D05DD3E006BFB54 /* Release */, 439 | ); 440 | defaultConfigurationIsVisible = 0; 441 | defaultConfigurationName = Release; 442 | }; 443 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "iPodLibraryAccess" */ = { 444 | isa = XCConfigurationList; 445 | buildConfigurations = ( 446 | C01FCF4F08A954540054247B /* Debug */, 447 | C01FCF5008A954540054247B /* Release */, 448 | ); 449 | defaultConfigurationIsVisible = 0; 450 | defaultConfigurationName = Release; 451 | }; 452 | C835DA3A11E8A6AE00702320 /* Build configuration list for PBXNativeTarget "Tests" */ = { 453 | isa = XCConfigurationList; 454 | buildConfigurations = ( 455 | C835DA3811E8A6AE00702320 /* Debug */, 456 | C835DA3911E8A6AE00702320 /* Release */, 457 | ); 458 | defaultConfigurationIsVisible = 0; 459 | defaultConfigurationName = Release; 460 | }; 461 | /* End XCConfigurationList section */ 462 | }; 463 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 464 | } 465 | -------------------------------------------------------------------------------- /iPodLibraryAccessViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1024 5 | 10D573 6 | 788 7 | 1038.29 8 | 460.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 117 12 | 13 | 14 | YES 15 | 16 | 17 | 18 | YES 19 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 20 | 21 | 22 | YES 23 | 24 | YES 25 | 26 | 27 | YES 28 | 29 | 30 | 31 | YES 32 | 33 | IBFilesOwner 34 | IBCocoaTouchFramework 35 | 36 | 37 | IBFirstResponder 38 | IBCocoaTouchFramework 39 | 40 | 41 | 42 | 274 43 | 44 | YES 45 | 46 | 47 | 292 48 | {{203, 403}, {97, 37}} 49 | 50 | NO 51 | IBCocoaTouchFramework 52 | 0 53 | 0 54 | 55 | Helvetica-Bold 56 | 15 57 | 16 58 | 59 | 1 60 | Pick Song 61 | 62 | 3 63 | MQA 64 | 65 | 66 | 1 67 | MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 68 | 69 | 70 | 3 71 | MC41AA 72 | 73 | 74 | 75 | 76 | 292 77 | {{20, 62}, {280, 9}} 78 | 79 | NO 80 | IBCocoaTouchFramework 81 | 0.5 82 | 83 | 84 | 85 | 292 86 | {{119, 79}, {62, 21}} 87 | 88 | NO 89 | YES 90 | 7 91 | NO 92 | IBCocoaTouchFramework 93 | 0:00 94 | 95 | 1 96 | MCAwIDAAA 97 | 98 | 99 | 1 100 | 10 101 | 2 102 | 103 | 104 | {320, 460} 105 | 106 | 107 | 3 108 | MC43NQA 109 | 110 | 2 111 | 112 | 113 | NO 114 | 115 | IBCocoaTouchFramework 116 | 117 | 118 | 119 | 120 | YES 121 | 122 | 123 | view 124 | 125 | 126 | 127 | 7 128 | 129 | 130 | 131 | pickSong: 132 | 133 | 134 | 7 135 | 136 | 9 137 | 138 | 139 | 140 | progressView 141 | 142 | 143 | 144 | 11 145 | 146 | 147 | 148 | elapsedLabel 149 | 150 | 151 | 152 | 13 153 | 154 | 155 | 156 | 157 | YES 158 | 159 | 0 160 | 161 | 162 | 163 | 164 | 165 | -1 166 | 167 | 168 | File's Owner 169 | 170 | 171 | -2 172 | 173 | 174 | 175 | 176 | 6 177 | 178 | 179 | YES 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 8 188 | 189 | 190 | 191 | 192 | 10 193 | 194 | 195 | 196 | 197 | 12 198 | 199 | 200 | 201 | 202 | 203 | 204 | YES 205 | 206 | YES 207 | -1.CustomClassName 208 | -2.CustomClassName 209 | 10.IBPluginDependency 210 | 12.IBPluginDependency 211 | 6.IBEditorWindowLastContentRect 212 | 6.IBPluginDependency 213 | 8.IBPluginDependency 214 | 215 | 216 | YES 217 | iPodLibraryAccessViewController 218 | UIResponder 219 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 220 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 221 | {{899, 676}, {320, 480}} 222 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 223 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 224 | 225 | 226 | 227 | YES 228 | 229 | 230 | YES 231 | 232 | 233 | 234 | 235 | YES 236 | 237 | 238 | YES 239 | 240 | 241 | 242 | 13 243 | 244 | 245 | 246 | YES 247 | 248 | iPodLibraryAccessViewController 249 | UIViewController 250 | 251 | pickSong: 252 | id 253 | 254 | 255 | pickSong: 256 | 257 | pickSong: 258 | id 259 | 260 | 261 | 262 | YES 263 | 264 | YES 265 | elapsedLabel 266 | progressView 267 | 268 | 269 | YES 270 | UILabel 271 | UIProgressView 272 | 273 | 274 | 275 | YES 276 | 277 | YES 278 | elapsedLabel 279 | progressView 280 | 281 | 282 | YES 283 | 284 | elapsedLabel 285 | UILabel 286 | 287 | 288 | progressView 289 | UIProgressView 290 | 291 | 292 | 293 | 294 | IBProjectSource 295 | Classes/iPodLibraryAccessViewController.h 296 | 297 | 298 | 299 | 300 | YES 301 | 302 | NSObject 303 | 304 | IBFrameworkSource 305 | Foundation.framework/Headers/NSError.h 306 | 307 | 308 | 309 | NSObject 310 | 311 | IBFrameworkSource 312 | Foundation.framework/Headers/NSFileManager.h 313 | 314 | 315 | 316 | NSObject 317 | 318 | IBFrameworkSource 319 | Foundation.framework/Headers/NSKeyValueCoding.h 320 | 321 | 322 | 323 | NSObject 324 | 325 | IBFrameworkSource 326 | Foundation.framework/Headers/NSKeyValueObserving.h 327 | 328 | 329 | 330 | NSObject 331 | 332 | IBFrameworkSource 333 | Foundation.framework/Headers/NSKeyedArchiver.h 334 | 335 | 336 | 337 | NSObject 338 | 339 | IBFrameworkSource 340 | Foundation.framework/Headers/NSObject.h 341 | 342 | 343 | 344 | NSObject 345 | 346 | IBFrameworkSource 347 | Foundation.framework/Headers/NSRunLoop.h 348 | 349 | 350 | 351 | NSObject 352 | 353 | IBFrameworkSource 354 | Foundation.framework/Headers/NSThread.h 355 | 356 | 357 | 358 | NSObject 359 | 360 | IBFrameworkSource 361 | Foundation.framework/Headers/NSURL.h 362 | 363 | 364 | 365 | NSObject 366 | 367 | IBFrameworkSource 368 | Foundation.framework/Headers/NSURLConnection.h 369 | 370 | 371 | 372 | NSObject 373 | 374 | IBFrameworkSource 375 | UIKit.framework/Headers/UIAccessibility.h 376 | 377 | 378 | 379 | NSObject 380 | 381 | IBFrameworkSource 382 | UIKit.framework/Headers/UINibLoading.h 383 | 384 | 385 | 386 | NSObject 387 | 388 | IBFrameworkSource 389 | UIKit.framework/Headers/UIResponder.h 390 | 391 | 392 | 393 | UIButton 394 | UIControl 395 | 396 | IBFrameworkSource 397 | UIKit.framework/Headers/UIButton.h 398 | 399 | 400 | 401 | UIControl 402 | UIView 403 | 404 | IBFrameworkSource 405 | UIKit.framework/Headers/UIControl.h 406 | 407 | 408 | 409 | UILabel 410 | UIView 411 | 412 | IBFrameworkSource 413 | UIKit.framework/Headers/UILabel.h 414 | 415 | 416 | 417 | UIProgressView 418 | UIView 419 | 420 | IBFrameworkSource 421 | UIKit.framework/Headers/UIProgressView.h 422 | 423 | 424 | 425 | UIResponder 426 | NSObject 427 | 428 | 429 | 430 | UISearchBar 431 | UIView 432 | 433 | IBFrameworkSource 434 | UIKit.framework/Headers/UISearchBar.h 435 | 436 | 437 | 438 | UISearchDisplayController 439 | NSObject 440 | 441 | IBFrameworkSource 442 | UIKit.framework/Headers/UISearchDisplayController.h 443 | 444 | 445 | 446 | UIView 447 | 448 | IBFrameworkSource 449 | UIKit.framework/Headers/UITextField.h 450 | 451 | 452 | 453 | UIView 454 | UIResponder 455 | 456 | IBFrameworkSource 457 | UIKit.framework/Headers/UIView.h 458 | 459 | 460 | 461 | UIViewController 462 | 463 | IBFrameworkSource 464 | MediaPlayer.framework/Headers/MPMoviePlayerViewController.h 465 | 466 | 467 | 468 | UIViewController 469 | 470 | IBFrameworkSource 471 | UIKit.framework/Headers/UINavigationController.h 472 | 473 | 474 | 475 | UIViewController 476 | 477 | IBFrameworkSource 478 | UIKit.framework/Headers/UIPopoverController.h 479 | 480 | 481 | 482 | UIViewController 483 | 484 | IBFrameworkSource 485 | UIKit.framework/Headers/UISplitViewController.h 486 | 487 | 488 | 489 | UIViewController 490 | 491 | IBFrameworkSource 492 | UIKit.framework/Headers/UITabBarController.h 493 | 494 | 495 | 496 | UIViewController 497 | UIResponder 498 | 499 | IBFrameworkSource 500 | UIKit.framework/Headers/UIViewController.h 501 | 502 | 503 | 504 | 505 | 0 506 | IBCocoaTouchFramework 507 | 508 | com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS 509 | 510 | 511 | 512 | com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 513 | 514 | 515 | YES 516 | iPodLibraryAccess.xcodeproj 517 | 3 518 | 117 519 | 520 | 521 | -------------------------------------------------------------------------------- /iPodLibraryAccess_Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'iPodLibraryAccess' target in the 'iPodLibraryAccess' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /main.m: -------------------------------------------------------------------------------- 1 | // 2 | //The MIT License 3 | // 4 | //Copyright (c) 2010 tapsquare, llc., (http://www.tapsquare.com, art@tapsquare.com) 5 | // 6 | //Permission is hereby granted, free of charge, to any person obtaining a copy 7 | //of this software and associated documentation files (the "Software"), to deal 8 | //in the Software without restriction, including without limitation the rights 9 | //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | //copies of the Software, and to permit persons to whom the Software is 11 | //furnished to do so, subject to the following conditions: 12 | // 13 | //The above copyright notice and this permission notice shall be included in 14 | //all copies or substantial portions of the Software. 15 | // 16 | //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | //THE SOFTWARE. 23 | // 24 | 25 | #import 26 | 27 | int main(int argc, char *argv[]) { 28 | 29 | NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 30 | int retVal = UIApplicationMain(argc, argv, nil, nil); 31 | [pool release]; 32 | return retVal; 33 | } 34 | -------------------------------------------------------------------------------- /quicktime_parse/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | int main () { 5 | FILE* f = fopen("test.mov", "r"); 6 | uint32_t atom_size; 7 | char buf[5]; 8 | buf[4] = '\0'; 9 | int numAtoms = 5; 10 | while (numAtoms--) { 11 | fread((void*)&atom_size, 4, 1, f); 12 | atom_size = ntohl(atom_size); 13 | fread(buf, 4, 1, f); 14 | if (strcmp(buf, "mdat") == 0) { 15 | uint32_t i = 0; 16 | for (; i < atom_size; i+=4) { 17 | fread(buf, 4, 1, f); 18 | fwrite(buf, 4, 1, stdout); 19 | } 20 | return; 21 | } 22 | fseek(f, atom_size, SEEK_CUR); 23 | if(atom_size == 0) 24 | break; 25 | } 26 | fclose(f); 27 | } 28 | -------------------------------------------------------------------------------- /quicktime_parse/test.mov: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tapsquare/TSLibraryImport/0eb4fdeb5e21f5d41d8cc336e70c797ebf076b2f/quicktime_parse/test.mov --------------------------------------------------------------------------------