Обнаружение удара в iPhone Mic с Cocos2D - PullRequest
3 голосов
/ 04 июля 2011

Я использую Cocos2D и системные частицы и надеюсь, что правильно написал на английском. У меня проблемы с распознаванием звука с микрофона iPhone определенным образом.

У меня есть разные разделы в моем приложении, в одном из которых я использую микрофон, чтобы определить, «кто-то дует» в микрофон. Вначале эта часть работает нормально, но если вы перейдете в другой раздел приложения, в котором воспроизводится звук, а затем вернетесь в эту область и попытаетесь продуть воздух, он не будет работать.

Я отлаживал код, и levelTimeCallback всегда работает, даже если я не в этой сцене. Я действительно не знаю, что происходит. Я остановил все звуки, используя

[[SimpleAudioEngine sharedEngine] stopBackgroundMusic];

Кто-нибудь знает, что я делаю не так? Кстати, прекрасно работает в симуляторе, но не в iPhone.

Регистратор настроен в методе onEnter

-(void) onEnter {
     [super onEnter];
     NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];

     NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,
                          [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
                          [NSNumber numberWithInt: 1],                         AVNumberOfChannelsKey,
                          [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,
                          nil];

      NSError *error;

      recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];

      if (recorder) {
          [recorder prepareToRecord];
          recorder.meteringEnabled = YES;
          [recorder record];
          levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
          NSLog(@"I'm in the recorder");

       } else

              NSLog(@"recorder error");

}

Это метод levelTimerCallback, в котором звук "проверен"

- (void)levelTimerCallback:(NSTimer *)timer {

[recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;  

if (lowPassResults > 0.55)
{   
    NSLog(@"Mic blow detected");

    self.emitter = [[CCParticleExplosion alloc] initWithTotalParticles:5];
    [self addChild: emitter z:1];           
    emitter.texture = [[CCTextureCache sharedTextureCache] addImage: @"hoja.png"];      
    emitter.autoRemoveOnFinish = YES;

}
NSLog(@"Inside levelTimerCallback");}

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Та же проблема. Есть 2 способа решить эту проблему.

1: используйте AVAudioPlayer для воспроизведения музыки или звукового эффекта.

2: добавить #import "CDAudioManager.h" в AppDelegate.m и добавить

 [CDAudioManager initAsynchronously:kAMM_PlayAndRecord];

до

- (void) applicationDidFinishLaunching:(UIApplication*)application`

источник

2 голосов
/ 02 марта 2012

Наконец, после прочтения кулинарной книги Audio Session и различных публикаций, я нашел решение.Джус поместил этот блок кода в метод init :

    UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
    AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);
    AudioSessionSetActive(true);
...