OSDN Git Service

0.2.1
[eliscolors/main.git] / ElisController.m
index 9105c02..1073753 100644 (file)
@@ -49,14 +49,15 @@ static float convertQTTimeToSecond(QTTime t)
     ProjectMovieSize = CGRectMake(0, 0, 640, 480);
     
     // カスタムフィルタを初期化。
-    [ElisCustomFilter class];
+//    [ElisCustomFilter class];
     
     NSLog(@"Building effects ...");
     // エフェクトメニューを構築。
     [self buildEffectMenu];
     
-    // テキストフィールドでリッチテキスト編集を許可する。
-//    [_textLayerField setAllowsEditingTextAttributes:YES];
+    // Quartz Composerのデフォルト再生時間を変更。
+    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+    [defaults setInteger:60*10 forKey:@"QuartzComposerDefaultMovieDuration"];
     
     timeLineXShift = 0;
     usingStampMode = NO;
@@ -149,16 +150,26 @@ static float convertQTTimeToSecond(QTTime t)
     [_tableController reload];
     
     // GCD使ってみたら画面がちらつく。どういうことなの...?
+    // [array addObject] ってどう見てもクリティカルセッションだった。
 #ifdef __SNOW_LEOPARD_GCD__
+    void** temp = malloc(sizeof(void*) * 128);
+    memset(temp, 0, sizeof(void*)*128);
+    
     dispatch_apply(size, diq, ^(size_t i) {
         ElisLayer* l = [layers objectAtIndex:i];
         if([l isInclude:qttime]){
             if(playing) [l play];
-            [layerSet addObject:l];
+//            [layerSet addObject:l];
+            temp[i] = l;
         }else{
             if(playing) [l stop];
         }
     });
+    
+    int i;
+    for(i = 0; i < 128; i++)
+        if(temp[i] != 0) [layerSet addObject:temp[i]];
+    free(temp);
 #else
     // GCDなりOpenMPなりで並列化すること。
     int i;
@@ -253,6 +264,15 @@ static float convertQTTimeToSecond(QTTime t)
 - (void)moveSliderTo:(QTTime)time
 {
     float now = convertQTTimeToSecond(time);
+    [self performSelectorOnMainThread:@selector(moveSliderOnThread:) withObject:[NSNumber numberWithFloat:now] waitUntilDone:NO];
+//    [timeSlider setFloatValue:now/hipTime];
+//    [timeCodeField setStringValue:QTStringFromTime(QTMakeTime(now * DEFAULT_FPS, DEFAULT_FPS))];
+//    [_timeLineController movePlaybackBar:now*timeLineScale];
+}
+
+- (void)moveSliderOnThread:(NSNumber*)nowv
+{
+    float now = [nowv floatValue];
     [timeSlider setFloatValue:now/hipTime];
     [timeCodeField setStringValue:QTStringFromTime(QTMakeTime(now * DEFAULT_FPS, DEFAULT_FPS))];
     [_timeLineController movePlaybackBar:now*timeLineScale];
@@ -296,6 +316,7 @@ static float convertQTTimeToSecond(QTTime t)
     CALayer* selected = [_timeLineController getSelectLayer];
     ElisLayer* layer = [selected valueForKey:@"ElisLayer"];
     
+    layer.media = nil;
     [layers removeObject:layer];
     [selected removeFromSuperlayer];
     [_timeLineController removeSelectLayer];
@@ -456,6 +477,8 @@ static float convertQTTimeToSecond(QTTime t)
     float w, h;
     
     [_timeLineController awakeFromNib]; // これはひどい。
+    NSString* version = [decoder decodeObjectForKey:@"version"];
+    if([version compare:ELIS_VERSION] > 0) return;
     layers = [decoder decodeObjectForKey:@"layers"];
     w = [decoder decodeFloatForKey:@"movieWidth"];
     h = [decoder decodeFloatForKey:@"movieHeight"];
@@ -530,9 +553,17 @@ static float convertQTTimeToSecond(QTTime t)
     if([menuItem action] == @selector(cutLayerAtCurrentTime:))
         return [_timeLineController canDeleteLayer];
     
+    if([menuItem action] == @selector(effectMenuPushed:))
+        return [self canAddEffect];
+    
     return YES;
 }
 
+- (BOOL)canAddEffect
+{
+    return ![[[[[_timeLineController getSelectLayer] valueForKey:@"ElisLayer"] media] type] isEqualToString:@"sound"];
+}
+
 - (IBAction)rewriteProject:(id)sender
 {
     NSMutableData* data = [NSMutableData data];
@@ -701,8 +732,25 @@ static float convertQTTimeToSecond(QTTime t)
 
 - (IBAction)playStop:(id)sender
 {
+    [[NSGarbageCollector defaultCollector] collectExhaustively];
     if(playing) [self stopPlay:nil];
     else [self startPlay:nil];
 }
 
+- (NSMutableArray*)writeAudioFiles
+{
+    NSMutableArray* paths = [[NSMutableArray alloc] init];
+    int i, size = [layers count];
+    for(i = 0; i < size; i++){
+        if([[[[layers objectAtIndex:i] media] type] isEqualToString:@"sound"]){
+            ElisAudioWriter* w = [[ElisAudioWriter alloc] initWithLayer:[layers objectAtIndex:i]];
+            NSString* outPath = [NSString stringWithFormat:@"/tmp/%d.wav", i];
+            [w writeToFile:outPath];
+            [paths addObject:outPath];
+        }
+    }
+    
+    return paths;
+}
+
 @end