2 // iSCSynthController.m
5 // Created by Axel Balley on 21/10/08.
6 // Copyright 2008 __MyCompanyName__. All rights reserved.
9 #import <AudioToolbox/AudioToolbox.h>
10 #import "iSCSynthAppDelegate.h"
11 #import "iSCSynthController.h"
14 #include "SC_GraphDef.h"
15 #include "SC_Prototypes.h"
17 #include "SC_DirUtils.h"
19 static iSCSynthController* theController = 0;
21 int vpost(const char *fmt, va_list ap)
24 vsnprintf(buf, sizeof(buf), fmt, ap);
26 if (theController) [theController log:[NSString stringWithCString:buf encoding:NSASCIIStringEncoding]];
30 @implementation iSCSynthController
34 if (!theController && (self=[super init]))
36 options = kDefaultWorldOptions;
37 options.mBufLength = 1024;
42 unsigned long route = kAudioSessionOverrideAudioRoute_None;
43 AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(route), &route);
54 NSFileManager *manager = [NSFileManager defaultManager];
55 CFBundleRef bundle = CFBundleGetMainBundle();
56 CFURLRef url = CFBundleCopyBundleURL(bundle);
57 CFStringRef s = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
61 char supportpath[256];
62 sc_GetUserAppSupportDirectory(supportpath, 256);
63 NSString *support = [NSString stringWithCString:supportpath encoding:NSASCIIStringEncoding];
64 NSString *dir = [support stringByAppendingString:@"/synthdefs"];
65 if (![manager fileExistsAtPath:dir])
67 NSString *from = [s stringByAppendingString:@"/synthdefs"];
68 if ([manager fileExistsAtPath:from])
70 [manager copyItemAtPath:from toPath:dir error:&error];
76 [logView setFont:[[logView font] fontWithSize:9.0f]];
77 [logView setTextColor:[UIColor blueColor]];
79 [synthdefsViewController setRoot:dir];
80 [synthdefsViewController setTarget:self withSelector:@selector(selectSynthdef:)];
82 [speakerSwitch setOn:NO];
83 [freeAllButton setHidden:YES];
85 #if !TARGET_IPHONE_SIMULATOR
92 if (world) World_Cleanup(world);
93 world = World_New(&options);
94 if (!world || !World_OpenUDP(world, 57110)) return;
96 timer = [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(update:) userInfo:nil repeats:YES];
97 //if (!toggle.on) [toggle setOn:YES animated:YES];
98 //[toggle setTitle:@"Stop" forState:UIControlStateNormal|UIControlStateHighlighted|UIControlStateSelected];
103 if (world) World_Cleanup(world);
105 if (timer) [timer invalidate];
107 //[toggle setTitle:@"Start" forState:UIControlStateNormal|UIControlStateHighlighted|UIControlStateSelected];
108 //if (toggle.on) [toggle setOn:NO animated:YES];
109 [avgCPULabel setText:@"0.0"];
110 [peakCPULabel setText:@"0.0"];
113 - (void) freeAllNodes
115 //World_FreeAllGraphDefs(world);
116 Group *group = World_GetGroup(world, 0);
117 Group_DeleteAll(group);
120 - (void) update:(NSTimer *)timer
122 double avgCPU = world->hw->mAudioDriver->GetAvgCPU();
123 [avgCPULabel setText:[NSString stringWithFormat:@"%.1f",avgCPU]];
124 double peakCPU = world->hw->mAudioDriver->GetPeakCPU();
125 [peakCPULabel setText:[NSString stringWithFormat:@"%.1f",peakCPU]];
126 [synthsLabel setText:[NSString stringWithFormat:@"%d",world->mNumGraphs]];
127 [ugensLabel setText:[NSString stringWithFormat:@"%d",world->mNumUnits]];
129 [freeAllButton setHidden:(BOOL)(!world->mNumGraphs)];
132 - (IBAction) toggleState:(id)sender
135 if (world) [self stop];
140 - (IBAction) toggleSpeaker:(id)sender
142 UISwitch *s = (UISwitch *) sender;
144 if (s.on) route = kAudioSessionOverrideAudioRoute_Speaker;
145 else route = kAudioSessionOverrideAudioRoute_None;
146 AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(route), &route);
149 - (IBAction) triggerFreeAll:(id)sender
154 - (void) selectSynthdef:(NSString *)string
157 [string getCString:defpath maxLength:256 encoding:NSASCIIStringEncoding];
159 GraphDef *def = GraphDef_Load(world, defpath, 0);
161 Group *group = World_GetGroup(world, 0);
164 sc_msg_iter msg(0,(char *) &data);
165 Graph_New(world, def, lastNodeID++, &msg, &graph);
168 Group_AddTail(group, &graph->mNode);
169 Node_StateMsg(&graph->mNode, kNode_Go);
173 - (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
175 if (viewController==logViewController)
177 [logView flashScrollIndicators];
179 else if (viewController==synthdefsViewController)
181 [synthdefsViewController flashScrollIndicators];
185 - (void) log:(NSString *)string
187 NSString *s = [logView text];
188 NSString *s2 = [s stringByAppendingString:string];
189 [logView setText:s2];
191 int len = [s2 length];
192 if (len) [logView scrollRangeToVisible:NSMakeRange(len-1, 0)];
194 int offset = [logView contentSize].height - [logView bounds].size.height;
195 if (offset>=0) [logView setContentOffset:CGPointMake(0,offset) animated:NO];
200 if (world) [self stop];