我在这里使用这个很棒的教程来检测何时有人对着麦克风吹气。
我的最终目标是当有人对着手机吹气时播放一个声音,当他们没有对着手机吹气的时候停止;但是,由于此示例是基于计时器的,因此它每秒触发此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声音,然后在没有被吹进的时候停止它?
这对你来说不起作用,因为只要你的低通结果超过阈值,你就会每秒重新启动声音30次。以下是解决此问题的方法。
确保您有某种持久性标志BOOL is_playing
,并在最初将其设置为NO
。当超过阈值时,测试is_playing
。仅当是NO
时,才使用loop:YES
调用playEffect
,并将is_playing
设置为YES
。
如果低通结果低于阈值stopAllEffects
,则将is_playing
设置为NO
。你还应该重新考虑你的下限是否真的应该为零。它可能会高得多,高达0.95。
据我所知,你可以检测到打击,而你的问题是,你只想播放一次声音。否则忽略我的回答
创建属性@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];
}