(编辑)我想将一串十六进制字符传递给一个方法,让它以规则的间隔播放一系列音调。音调位于名为tone_xx.wav的.wav文件中。我正在使用AVAudioPlayer。在我的init方法中,我创建了AVAudioPlayer实例并使用这些文件初始化它们,然后我将它们加载到一个数组中。出于测试目的,我然后在数组中播放lastObject。到目前为止,非常好。
但是,当我在实际的playTone方法中使用数组时,声音不会播放。如果我改为使用SystemSoundID,那么数组确实有效。(现在当我使用[(AVAudioPlayer *)self.toneArray.lastObject play]时,它会播放一些音调,但会丢几个)任何建议? 进一步的问题:有没有更好的方法来确保音调间隔一定的间隔?我知道有一个AVAudioPlay的回调,但有没有办法在所有音调完成播放后回调?
-(id) init{
self=[super init];
if (self) {
for(int count = 0; count < 16; count++){
NSString *newToneFilename = [NSString stringWithFormat:@"DTMF_%02d", count];
NSLog(@" AVAUDIO tonefile=DTMF_%02d",count);
NSURL *newToneURLRef = [[NSBundle mainBundle] URLForResource:newToneFilename withExtension:@"wav"];
//self.toneArray is mutable
AVAudioPlayer *thisSound = [[AVAudioPlayer alloc] initWithContentsOfURL:newToneURLRef error:nil];
[self.toneArray addObject:thisSound];
[(AVAudioPlayer*)self.toneArray.lastObject play];
sleep(2);
}
}
}
return self;
}
-(void)transmitTonesForHex:(NSString*)hexString{
__block NSDate *now=[NSDate date];
[hexString enumerateSubstringsInRange:NSMakeRange(0,[hexString length]) options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *hexString, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:hexString];
[scanner scanHexInt:&result];
int toneIndex=result;
NSLog(@"transmitTonesForHex [%d] interval=%f",result,[now timeIntervalSinceNow]);
now=[NSDate date];
AVAudioPlayer *dtmfTone=[self.toneArray objectAtIndex:toneIndex];
[(AVAudioPlay*)self.toneArray objectAtIndex:toneIndex play];
[NSThread sleepForTimeInterval:.6];
}];
}