2011-01-28 11 views
5

para una aplicación de cambio de voz iphone (objetivo c), estoy tratando de tomar los valores enteros muestreados del búfer de la cola de audio de grabación, procesarlos en una función y escribir los valores modificados de nuevo en el búfer de reproducción. En el momento en que usar algo como esto¿Cómo extraer muestras enteras del buffer de cola de audio y volver a escribir muestras modificadas?

AudioBuffer audioBuffer = bufferList->mBuffers[0]; 
int bufferSize = audioBuffer.mDataByteSize/sizeof(SInt32); 
SInt32 *frame = audioBuffer.mData; 
SInt32 signalInput[22050]; 
for(int i=0; i<bufferSize; i++) { 
    SInt32 currentSample = frame[i]; 
    *(signalInput +i) = currentSample; 
} 

para extraer los valores muestreados y parece que funciona bastante bien (signalinput se supone que es el vector objetivo para la escritura de las muestras de números enteros). pero escribirlos de nuevo en un búfer sigue siendo un problema ... busqué en la documentación y en muchos foros para encontrar una solución, pero aún no lo había logrado.

así la identificación esté muy agradecido por cualquier consejo, gracias de antemano, Lukas

Respuesta

4

Si desea modificar el audio en tiempo real, es posible que desee probar el uso de la unidad de audio RemoteIO lugar.

Al usar colas de audio, debe guardar los datos de la devolución de llamada de la cola de grabación y luego enviar los datos procesados ​​a la devolución de llamada de la cola de reproducción, en una devolución de llamada diferente en un momento diferente. Para esto, probablemente tenga que usar una cola intermedia o un búfer de datos. Para que esto funcione, podría ser útil intentar que se ejecute una aplicación de sonido de grabación, y luego ejecutar una aplicación de reproducción de muestra, y luego combinar ambas.

Agregado:

Aquí hay algo de código fuente de los valores de la muestra de escritura ejemplo en una cola de salida de audio:

http://lists.apple.com/archives/coreaudio-api/2008/Dec/msg00173.html https://bitbucket.org/ddribin/a440/wiki/Home

sólo tiene que utilizar sus propias muestras pre-procesados ​​en lugar de una onda sinusoidal .

+0

Gracias por su rápida respuesta. - La parte de grabación ya está funcionando. Quería cambiar la devolución de llamada de alguna manera para modificar las muestras grabadas antes de escribirlas en un archivo, por ejemplo. Lo que sea, es posible, y en caso de que lo sea, ¿cómo puedo acceder directamente a las muestras grabadas de un buffer de audio (sin importar audio-queue o audio-unit). – Lukas

+0

Asegúrese de que los tipos de datos de PCM que especifique, obtenga y use son consistentes. ¿Pediste muestras de 16 o 32 bits? ¿Entero o flotante? ¿Big o little-endian? etc. – hotpaw2

+0

OK, gracias hasta ahora. Lo verifico de inmediato. Pero básicamente, ¿la función declarada arriba es correcta? Si ese es el caso, ¿cómo puedo escribir los valores (que tipo alguna vez ...) volver a un buffer de audio. No pude encontrar ningún código de muestra en ninguna parte ...? – Lukas

Cuestiones relacionadas