Ho un'applicazione iOS che riproduce diversi effetti audio e registra l'audio allo stesso tempo. Lo scopo dell'applicazione non è al momento importante, ma sto avendo problemi con effetti audio iOS di serie.Il sistema IOS suona con sessioni audio personalizzate
Per riprodurre gli effetti, utilizzo SimpleAudioEngine
dall'API CocosDenshion
(che utilizza AVAudioPlayer
, per quanto posso vedere). Gli effetti sono precaricati e funzionano bene (li suono effettivamente su pulsanti, a scorrimento e simili). Gli effetti sono giocati con il seguente codice:
In willFinishLaunchingWithOptions
metodo:
[[SimpleAudioEngine sharedEngine] preloadEffect:@"sound.wav"];
In altri metodi quando è richiesta giocando:
[[SimpleAudioEngine sharedEngine] playEffect:@"sound.wav"];
Nessun meraviglie qui, ma allo stesso tempo, sono registrazione del rumore dal microfono incorporato con l'API AVCaptureSession
. Il codice della sessione di acquisizione proviene da uno degli esempi trovati sul 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];
Entrambe le parti del codice funzionano perfettamente una per una. Ma quando vengono entrambi attivati contemporaneamente, uno di loro rompe l'altro. Ad esempio: il microfono legge i dati senza problemi finché non viene riprodotto un effetto sonoro. Ho trovato un modo per aggirare questo, per attivare mixWithOthers
categoria, che è fatto con il seguente codice:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive: YES error: nil];
Questo viene fatto prima di creare la AVCaptureDevice
e AVCaptureSession
. L'applicazione funziona come dovrebbe, i suoni vengono riprodotti e il microfono legge i dati. I pulsanti hardware funzionano anche su CocosDenshion SimpleAudioEngine
(silenziamento e volume).
Ma a quanto pare, l'applicazione ha un bug.
Quando il silenziamento è disattivato e l'applicazione riproduce i suoni, i suoni di clic della tastiera iOS su TextField non vengono riprodotti. Desidero riprodurre i suoni di clic.
Ho eseguito il debug del codice un po 'e apparentemente ha qualcosa a che fare con Impostazioni sessione audio. Se imposto la categoria su AVAudioSessionCategorySoloAmbient
, vengono riprodotti i suoni di clic, ma a volume molto basso (il volume è al massimo ei suoni delle applicazioni vengono riprodotti al volume massimo appena). E dà un altro problema, SoloAmbient annulla la mia CaptureSession, il che è comprensibile.
Sto testando l'applicazione su iPhone 5, ma la stessa cosa accade anche sul simulatore.
Quindi, cosa sto sbagliando con le impostazioni? Come posso correggere le impostazioni in modo da mantenere attive tutte le mie sessioni audio e mantenere il suono del sistema iOS?
Grazie!
Hai provato a impostare la categoria su PlayAndRecord? Se vuoi suonare e registrare allo stesso tempo, dovrai farlo. – Mar0ux
L'ho provato prima di fare la domanda. La categoria PlayAndRecord fa suonare i suoni ad un volume più basso, ma ** non ** riporta i suoni mancanti della tastiera. – Legoless