Обработка прерываний с помощью AVAudioRecorder

Я использую AVAudioRecorder для проверки уровня громкости и, соответственно, обновления UIImageView. Однако, когда я удерживаю кнопку «Домой» для Siri или когда устройство получает телефонный звонок, UIImageView больше не обновляется. Это мой текущий код с этим, импортированным в .h:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

Затем я использовал этот код для создания рекордера и обновления UIImageView в .m:

@interface MyViewController ()

@property NSTimer *checkDecibelLevelsTimer;
@property (strong, nonatomic) IBOutlet UIImageView *visualizer;
@property AVAudioRecorder *recorder;

@end

@implementation MyViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryRecord error:nil];
    [audioSession setActive:YES error:nil];

    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;

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

    if (self.recorder) {
        [self.recorder prepareToRecord];
        self.recorder.meteringEnabled = YES;
        [self.recorder record];
    } else {
        NSLog(@"%@", [error description]);
    }

    self.checkDecibelLevelsTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03
                                                   target: self
                                                 selector: @selector(checkDecibelLevelsCallback:)
                                                 userInfo: nil
                                                  repeats: YES];
}

-(void)checkDecibelLevelsCallback:(NSTimer *)timer {
    [self.recorder updateMeters];
    if ([self.recorder averagePowerForChannel:0] < -40) {
        self.visualizer.image = [UIImage imageNamed:@"Visualizer1"];
    } else if ([self.recorder averagePowerForChannel:0] < -35) {
        self.visualizer.image = [UIImage imageNamed:@"Visualizer2"];
    } else if ([self.recorder averagePowerForChannel:0] < -30) {
        self.visualizer.image = [UIImage imageNamed:@"Visualizer3"];
    } else if ([self.recorder averagePowerForChannel:0] < -25) {
        self.visualizer.image = [UIImage imageNamed:@"Visualizer4"];
    } else if ([self.recorder averagePowerForChannel:0] < -20) {
        self.visualizer.image = [UIImage imageNamed:@"Visualizer5"];
    } else if ([self.recorder averagePowerForChannel:0] < -15) {
        self.visualizer.image = [UIImage imageNamed:@"Visualizer6"];
    } else if ([self.recorder averagePowerForChannel:0] < -10) {
        self.visualizer.image = [UIImage imageNamed:@"Visualizer7"];
    } else {
        self.visualizer.image = [UIImage imageNamed:@"Visualizer8"];
    }
 }

Я попытался обработать прерывания, внедрив этот код в .m:

- (void)beginInterruption {
    NSLog(@"begin interruption");
    [self.recorder pause];
}

- (void)endInterruption {
    NSLog(@"end interruption");
    [self.recorder record];
}

и добавив @interface MyViewController : UIViewController <AVAudioSessionDelegate> в .h. Я заметил, что NSLog ничего не возвращает, а UIImageView по-прежнему не обновляется. Как я могу это исправить?




Ответы (1)


Хорошо, я нашел решение. Я поместил это в метод viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willResignInactive) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];

и добавил следующие методы:

- (void)willResignInactive {
    [self.recorder stop];
}

- (void)didBecomeActive {
    [self.recorder record];
}
person ThatGuy    schedule 31.07.2015