【问题标题】:iOS CocosDenshion audio playback uneven (lag)iOS CocosDenshion 音频播放不均匀(滞后)
【发布时间】:2011-03-15 03:34:44
【问题描述】:

我正在尝试为需要快速连续播放样本的应用程序提供流畅的音频播放。我希望 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];

【问题讨论】:

    标签: iphone objective-c cocos2d-iphone


    【解决方案1】:

    远程I0

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

    【讨论】:

    • 呃——我希望不必像他在那篇文章中所说的那样参与“The Great Audio Interface Of Doom”。
    • 我使用过 RemoteIO。它有点复杂,但实际上并没有我想象的那么糟糕。
    • 任何好的指针(链接?)对于刚开始 - 只是用它播放 WAV 文件?
    • 好的——我至少具备同时播放多个样本的基本能力。现在让所有的数学来计算何时播放它们......对于其他想要开始的人,我也发现这是一个有用的资源:@​​987654322@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2013-03-10
    • 2014-04-30
    • 1970-01-01
    • 2017-02-10
    • 2021-12-30
    相关资源
    最近更新 更多