2010-06-25 5 views
5

Ho giocato con la demo di aurioTouch di Apple, che è un codice di esempio per il tutorial sull'unità audio. Questa applicazione consente l'input/output simultaneo dal microfono. al relatore. Rende anche uno stereografo del suono immesso dal microfono.iOS: manipolazione del telecomando Audio Audio Remote AudioBuffer (ad esempio effetti sonori dal microfono)

Ad un livello veramente alto di questo processo di basso livello, il codice di esempio definisce un componente audio (in questo caso RemoteIO che consente l'input/output simultaneo) e vi è un richiamo di rendering per questa unità audio. Nella callback fanno un po 'di filtraggio audio (un filtro di reiezione DC) e la visualizzazione dello stereografo sulla base dei dati del suono AudioBuffer dal microfono.

Il mio obiettivo finale è quello di creare la mia unità di distorsione audio personalizzata basata sull'ingresso dal microfono. Penso che il modo corretto per farlo in base all'esercitazione Audio Unit sia quello di creare una seconda unità audio e collegarli con un grafico di elaborazione audio. Tuttavia, ho letto che iOS non ti consente di registrare le tue unità audio personalizzate. Le mie domande sono:

  1. posso fare manipolazione diretta sul AudioBufferList che ho accesso al callback render dall'unità remoteIO Audio (dal momento che già sembrano fare questo e l'applicazione di un filtro audio su di esso) e creare la mia distorsione audio personalizzata lì?
  2. Ho provato ad assegnare i dati di AudioBufferList a una costante (un valore che ho visto trattenuto da un'esecuzione di esempio e la registrazione di AudioBufferList), ma sembra non fare nulla.

risposta

4

La risposta alla tua prima domanda è sì. Questo è generalmente come è fatto.

Credo che sia necessario manipolare i dati nel puntatore direttamente, piuttosto che riassegnare. Puoi dare un'occhiata al codice in openframeworks che gestisce l'assegnazione dei buffer e passarli a una richiamata: https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm

C'è altro codice che puoi guardare, nick collins ha un'applicazione di base per togliere il suono il microfono e l'altoparlante, che sta elaborando tra: http://www.cogs.susx.ac.uk/users/nc81/code.html. Ha anche il codice che ottiene buffer di esempio da una traccia iPod che potrebbe essere utile a voi.

+1

Chiunque cerchi il collegamento github, il codice è ora spostato in: https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm –

1

È vero che non è possibile aggiungere le proprie AudioUnits personalizzate all'iPhone.

Il modo in cui funziona in questo modo: L'altoparlante guida la catena di trascinamento dei dati attraverso il sistema. Aggiungi una richiamata di rendering a ioUnit, come hai già fatto.

La richiamata viene eseguita ogni volta che l'altoparlante (bus # 0) ha fame ed è compito del cliente riempire quanti campioni ha richiesto, nel buffer fornito dal diffusore. La dimensione del buffer fornito sarà una potenza di due che è il più vicino possibile alla Durata del buffer di I/O preferita specificata durante la configurazione di AudioSession.

Il modo più semplice per farlo è quello di prendere l'AudioBufferList che ti è stato dato e passarlo a AudioUnitRender sul microfono (bus # 1). Dopo aver riempito il buffer con Render(), ma prima che il callback ritorni, puoi manipolare i dati come preferisci. Ad esempio, AurioTouch lo azzera per disattivarlo.

La cosa importante da ricordare è che l'altoparlante leggerà dal buffer di dati effettivo che ha trasmesso. Non esaminerà il descrittore AudioBufferList e controllerà se si è fatto riferimento a un altro databuffer. Se inizi a modificare la lista AudioBuffer che ti è stata data, ti imbatterai in problemi. Nel migliore dei casi, sarai ignorato.Nel peggiore dei casi, si verificheranno problemi di gestione della memoria.

Se non si vuole essere costretti a lavorare solo con il buffer ioData, è possibile utilizzare la propria lista AudioBuffer, assegnata come più vi piace, in qualsiasi dimensione, e chiedere al microfono di Render(). Quindi puoi fare tutta la manipolazione che ti piace fintanto che alla fine copi i risultati nel buffer fornito dal callback (cioè ioData-> mBuffers [0] .mData com'era nel momento in cui è stato richiamato il Callback).