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;
[_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;
- (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];
CALayer* selected = [_timeLineController getSelectLayer];
ElisLayer* layer = [selected valueForKey:@"ElisLayer"];
+ layer.media = nil;
[layers removeObject:layer];
[selected removeFromSuperlayer];
[_timeLineController removeSelectLayer];
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"];
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];
- (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