如何在后台线程上淡出AVAudioPlayer?

时间:2010-11-16 14:18:28

标签: objective-c ipad ios avaudioplayer nsthread

我有一个音频文件需要在用户滚动UIScrollView时淡出。但是,在用户停止滚动之前,任何performSelector:withObject:afterDelay:方法都会被阻止。所以我试图创建一些代码来在另一个线程上执行淡出:

- (void)fadeOut
{
    [NSThread detachNewThreadSelector:@selector(fadeOutInBackground:) toTarget:self withObject:self.audioPlayer];
}

- (void)fadeOutInBackground:(AVAudioPlayer *)aPlayer
{
    NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
    [self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1]; 
    [myPool release];
}

- (void)fadeVolumeDown:(AVAudioPlayer *)aPlayer
{
    aPlayer.volume = aPlayer.volume - 0.1;
    if (aPlayer.volume < 0.1) {
        [aPlayer stop];         
    } else {
        [self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1];  
    }
}

它得到了performSelector,但没有进一步,因为我猜它正试图在一个它无法访问的线程上执行。我甚至无法为performSelector:onThread:withObject:waitUntilDone:更改它,因为没有延迟选项。

有什么想法吗?他们为什么要这么难以淡出声音呢? 呻吟

谢谢!

2 个答案:

答案 0 :(得分:14)

我通过将选择器安排在与默认运行循环模式不同的运行循环模式中来解决类似的问题。这样它就不会干扰滚动事件。使用NSRunLoopCommonModes为我工作:

[self performSelector:@selector(fadeVolumeDown:) 
           withObject:aPlayer
           afterDelay:0.1 
              inModes:[NSArray arrayWithObject: NSRunLoopCommonModes]];

答案 1 :(得分:0)

受上面答案的启发

   while (theAudio.volume > 0.000000)
        [self fadeVolumeDown];

- (void) fadeVolumeDown{
    theAudio.volume -=0.01;
}