2017-02-04 10 views
0

Ich erstelle eine App, die einige Ereignisse melden soll. Es hat akustische Benachrichtigung und NSView/HUD-Benachrichtigung.NSSound funktioniert nach einigen Stunden nicht mehr

Während des Debuggens habe ich es stundenlang laufen lassen. Ich habe bemerkt, dass nach einigen Stunden 8+ der NSSound aufhört Geräusche zu machen.

Mein Code ist einfach und funktioniert während der ersten paar Stunden:

Aus läuft:

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]; 

} 

, die von durch die Registrierung CFRunLoopSource genannt wird:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
     mRunLoopSource = (CFRunLoopSourceRef)IOPSNotificationCreateRunLoopSource(onStateUpdate, (__bridge void *)(self)); 
     if(mRunLoopSource) { 
      CFRunLoopAddSource(CFRunLoopGetCurrent(), mRunLoopSource, kCFRunLoopDefaultMode); 
     } 
} 

Dieser Code ist Kommen mit HUD-Code und NSLog von gemeldeten Ereignissen. So weiß ich, dass es tatsächlich wie erwartet ausgeführt wird, aber das Betriebssystem "stumm" einfach oder ignoriert den NSSound, da es nicht fehlschlägt.

Was mache ich falsch? Wie kann ich dafür sorgen, dass es weiterhin funktioniert, da dies zu einer Tablet-App mit Benachrichtigungen wird?

+0

Können Sie den Code zeigen, wie Sie dies aufrufen? – rocky

+0

Ich habe meine Frage mit mehr Code-Schnipsel aktualisiert. Es gibt natürlich eine CFRelease sobald die App heruntergefahren wird. –

Antwort

1

So nach dem Lesen einiger Threads wie this.

Ich fürchte NSSound zu sagen ist ein weiterer Misch Ergebnis API von Apple :(.

AudioToolbox Mit dem Weg zu gehen. Und so weit sieht, dass nach der Arbeit hält.

Hier ist ein Code-Schnipsel (ein wenig hässlich, aber selbsterklärend über die Nutzung):

  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); 
  • Denken Sie daran, AudioToolbox/AudioToolbox.h und Import IOKit/IOKitLib zu importieren. h (für iOS ich denke, es ist IOKit/UIKit.h und natürlich gehören das Framework ...
+0

Ja, ich hatte keine Probleme mit NSSound; Es hat viele Bugs und scheint in jeder OS X-Version verschiedene Bugs mit unterschiedlichen Problemumgehungen zu haben. Es ist großartig, diese Problemumgehung zu haben, danke. – bhaller

+1

Ich freue mich sagen zu können, dass ich das jetzt seit 2 Tagen getestet habe und es scheint zu funktionieren wie erwartet! –

Verwandte Themen