2009-11-02 44 views
7

Tenemos un juego que está muy cerca de ser lanzado, pero tenemos un problema extremadamente molesto. Uno de nuestros teléfonos Beta Testers, no puede escuchar ninguno de los efectos de sonido del juego. Sin embargo, puede escuchar la música de fondo y la música de la pantalla de título sin problemas.¿Está bien mezclar AudioServicesPlaySystemSound y AVAudioPlayer?

El fondo y la música de título se reproducen a través de AVAudioPlayer (son más largos, necesitamos bucles y control de volumen, etc.). Los efectos de sonido simplemente se están reproduciendo con AudioServicesPlaySystemSound (son muy cortos, no necesitamos un control preciso ni saber cuándo terminan, etc.). Esto funciona en la mayoría de los iPhones, pero no en este. Todo esto se está reproduciendo con una sesión de audio de AVAudioSessionCategorySoloAmbient.

Tengo dos preguntas: - En primer lugar, ¿se trata de una implementación aceptable? es decir, ¿hay algo que eché de menos que dice que no se pueden mezclar estos dos marcos, o una razón por la cual es una mala idea mezclarlos? - En segundo lugar, ¿alguien ha visto algo así antes? Si es así, ¿encontró una forma de evitarlo?

Nota adicional: Puedo decir bastante concluyentemente que en su teléfono, es la mezcla de los dos marcos. Pudo escuchar sonidos hasta aproximadamente la misma versión donde agregamos la música de la pantalla de título. Además, si cambio uno de los sonidos para que funcione a través de un AVAudioPlayer, él puede escucharlo. Desafortunadamente, no puedo simplemente mover los sonidos en AVAudioPlayers porque simplemente no funciona bien y necesito una mejor sincronización.

Respuesta

8

Tengo dos aplicaciones en la tienda de aplicaciones que combinan esos dos marcos. AVAudioPlayer para sonidos que requieren inicio y detención y control de volumen, y la caja de herramientas de AudioServices para pequeños pitidos y clics. La única cosa en la que puedo pensar, fuera de mi cabeza, es que el volumen de AVAudioPlayer parece controlarse por separado de los sonidos de AudioServices. Por lo tanto, verifique que el probador no tenga los sonidos desactivados (con el interruptor de modo de vibración) o que el volumen esté muy abajo.

Si esto no ayuda, cuénteme más sobre sus sonidos/código y puedo agregar algún código a mi aplicación para ver si puedo obtener el mismo comportamiento. Por supuesto, parece que la mayoría de los probadores no tienen este problema, y ​​probablemente tampoco lo vea.

+0

Voy a marcar su respuesta como aceptada, ya que ha respondido a mi pregunta principal (¿puede mezclar los dos). Creo que el teléfono de este probador puede ser una casualidad, ya que lo he visto funcionar en muchos otros. – Bdebeez

9

EDIT 2:
He determinado la causa del error. Los dos marcos de audio diferentes se reproducen en dos configuraciones de volumen diferentes. Está el volumen principal (eso es lo que aparece una vez que estás en la aplicación y no tiene título) y el volumen del timbre (eso es lo que aparece cuando estás en la pantalla de inicio sin ninguna aplicación cargada). Las llamadas de AVAudioPlayer se reproducen con la configuración de volumen principal. Como he configurado la categoría como AVAudioSessionCategorySoloAmbient (ver el código a continuación), este es el control de volumen que se ajustará si usa el control de volumen dentro de la aplicación. Los SystemSounds, sin embargo, se reproducen en el volumen del timbre. Esto NO aparecerá en la aplicación, y como tal no permite al usuario ajustar su configuración durante el juego.

Es fácil ver la posible confusión para el usuario: digamos que tienen el timbre configurado en bajo, o incluso apagado. Comienzan a jugar el juego. Escuchan la música de la pantalla de título (AVAudioPlayer) y pueden subir o bajar el volumen y responde normalmente. Luego comienzan el juego y se reproducen los efectos de sonido (SystemSounds), y no escuchan nada porque el volumen del timbre es bajo/apagado. En un esfuerzo por escuchar los efectos de sonido, suben el volumen y la música de fondo responde en consecuencia. Entonces, desde este punto de vista, definitivamente parece que los efectos de sonido simplemente no se están reproduciendo.

Si tiene esta situación similar, haga que su usuario se asegure de que el volumen de su timbre esté activado antes de jugar y que su interruptor de silencio esté activado (es decir, no silenciado).También puede verificar todo esto haciendo la prueba usted mismo: deje caer el volumen de su timbre y aumente el volumen en la aplicación. Sus SystemSounds deberían abandonar la mezcla.

Respuesta original: Al volver a buscar en todos los documentos, encontré la respuesta. No estaba activando correctamente la sesión de audio. Anteriormente sólo tenía este código para establecer la categoría:

NSError *setCategoryError = nil; 
BOOL categoryWasSet = [[AVAudioSession sharedInstance] 
           setCategory: AVAudioSessionCategorySoloAmbient 
           error: &setCategoryError]; 

Pero yo tenía que añadir también el siguiente código para activar explícitamente la sesión de audio:

NSError *activationError = nil; 
BOOL activationSuccess = [[AVAudioSession sharedInstance] 
           setActive: YES 
           error: &activationError]; 

he vuelto a probar con este usuario y ha solucionado completamente el problema. Espero que ayude a cualquiera que pueda tener un problema similar.

EDITAR: Esto no parece haber resuelto el problema después de todo. Obtuve un falso positivo de mi probador, y cuando se lo examina con más detalle, parece que en realidad no escuchó los sonidos generados por SystemSound.

+0

Me pregunto si vale la pena enviar a ese usuario una aplicación de prueba simple que reproduce dos sonidos, además de muchos NSLogs para cosas como la configuración de AVAudioSession y volúmenes, etc. – mahboudz

+0

Sí, esa es una gran idea y estaba pensando lo mismo. Informaré si encuentro algo interesante. – Bdebeez

+0

Por extraño que parezca, pude reproducir esto en el simulador, y veo un mensaje que indica que hubo un error al establecer la categoría. No estoy exactamente seguro de cómo responder a eso. Quizás no podría reproducir la música de título MP3 (porque sin la categoría I no tendría acceso a los decodificadores HW). Lo verdaderamente irónico es que cuando tuve esta prueba, el usuario extrae los registros de su teléfono, la primera prueba para conseguir que los registros funcionen realmente y reproduce todos los sonidos :) Por lo tanto, creo que es bastante casual y es probablemente relacionado con obtener la categoría establecida correctamente. – Bdebeez