2017-02-04 7 views
0

Я создаю приложение, которое предполагает уведомить некоторые события. Имеет звуковое уведомление и уведомление NSView/HUD.NSSound перестает работать через несколько часов

В процессе отладки я продолжал работать в течение нескольких часов. Я заметил, что через несколько часов 8+ 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 от Apple, :(.

Использование 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 дней и, похоже, работает так, как ожидалось! –

 Смежные вопросы

  • Нет связанных вопросов^_^