gpt4 book ai didi

ios - 如何暂停 dispatch_queue_t 及其创建的队列

转载 作者:可可西里 更新时间:2023-11-01 04:11:22 26 4
gpt4 key购买 nike

我正在创建一个程序,除其他功能外,它还可以淡入和淡出音乐。问题是其他线程/队列可以暂停音乐,这意味着淡入和淡出不仅需要暂停,还需要推迟。我需要能够在 dispatch_after 上暂停“计时器”(因为当音乐开始播放时会调用它以告诉它何时开始淡出,如果暂停则需要延迟)并暂停队列本身(为了在淡入或淡出时暂停淡入或淡出)

这是代码(fadeIn 和 delayFadeOut 都在程序开始时被调用):

- (void) doFadeIn: (float) incriment to: (int) volume with: (AVAudioPlayer*) thisplayer on: (dispatch_queue_t) queue{
dispatch_async(queue, ^{
double delayInSeconds = .1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, queue, ^(void){
thisplayer.volume = (thisplayer.volume + incriment) < volume ? thisplayer.volume + incriment : volume;
NSLog([[[NSNumber alloc] initWithFloat:thisplayer.volume] stringValue]);
if (thisplayer.volume < volume) {
[self doFadeIn:incriment to:volume with:thisplayer on:queue];
}
});
});
}

-(void) doDelayFadeOut: (float) incriment with: (AVAudioPlayer*) thisplayer on: (dispatch_queue_t) queue
{
dispatch_async(queue, ^{
double delayInSeconds = .1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, queue, ^(void){
thisplayer.volume = (thisplayer.volume - incriment) > 0 ? thisplayer.volume - incriment : 0;
NSLog([[[NSNumber alloc] initWithFloat:thisplayer.volume] stringValue]);
if (thisplayer.volume > 0.0) {
[self doDelayFadeOut:incriment with:thisplayer on:queue];
}
});
});
}

-(void) fadeIn: (AVAudioPlayer*) dFade {
if (dFade == nil) {
return;
}
dispatch_queue_t queue = dispatch_queue_create("com.cue.MainFade", NULL);
dispatch_async( queue, ^(void){
if(dFade !=nil){
double incriment = ([self relativeVolume] / [self fadeIn]) / 10; //incriment per .1 seconds.
[self doFadeIn: incriment to: [self relativeVolume] with:dFade on:dispatch_queue_create("com.cue.MainFade", 0)];
}

});
}

- (void) delayFadeOut: (AVAudioPlayer*) dFade { //d-fade should be independent of other threads
if (dFade == nil) {
return;
}
int timeRun = self.duration - self.fadeOut;
dispatch_queue_t queue = dispatch_queue_create("com.cue.MainFade", NULL);
dispatch_time_t mainPopTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeRun * NSEC_PER_SEC));
printf("test");
dispatch_after(mainPopTime, queue, ^(void){
if(dFade !=nil){
double incriment = ([dFade volume] / [self fadeOut])/10; //incriment per .1 seconds.
[self doDelayFadeOut:incriment with:dFade on:dispatch_queue_create("com.cue.MainFade", 0)];
}

});
if (self.cueType == 2) {
[self callNext];
}
}

最佳答案

对于您的一般问题,调用是 dispatch_suspend()(连同 dispatch_resume())。这将阻止调度特定队列上的任何新 block 。它不会对已经运行的 block 产生任何影响。如果你想暂停一个已经安排好并正在运行的 block ,你的代码可以检查一些条件并暂停。

不过,使用它时要理解的关键是,没有什么可以“在 dispatch_after 上暂停“计时器”。”如果你说你想要在 1 秒后派发某些东西,它绝对会在 1 秒后派发。但"dispatch"并不意味着“运行”。它的意思是“排队”。如果该队列被挂起,那么该 block 将挂起直到队列恢复。需要注意的是,您不希望队列中堆积一堆渐变 block 。如果他们这样做了,当您恢复队列时,他们将全部安排背靠背。查看您的代码,这可能不会发生,因此这对您有用。请记住,dispatch 的意思是“排队”。非挂起队列按顺序安排其 block 。

关于ios - 如何暂停 dispatch_queue_t 及其创建的队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15462913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com