cmake: supernova - missing include_directories() for Jack
[supercollider.git] / server / scsynth / iPhone / iSCSynthController.mm
blobe0b160cdcf5d190a9b8128d188c45ee3f7929759
1 //
2 //  iSCSynthController.m
3 //  iscsynth
4 //
5 //  Created by Axel Balley on 21/10/08.
6 //  Copyright 2008 __MyCompanyName__. All rights reserved.
7 //
9 #import <AudioToolbox/AudioToolbox.h>
10 #import "iSCSynthAppDelegate.h"
11 #import "iSCSynthController.h"
13 #include "SC_Graph.h"
14 #include "SC_GraphDef.h"
15 #include "SC_Prototypes.h"
16 #include "SC_Node.h"
17 #include "SC_DirUtils.h"
19 static iSCSynthController* theController = 0;
21 int vpost(const char *fmt, va_list ap)
23         char buf[512];
24         vsnprintf(buf, sizeof(buf), fmt, ap);
26         if (theController) [theController log:[NSString stringWithCString:buf encoding:NSASCIIStringEncoding]];
27         return 0;
30 @implementation iSCSynthController
32 - (id) init
34         if (!theController && (self=[super init]))
35         {
36                 options = kDefaultWorldOptions;
37                 options.mBufLength = 1024;
38                 timer = 0;
39                 world = 0;
40                 lastNodeID = 1000;
41                 
42                 unsigned long route = kAudioSessionOverrideAudioRoute_None;
43                 AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(route), &route);
45                 SetPrintFunc(vpost);
46                 theController = self;
47         }
48         
49         return self;
52 - (void) awakeFromNib
54         NSFileManager *manager = [NSFileManager defaultManager];
55         CFBundleRef bundle = CFBundleGetMainBundle();
56         CFURLRef url = CFBundleCopyBundleURL(bundle);
57         CFStringRef s = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
58         CFRelease(url);
59         
60         NSError *error; 
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])
66         {
67                 NSString *from = [s stringByAppendingString:@"/synthdefs"];
68                 if ([manager fileExistsAtPath:from])
69                 {
70                         [manager copyItemAtPath:from toPath:dir error:&error];
71                 }               
72         }
73         CFRelease(s);
76         [logView setFont:[[logView font] fontWithSize:9.0f]]; 
77         [logView setTextColor:[UIColor blueColor]];
78         
79         [synthdefsViewController setRoot:dir];
80         [synthdefsViewController setTarget:self withSelector:@selector(selectSynthdef:)];
81         
82         [speakerSwitch setOn:NO];
83         [freeAllButton setHidden:YES];
84                         
85 #if !TARGET_IPHONE_SIMULATOR
86         [self start];
87 #endif  
90 - (void) start
92         if (world) World_Cleanup(world);
93         world = World_New(&options);
94         if (!world || !World_OpenUDP(world, 57110)) return;
95         
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];
101 - (void) stop
103         if (world) World_Cleanup(world);
104         world = 0;
105         if (timer) [timer invalidate];
106         timer = 0;
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]];
128         
129         [freeAllButton setHidden:(BOOL)(!world->mNumGraphs)];
132 - (IBAction) toggleState:(id)sender
133 {       
134         /*
135         if (world) [self stop];
136         else [self start];
137         */
140 - (IBAction) toggleSpeaker:(id)sender
141 {       
142         UISwitch *s = (UISwitch *) sender;
143         UInt32 route;
144         if (s.on) route = kAudioSessionOverrideAudioRoute_Speaker;
145         else route = kAudioSessionOverrideAudioRoute_None;
146         AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(route), &route);
149 - (IBAction) triggerFreeAll:(id)sender
151         [self freeAllNodes];
154 - (void) selectSynthdef:(NSString *)string
156         char defpath[256];
157         [string getCString:defpath maxLength:256 encoding:NSASCIIStringEncoding];
158                                 
159         GraphDef *def = GraphDef_Load(world, defpath, 0);
160         if (!def) return;
161         Group *group = World_GetGroup(world, 0);
162         Graph *graph = 0;
163         int data = 0;
164         sc_msg_iter msg(0,(char *) &data);
165         Graph_New(world, def, lastNodeID++, &msg, &graph);
166         if (graph && group)
167         {
168                 Group_AddTail(group, &graph->mNode);
169                 Node_StateMsg(&graph->mNode, kNode_Go);
170         }       
173 - (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
175         if (viewController==logViewController)
176         {
177                 [logView flashScrollIndicators];
178         }
179         else if (viewController==synthdefsViewController)
180         {
181                 [synthdefsViewController flashScrollIndicators];
182         }
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];
198 - (void) dealloc
200         if (world) [self stop];
201         
202         [super dealloc];        
205 @end