NSSound在几个小时后停止工作

时间:2017-02-04 09:53:23

标签: objective-c macos cocoa

我正在构建一个假设通知某些事件的应用。 它有声音通知和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,因为它没有失败。

我做错了什么?我怎样才能让它继续工作,因为这最终会变成一个带通知的托盘应用程序。

1 个答案:

答案 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);
  • 请记住导入AudioToolbox / AudioToolbox.h并导入IOKit / IOKitLib.h(对于iOS,我认为它是IOKit / UIKit.h,并且包括框架......