У меня есть приложение 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?
Спасибо!