我正在尝试为需要快速连续播放样本的应用程序获得流畅的音频播放。我希望Cocos2d和CocosDenshion能够做到这一点,因为AVAudioPlayer由于滞后问题而无法正常工作,但是我仍然遇到问题-此处模拟的“ 16音符”最终听起来像是摇摆了。

我是否必须使用RemoteIO或类似的东西?获得该项目所需的iOS播放声音的精确定时的最简单方法是什么?

还是使用CDAudioEngine playSound:函数不是我可以用CocosDenshion做事的最有效方式?

加载引擎:

[CDAudioManager sharedManager];

while ([CDAudioManager sharedManagerState] != kAMStateInitialised) {
    [NSThread sleepForTimeInterval:0.1];
    NSLog(@"Not init yet...");
}



CDSoundEngine *sse = [CDAudioManager sharedManager].soundEngine;

NSArray *defs = [NSArray arrayWithObjects:
                 [NSNumber numberWithInt:16],nil];
[sse defineSourceGroups:defs];
[[CDAudioManager sharedManager].soundEngine setSourceGroupNonInterruptible:0 isNonInterruptible:TRUE];

NSLog(@"Loading sound: %i",[sse loadBuffer:1 filePath:@"bass drum.wav"]);

[[CDAudioManager sharedManager] setResignBehavior:kAMRBStopPlay autoHandle:YES];
[[CDAudioManager sharedManager] setMode:(kAMM_MediaPlayback)];


测试回放的线程代码(基本上是节拍器示例应用程序,已编辑为使用CocosDenshion回放):

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// Give the sound thread high priority to keep the timing steady.
[NSThread setThreadPriority:1.0];
BOOL continuePlaying = YES;

CDSoundEngine *sse = [CDAudioManager sharedManager].soundEngine;

while (continuePlaying) {  // Loop until cancelled.

    // An autorelease pool to prevent the build-up of temporary objects.
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];


    [sse playSound:1 sourceGroupId:0 pitch:1.0f pan:0.0f gain:1.0f loop:NO];
    withObject:nil waitUntilDone:NO];
    NSDate *curtainTime = [[NSDate alloc] initWithTimeIntervalSinceNow:0.125f];
    NSDate *currentTime = [[NSDate alloc] init];

    // Wake up periodically to see if we've been cancelled.
    while (continuePlaying && ([currentTime compare:curtainTime] != NSOrderedDescending)) {
        if ([soundPlayerThread isCancelled] == YES) {
            continuePlaying = NO;
        }
        [NSThread sleepForTimeInterval:0.005];
        [currentTime release];
        currentTime = [[NSDate alloc] init];
    }
    [curtainTime release];
    [currentTime release];
    [loopPool drain];
}
[pool drain];

最佳答案

远程I0

这有一些关于为什么的信息
http://atastypixel.com/blog/developing-loopy-part-2-implementation/

10-08 11:36