NSSound在几个小时后停止工作

问题描述:

我正在构建一个应用程序,以便通知某些事件。 它有声音通知和NSView/HUD通知。NSSound在几个小时后停止工作

在调试过程中,我一直在运行几个小时。我注意到几个小时后,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的报道事件。 因此,我知道它实际上按预期运行,但操作系统只是“静音”或忽略NSSound,因为它没有失败。

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

+0

你可以显示代码如何调用它吗? – rocky

+0

我用更多的代码片段更新了我的问题。当然有一个CFRelease应用程序正在关闭。 –

所以读完一些线程后,如this

我不敢说NSSound是从苹果:(另一混合型结果的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并且当然包括框架...
+0

是的,我对NSSound没有任何问题;它有大量的错误,并且在每个OS X版本中似乎都有不同的错误和不同的解决方法。很高兴有这个解决方法,谢谢。 – bhaller

+1

我很高兴地说我已经测试了2天,现在看起来像预期的那样工作! –