2013-05-01 24 views
6

Tôi đang tạo nhạc chuông trên iPhone bằng AudioUnits dựa trên số classic example của Matt Gallagher. Để tránh các đoạn trích và nhấp chuột vào đầu/cuối, tôi là fading the amplitude in/out trong cuộc gọi lại RenderTone. Tôi muốn tiêu diệt ToneUnit khi kết thúc giai đoạn mờ dần, tức là sau khi biên độ đạt đến 0. Cách duy nhất tôi có thể nghĩ để làm điều này là gọi một phương pháp thể hiện từ bên trong cuộc gọi lại:Làm thế nào để phá hủy đúng ToneUnit sau khi âm thanh mất dần?

if (PlayerState == FADING_OUT) { 
     amplitude -= stepsize; 
     if (amplitude <= 0) { 
      amplitude = 0; 
      PlayerState = OFF; 
      [viewController destroyToneUnit]; 
     } 
    } 

Thật không may điều này là khó khăn hơn tôi nghĩ. Đối với một điều, tôi vẫn nhận được bấm vào cuối rằng fadeout được cho là để loại bỏ. Đối với người khác, tôi nhận được thông báo tường trình này:

<AURemoteIO::IOThread> Someone is deleting an AudioConverter while it is in use. 

Thông báo này có ý nghĩa gì và tại sao tôi nhận được?

Cách nên Tôi giết ToneUnit? Tôi nghi ngờ rằng nhấp chuột xảy ra vì RenderTonedestroyToneUnit chạy trên các chuỗi khác nhau. Làm thế nào tôi có thể nhận được những đồng bộ?


Trong trường hợp đó là hữu ích, đây là phương pháp destroyToneUnit dụ của tôi:

- (void) destroyToneUnit { 
    AudioOutputUnitStop(toneUnit); 
    AudioUnitUninitialize(toneUnit); 
    AudioComponentInstanceDispose(toneUnit); 
    toneUnit = nil; 
} 

Nếu thông điệp tôi NSLog ngay trước và ngay sau khi AudioUnitUninitialize(toneUnit);, thông báo xuất hiện giữa chúng.

Trả lời

6

Tôi cũng gặp phải sự cố tương tự. Khi tôi gọi destroyToneUnit từ chủ đề chính, cảnh báo đã biến mất.

[viewController performSelectorOnMainThread:@selector(destroyToneUnit) withObject:nil waitUntilDone:NO]; 
+0

cảm ơn mã của bạn. Tôi đã có cùng vấn đề y hệt. Bạn đã giải mã được vấn đề của tôi. –

Các vấn đề liên quan