我正在使用这个很棒的教程here来检测有人吹进麦克风的时间。
我的最终目标是在有人吹进手机时播放一个声音,并在没有吹进手机时停止播放;但是,由于此示例是基于计时器的,因此它每秒触发此if
语句30次(请参阅教程中的计时器代码示例)。
if (lowPassResults > 0.95) {
NSLog(@"Mic blow detected");
self.audioSource = [[OALSimpleAudio sharedInstance] playEffect:audioSound volume:1.0 pitch:1.0 pan:0 loop:NO];
}
if (lowPassResults < 0){
NSLog(@"PLEASE STOP?");
[self.keyCSource stop];
}
任何人都有任何想法听“打击”,如果它被吹进然后播放ObjectAL声音 ONCE 然后在它没有被吹进时停止它?
答案 0 :(得分:0)
据我所知,你可以发现这个打击而你的问题是,你只想播放一次声音。否则忽略我的答案......
创建一个属性@property BOOL blowDetected
,在检测到打击时将其设置为YES
,当您停止声音时(或当您准备好再次检测到打击时)将其设置为NO
。然后只播放声音if (!self.blowDetected)
更详细一点:
if (meterResults > 0.95) {
NSLog(@"isPlaying");
_isPlaying = YES;
}
到目前为止一直很好,但在这里你也想开始播放你的声音,并且只有_isPlaying == NO
if (!_isPlaying && meterResults > 0.95) {
self.keyCSource = [[ ... and so on
_isPlaying = YES;
}
然后,当meterResult
下降时
if (lowPassResults < 0){
_isPlaying = NO;
[self.keyCSource stop];
}
答案 1 :(得分:0)
它不适合您,因为只要您的低通结果超过阈值,您就会每秒重启30次声音。以下是解决此问题的方法。
确保您拥有某种持久性标记BOOL is_playing
并最初将其设置为NO
。超过阈值时,请测试is_playing
。仅当NO
playEffect
loop:YES
调用is_playing
时,YES
设为stopAllEffects
。
如果低通结果低于您的阈值is_playing
并将NO
设置为{{1}}。您还应该重新考虑您的下限是否应该为零。它可能会高一点,高达0.95。