2017-02-04 51 views
0

我正在構建一個應用程序,以便通知某些事件。 它有聲音通知和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應用程序正在關閉。 –

回答

1

所以讀完一些線程後,如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天,現在看起來像預期的那樣工作! –