-
Notifications
You must be signed in to change notification settings - Fork 0
/
lib_darwin.m
110 lines (91 loc) · 2.02 KB
/
lib_darwin.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#import <Cocoa/Cocoa.h>
@class AudioQueue;
@interface AudioQueue : NSObject < NSSoundDelegate >
{
NSSound* activeSound;
NSThread* runLoopThread;
}
- (void)playSound:(NSSound *)sound;
@end
@implementation AudioQueue
- (id)init
{
self = [super init];
if (self != nil)
{
activeSound = nil;
runLoopThread = [[NSThread alloc] initWithTarget:self selector:@selector(runLoop) object:nil];
[runLoopThread start];
}
return self;
}
- (void)runLoop
{
//
// Run loops will exit if they have no sources. We add a dummy NSPort object
// to the run loop so it will run until we call CFRunLoopStop().
//
NSPort *dummyPort = [[NSMachPort alloc] init];
[[NSRunLoop currentRunLoop]
addPort:dummyPort
forMode:NSDefaultRunLoopMode];
CFRunLoopRun();
[[NSRunLoop currentRunLoop]
removePort:dummyPort
forMode:NSDefaultRunLoopMode];
[dummyPort release];
}
- (void)sound:(NSSound *)sound didFinishPlaying:(BOOL)aBool
{
if (sound == activeSound) {
[activeSound release];
activeSound = nil;
}
}
- (void)playSound:(NSSound *)sound
{
[self
performSelector:@selector(queueSound:)
onThread:runLoopThread
withObject:sound
waitUntilDone:NO];
}
- (void)queueSound:(NSSound *)sound
{
if (activeSound != nil) {
[activeSound stop];
[activeSound release];
}
activeSound = sound;
[activeSound setDelegate:self];
[activeSound play];
}
- (void)dealloc
{
[runLoopThread release];
runLoopThread = nil;
[activeSound release];
activeSound = nil;
[super dealloc];
}
@end
////////////////////////////////////////////////////////////////////////////////
static AudioQueue* audioQueue;
void basicsound_init()
{
audioQueue = [[AudioQueue alloc] init];
}
void basicsound_play(const char* filename, int loop)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSSound* sound = [[NSSound alloc]
initWithContentsOfFile: [NSString stringWithUTF8String: filename]
byReference: YES];
[sound setLoops: (BOOL)loop];
[audioQueue playSound:sound];
[pool drain];
}
void basicsound_stop()
{
[audioQueue playSound:nil];
}