我正在构建一个假设通知某些事件的应用。 它有声音通知和NSView / HUD通知。
调试时,我已经让它运行了几个小时。我注意到,经过几个小时后,NSSound停止发出声音。
我的代码很简单,并且在最初的几个小时内有效:
它来自:
void onStateUpdate(void* context) {
NSSound* myAwesomeSound = [NSSound soundNamed:existingSoundFile];
if (myAwesomeSound == nil)
NSLog(@"\n\nERROR FINDING SOUND!!!?!?!\n\n");
else
NSLog(@"Code is being called!");
[myAwesomeSound play];
[myVisualHUD start];
}
通过注册CFRunLoopSource来调用:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
mRunLoopSource = (CFRunLoopSourceRef)IOPSNotificationCreateRunLoopSource(onStateUpdate, (__bridge void *)(self));
if(mRunLoopSource) {
CFRunLoopAddSource(CFRunLoopGetCurrent(), mRunLoopSource, kCFRunLoopDefaultMode);
}
}
此代码附带HUD代码和报告事件的NSLog。 所以我知道它实际上按预期运行但操作系统只是“静音”#34;或忽略NSSound,因为它没有失败。
我做错了什么?我怎样才能让它继续工作,因为这最终会变成一个带通知的托盘应用程序。
答案 0 :(得分:1)
所以读完一些帖子,比如this。
我不敢说NSSound是Apple的另一个混合结果API:(。
使用AudioToolbox是可行的方法。 到目前为止看起来一直在下班后继续工作。
这是一段代码片段(有点丑陋但有关使用情况的自我解释):
NSString *audioFileName = @"MyResourceFileName";
NSURL *audioURLRef = [[NSBundle mainBundle] URLForResource:audioFileName
withExtension:@"mp3"];
SystemSoundID audioFileId = 0;
AudioServicesCreateSystemSoundID(
(__bridge CFURLRef) audioURLRef,
&audioFileId
);
// Plays the audio file using AudioServices...
AudioServicesPlaySystemSound(audioFileId);