Система IOS звучит с пользовательскими сеансами аудио

У меня есть приложение iOS, которое воспроизводит различные звуковые эффекты и записывает аудио в одно и то же время. Цель приложения в настоящее время не важна, но у меня возникают проблемы со звуковыми эффектами iOS.

Чтобы воспроизвести эффекты, я использую SimpleAudioEngine из CocosDenshion API (который, как я вижу, использует AVAudioPlayer). Эффекты предварительно загружены, и они работают нормально (я на самом деле играю их на кнопках, прокрутках и т.п.). Эффекты воспроизводятся с помощью следующего кода:

В методе willFinishLaunchingWithOptions:

[[SimpleAudioEngine sharedEngine] preloadEffect:@"sound.wav"];

В других случаях при воспроизведении требуется:

[[SimpleAudioEngine sharedEngine] playEffect:@"sound.wav"];

Никаких чудес здесь, но в то же время я записываю шум со встроенного микрофона с API AVCaptureSession. Код сеанса захвата - это один из примеров, найденных в Интернете.

AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];

captureSession = [[AVCaptureSession alloc] init];

NSError *error = nil;
captureAudioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error];

if ([captureSession canAddInput: captureAudioDeviceInput])
{
    [captureSession addInput:captureAudioDeviceInput];
}

captureAudioDataOutput = [AVCaptureAudioDataOutput new];

if ([captureSession canAddOutput:captureAudioDataOutput])
{
    [captureSession addOutput:captureAudioDataOutput];
}

// Create a serial dispatch queue and set it on the AVCaptureAudioDataOutput object
dispatch_queue_t audioDataOutputQueue = dispatch_queue_create("AudioDataOutputQueue", DISPATCH_QUEUE_SERIAL);

[captureAudioDataOutput setSampleBufferDelegate:self queue:audioDataOutputQueue];
dispatch_release(audioDataOutputQueue);

[captureSession startRunning];

Обе части кода работают безупречно один за другим. Но когда они оба активируются одновременно, один из них ломает другой. Например: микрофон считывает данные без проблем, пока не будет воспроизведен один звуковой эффект. Я нашел способ обойти это, чтобы активировать категорию mixWithOthers, которая выполняется с помощью следующего кода:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive: YES error: nil];

Это делается до создания AVCaptureDevice и AVCaptureSession. Приложение работает так, как должно, звуки воспроизводятся, а микрофон считывает данные. Аппаратные кнопки также работают с CocosDenshion SimpleAudioEngine (отключением звука и громкостью).

Но, видимо, приложение имеет ошибку.

Если отключить звук и приложение воспроизводит звуки, звуки на клавиатуре iOS на экране TextField не воспроизводятся. Я хочу, чтобы звуки нажатия воспроизводились.

Я немного отлаживал код и, видимо, он имеет какое-то отношение к настройкам Audio session. Если я установил категорию в AVAudioSessionCategorySoloAmbient, будут воспроизводиться звуки щелчка, но на очень низкой громкости (громкость отключена, а звук приложения будет воспроизводиться при максимальном уровне громкости). И это еще одна проблема, SoloAmbient отменяет мою CaptureSession, что понятно.

Я тестирую приложение на iPhone 5, но то же самое происходит и на симуляторе.

Итак, что я делаю неправильно с настройками? Как я могу исправить настройки, чтобы сохранить все мои сеансы аудио и сохранить звуки системы iOS?

Спасибо!

Ответ 1

Посмотрите мой вопрос здесь: https://stackoverflow.com/info/15680503/how-to-get-the-audio-level-of-the-microphone-without-disabling-system-sounds

К сожалению, ответов нет. Системные звуки отключены по умолчанию при записи. Я ожидаю, что это предотвратит их запись по ошибке, что в большинстве случаев было бы тем, что вы хотели бы.

Вы можете реализовать UITextFieldDelegate протокол и играть свой собственный клик каждый раз, когда textField:shouldChangeCharactersInRange:replacementString: вызывается, возможно.