【发布时间】: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