El sistema IOS suena con sesiones de audio personalizadas.

Tengo una aplicación de iOS que reproduce diferentes efectos de audio y graba audio al mismo time. El propósito de la aplicación actualmente no es importante, pero estoy teniendo problemas con los efectos de audio de stock iOS.

Para reproducir los efectos, uso SimpleAudioEngine de CocosDenshion API (que usa AVAudioPlayer , por lo que puedo ver). Los efectos están precargados y funcionan bien (en realidad los juego en botones, desplazamiento y similares). Los efectos se juegan con el siguiente código:

En el método willFinishLaunchingWithOptions :

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

En otros methods cuando se requiere jugar:

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

No me pregunto aquí, pero al mismo time, estoy grabando el ruido del micrófono incorporado con AVCaptureSession API. El código de la session de captura es de uno de los ejemplos encontrados en la web.

 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]; 

Ambas partes del código funcionan impecablemente una por una. Pero cuando ambos se activan al mismo time, uno de ellos rompe el otro. Por ejemplo: el micrófono está leyendo datos sin problemas, hasta que se reproduzca un efecto de sonido. Encontré una forma de evitar esto, para activar la categoría mixWithOthers , que se realiza con el siguiente código:

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

Esto se hace antes de crear AVCaptureDevice y AVCaptureSession . La aplicación funciona como debería, los sonidos se reproducen y el micrófono lee los datos. Los botones de hardware también funcionan en CocosDenshion SimpleAudioEngine (silencio y volumen).

Pero al parecer, la aplicación tiene un error.

Cuando el silencio se desactiva y la aplicación está sonando, no se reproducen los sonidos del keyboard iOS en TextField. Quiero que suenen los sonidos de clics.

He depurado el código un poco y aparentemente tiene algo que ver con la configuration de la session de audio . Si configuro la categoría en AVAudioSessionCategorySoloAmbient , los sonidos de clic se reproducen, pero a un volumen muy bajo ( el volumen se ha alcanzado al máximo y los sonidos de la aplicación se reproducen a volumen máximo de manera agradable ). Y da otro problema, SoloAmbient cancela mi CaptureSession, lo que es comprensible.

Estoy probando la aplicación en iPhone 5, pero lo mismo sucede en el simulador también.

Entonces, ¿qué estoy haciendo mal con la configuration? ¿Cómo podría arreglar la configuration para mantener activas todas las sesiones de audio y mantener los sonidos del sistema iOS?

¡Gracias!

Mira mi pregunta aquí: https://stackoverflow.com/questions/15680503/how-to-get-the-audio-level-of-the-microphone-without-disabling-system-sounds

Desafortunadamente no hay respuestas. Los sonidos del sistema están deshabilitados de manera pnetworkingeterminada cuando se realiza la grabación. Espero que esto sea evitar que se registren por error, lo que en la mayoría de las circunstancias sería lo que usted quisiera.

Podría implementar el protocolo UITextFieldDelegate y jugar su propio clic cada vez que campo de textField:shouldChangeCharactersInRange:replacementString: se llama, tal vez.