2015-07-17 22 views
26

burada belgelere göre ben çok AudioQueue imha true kullanmak https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/AudioQueueReference/#//apple_ref/c/func/AudioQueueDisposeAudioQueueDispose gecikme

err = AudioQueueDispose(queue, true); 

, hemen gerçekleşir cihaz. err = AudioQueueStop(queue, true) da aynı soruna sahiptir.

Benim anlayış her iki işlevi zaten tampon salınımlı temizlemek için denemek ve yaklaşık ...
ben bile çağrılacak gidiyor AudioQueueDispose eğer arabellekleri temizlemesini benim geri arama işlevini yardımcı kuyruğa edilecek olmasıdır. Bir parça çalınırken sonra AudioQueues kullanarak bir şey kaydetmek için gidiyorum yana

static void MyAQOutputCallBack(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inCompleteAQBuffer) 
{ 
    if (player.shouldDispose) { 
     printf("player shouldDispose !!!!!!!!!!!\n\n\n\n\n\n"); 
     OSStatus dispose = AudioQueueFlush (inAQ); 
     return; 
    } 
} 

, bu fonksiyonlar gecikme olmadan iade gerekir. iki yüz milisaniye iyi ama 3-4 saniye mi? bu kabul edilemez. Aynı iş parçacığı üzerinde de çağrılıyor ve düzgün çalışıyor gibi görünüyor.

Ben de bunu yapmak herhangi bir fark

[self performSelectorOnMainThread:@selector(tryOnMain) withObject:nil waitUntilDone:NO];

veya

dispatch_sync(dispatch_get_main_queue(),^{ daha hiç bir şeyi değiştirmeyecek olup olmadığını emin olmak için ana iş parçacığı bu aramaya çalıştık

Herhangi fikir neler olabilir?

-(void)stopAudio 
    { 
     @synchronized(audioLock) { 
      audioLock=[NSNumber numberWithBool:false]; 
      OSStatus err; 
      err=AudioQueueReset (_audioQueue); 
      if (err != noErr) 
      { 
       NSLog(@"AudioQueueReset() error: %d", (int)err); 
      } 
      err=AudioQueueStop (_audioQueue, YES); 
      if (err != noErr) 
      { 
       NSLog(@"AudioQueueStop() error: %d", (int)err); 
      } 
      err=AudioQueueDispose (_audioQueue, YES); 
      if (err != noErr) 
      { 
       NSLog(@"AudioQueueDispose() error: %d", (int)err); 
      } 
     } 
    } 

Ve benim,:

+0

Farklı ses kodeklerini denediniz mi? Bazı kodekleri kullanırken garip şeyler gördüm. Apple Lossless'ı sadece Apple olduğu için tavsiye ederim :) – Jaro

cevap

1

başarıyla hemen benim ses oynatmayı durdurmak

void audioCallback(void *custom_data, AudioQueueRef queue, AudioQueueBufferRef buffer) 

Ben sadece kuyrukta fazla şeyler koyarsanız: In

myObject *weakSelf = (__bridge myObject *)custom_data; 
@synchronized(weakSelf -> audioLock) { 
    if ([weakSelf -> audioLock boolValue]) { 
     Put_more_stuff_on_queue 
    } 

benim özel durum AAC-LC sesini oynatıyorum.