¿Cómo puedo reproducir un tono personalizado en iOS?

Estoy tratando de encontrar alguna forma de reproducir tonos en iOS que se crean dinámicamente. Poder reproducir un archivo de audio no va a ser suficiente para mí. Necesito un control mucho más fino. Sé que hay formas de manejar transmisiones de audio a nivel de paquete individual, lo que funcionaría para mí si tuviera alguna forma de crear los paquetes de audio. Si alguien tiene buenos consejos o lugares a donde ir para obtener más información, se lo agradecería.

preguntado el 10 de mayo de 11 a las 13:05

Bueno, deberías mirar las aplicaciones de ejemplo de Apple. -

@Nick Weaver, estaba pensando lo mismo, pero (no extraído de su pregunta directamente) creo que necesita algo mucho más complicado (o al menos quiere que sea). -

Veo que no hay una respuesta aceptada; si es posible, háganos saber si resolvió el problema por su cuenta y cómo lo hizo. -

2 Respuestas

Seguro que Matt Gallagher ha escrito un generador de tonos usando una unidad de audio RemoteIO.

http://cocoawithlove.com/2010/10/ios-tone-generator-introduction-to.html

Respondido 22 Jul 11, 20:07

Lo que probablemente quieras es usar AudioQueue. Es una API un poco más abajo en la pila de audio, pero le permite generar cualquier audio que desee. Lo he usado en la aplicación SC68 Player para generar el flujo de audio para un emulador de chip de sonido Atari ST, para reproducir música antigua de juegos y demostraciones de escenas de los años 80.

La idea básica es:

  1. Genere un hilo de fondo en el que genere un CFRunLoop para recibir devoluciones de llamada a pedido para llenar el búfer de colas de audio. Usar AudioQueueNewOutput()
  2. Inicie / pause la cola de audio desde cualquier hilo. Usar AudioQueueStart()/AudioQueueStart() pausa.
  3. Implemente la devolución de llamada para llenar el búfer de audio.

La devolución de llamada se verá así:

static void AudioQueueCallback(void* inUserData, 
                               AudioQueueRef inAQ, 
                               AudioQueueBufferRef inBuffer) 
{
    [soundGenerator fillNextFrameBuffer:inBuffer->mAudioData 
                                   size:inBuffer->mAudioDataBytesCapacity];
    inBuffer->mAudioDataByteSize = inBuffer->mAudioDataBytesCapacity;
    AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}

contestado el 10 de mayo de 11 a las 19:05

¡Gracias! ¿Algún consejo sobre cómo crear un generador de sonido? No estoy seguro de cómo se ven esos formatos. Podría llenarlo con datos LPCM si supiera dónde colocarlo y en qué formato debe estar para reproducir en un AudioQueue. - Micah Hainline

Puede descargar el código fuente del reproductor SC68 desde peylow.se/sc68player.html - Contiene el código que desea ver en el CS68PlayerAudioQueuePlayer.m expediente. Puede configurar los datos de audio PCM casi como desee. - PeyloW

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.