如何使用AVAudioPlayer以规则间隔的间隔播放加载在阵列中的一系列音调

时间:2012-07-15 23:49:12

标签: ios avaudioplayer

(编辑)我想将一串十六进制字符传递给一个方法,让它以规则的间隔播放一系列音调。音调位于名为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];               
            }];
 }

0 个答案:

没有答案