Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/Classes/MDObjects.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 60 - (show annotations) (download)
Wed May 4 05:49:49 2016 UTC (8 years ago) by toshinagata1964
File size: 6691 byte(s)
The build script is modified so that the copyright description is updated on Deployment build.
1 //
2 // MDObjects.m
3 //
4 // Created by Toshi Nagata on Mon Mar 04 2002.
5 /*
6 Copyright (c) 2000-2016 Toshi Nagata. All rights reserved.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation version 2 of the License.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 */
17
18 #import "MDObjects.h"
19
20 @implementation MDEventObject
21
22 - (id)init
23 {
24 self = [super init];
25 position = 0;
26 MDEventInit(&event);
27 return self;
28 }
29
30 - (id)initWithMDEvent: (const MDEvent *)ep
31 {
32 self = [super init];
33 position = 0;
34 if (ep != NULL)
35 MDEventCopy(&event, ep, 1);
36 else
37 MDEventInit(&event);
38 return self;
39 }
40
41 - (void)dealloc
42 {
43 MDEventClear(&event);
44 [super dealloc];
45 }
46
47 - (MDEvent *)eventPtr
48 {
49 return &event;
50 }
51
52 @end
53
54 @implementation MDTrackObject
55
56 - (id)init
57 {
58 self = [super init];
59 track = MDTrackNew();
60 if (track == NULL) {
61 [self release];
62 return nil;
63 }
64 return self;
65 }
66
67 - (id)initWithMDTrack: (MDTrack *)inTrack
68 {
69 self = [super init];
70 track = inTrack;
71 MDTrackRetain(track);
72 return self;
73 }
74
75 - (void)dealloc
76 {
77 MDTrackRelease(track);
78 [super dealloc];
79 }
80
81 - (MDTrack *)track
82 {
83 return track;
84 }
85 @end
86
87 @implementation IntGroupObject
88
89 - (id)init
90 {
91 self = [super init];
92 pointSet = IntGroupNew();
93 if (pointSet == NULL) {
94 [self release];
95 return nil;
96 }
97 return self;
98 }
99
100 - (id)initWithMDPointSet: (IntGroup *)inPointSet
101 {
102 self = [super init];
103 pointSet = inPointSet;
104 IntGroupRetain(pointSet);
105 return self;
106 }
107
108 - (void)dealloc
109 {
110 IntGroupRelease(pointSet);
111 [super dealloc];
112 }
113
114 - (IntGroup *)pointSet
115 {
116 return pointSet;
117 }
118
119 @end
120
121 @implementation MDSelectionObject
122
123 - (id)init
124 {
125 self = [super init];
126 if (self != nil) {
127 startTick = endTick = kMDNegativeTick;
128 track = NULL;
129 }
130 return self;
131 }
132
133 - (id)initWithMDPointSet: (IntGroup *)inPointSet
134 {
135 self = [super initWithMDPointSet: inPointSet];
136 if (self != nil) {
137 startTick = endTick = kMDNegativeTick;
138 track = NULL;
139 isEndOfTrackSelected = NO;
140 }
141 return self;
142 }
143
144 - (BOOL)getStartTick: (MDTickType *)startTickPtr andEndTick: (MDTickType *)endTickPtr withMDTrack: (MDTrack *)inTrack
145 {
146 if (startTick < 0 || endTick < 0 || track != inTrack) {
147 int idx = -1;
148 MDEvent *ep;
149 MDPointer *ptr = MDPointerNew(inTrack);
150 if (ptr == NULL)
151 return NO;
152 startTick = endTick = kMDNegativeTick;
153 while ((ep = MDPointerForwardWithPointSet(ptr, pointSet, &idx)) != NULL) {
154 MDTickType tick1 = MDGetTick(ep);
155 if (startTick < 0)
156 startTick = endTick = tick1;
157 if (MDHasDuration(ep)) {
158 MDTickType tick2 = tick1 + MDGetDuration(ep);
159 if (tick2 > endTick)
160 endTick = tick2;
161 } else if (tick1 > endTick) {
162 endTick = tick1;
163 }
164 }
165 MDPointerRelease(ptr);
166 if (isEndOfTrackSelected) {
167 MDTickType trackDuration = MDTrackGetDuration(inTrack);
168 if (startTick == kMDNegativeTick)
169 startTick = trackDuration;
170 if (endTick < trackDuration)
171 endTick = trackDuration;
172 }
173 if (startTick >= 0)
174 track = inTrack;
175 else track = NULL;
176 }
177 *startTickPtr = startTick;
178 *endTickPtr = endTick;
179 return YES;
180 }
181
182 @end
183
184 @implementation MDTickRangeObject
185
186 - (id)initWithStartTick: (MDTickType)tick1 endTick: (MDTickType)tick2
187 {
188 self = [super init];
189 if (self != nil) {
190 startTick = tick1;
191 endTick = tick2;
192 }
193 return self;
194 }
195
196 @end
197
198 static void
199 addControlNameToMenu(int code, NSMenu *menu, id target, SEL action, int tagOffset)
200 {
201 MDEvent event;
202 char name[64];
203 NSMenuItem *item;
204 MDEventInit(&event);
205 MDSetKind(&event, kMDEventControl);
206 MDSetCode(&event, (code & 0x7f));
207 MDEventToKindString(&event, name, sizeof name);
208 [menu addItemWithTitle: [NSString stringWithUTF8String: name + 1] // Chop the "*" at the top
209 action: action keyEquivalent: @""];
210 item = (NSMenuItem *)[menu itemAtIndex: [menu numberOfItems] - 1];
211 [item setTag: (code & 0x7f) + tagOffset];
212 [item setTarget: target];
213 }
214
215 NSMenu *
216 MDMenuWithControlNames(id target, SEL action, int tagOffset)
217 {
218 static unsigned char sControlTopMenuCodes[] = { 1, 7, 10, 11, 64, 71, 72, 73, 74 };
219 int i, j;
220 NSMenu *submenu, *menu;
221 menu = [[[NSMenu alloc] initWithTitle: @"Control names"] autorelease];
222 for (i = 0; i < sizeof(sControlTopMenuCodes) / sizeof(sControlTopMenuCodes[0]); i++)
223 addControlNameToMenu(sControlTopMenuCodes[i], menu, target, action, tagOffset);
224 for (i = 0; i < 127; i++) {
225 if (i % 32 == 0) {
226 [menu addItemWithTitle: [NSString stringWithFormat: @"%d-%d", i, i + 31]
227 action: nil keyEquivalent: @""];
228 submenu = [[[NSMenu alloc] initWithTitle: @""] autorelease];
229 [[menu itemAtIndex: [menu numberOfItems] - 1]
230 setSubmenu: submenu];
231 }
232 for (j = sizeof(sControlTopMenuCodes) / sizeof(sControlTopMenuCodes[0]) - 1; j >= 0; j--) {
233 if (i == sControlTopMenuCodes[j])
234 break;
235 }
236 if (j < 0)
237 addControlNameToMenu(i, submenu, target, action, tagOffset);
238 }
239 return menu;
240 }
241
242 static void
243 addMetaNameToMenu(int code, NSMenu *menu, id target, SEL action, int tagOffset)
244 {
245 MDEvent event;
246 char name[64];
247 NSMenuItem *item;
248 MDEventInit(&event);
249 MDSetKind(&event, MDEventSMFMetaNumberToEventKind(code));
250 MDSetCode(&event, code);
251 MDEventToKindString(&event, name, sizeof name);
252 [menu addItemWithTitle: [NSString stringWithUTF8String: name + 1] // Chop the "@" at the top
253 action: action keyEquivalent: @""];
254 item = (NSMenuItem *)[menu itemAtIndex: [menu numberOfItems] - 1];
255 [item setTag: (code & 0x7f) + tagOffset];
256 [item setTarget: target];
257 }
258
259 NSMenu *
260 MDMenuWithMetaNames(id target, SEL action, int tagOffset)
261 {
262 static unsigned char sMetaTopMenuCodes[] = {
263 kMDMetaTempo, kMDMetaSMPTE, kMDMetaTimeSignature, kMDMetaKey,
264 kMDMetaLyric, kMDMetaMarker, kMDMetaCuePoint,
265 kMDMetaPortNumber
266 };
267 int i, j;
268 NSMenu *submenu, *menu;
269 menu = [[[NSMenu alloc] initWithTitle: @"Meta event names"] autorelease];
270 for (i = 0; i < sizeof(sMetaTopMenuCodes) / sizeof(sMetaTopMenuCodes[0]); i++)
271 addMetaNameToMenu(sMetaTopMenuCodes[i], menu, target, action, tagOffset);
272 for (i = 0; i < 127; i++) {
273 if (i % 32 == 0) {
274 [menu addItemWithTitle: [NSString stringWithFormat: @"%d-%d", i, i + 31]
275 action: nil keyEquivalent: @""];
276 submenu = [[[NSMenu alloc] initWithTitle: @""] autorelease];
277 [[menu itemAtIndex: [menu numberOfItems] - 1]
278 setSubmenu: submenu];
279 }
280 for (j = sizeof(sMetaTopMenuCodes) / sizeof(sMetaTopMenuCodes[0]) - 1; j >= 0; j--) {
281 if (i == sMetaTopMenuCodes[j])
282 break;
283 }
284 if (j < 0)
285 addMetaNameToMenu(i, submenu, target, action, tagOffset);
286 }
287 return menu;
288 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26