Perché questa unità audio l'inizializzazione remota funziona su iPhone ma non in simulatore?
-
25-09-2019 - |
Domanda
Sto usando i servizi di unità audio per impostare un callback di rendering di output in modo da poter mescolare l'audio sintetizzato. Il codice che ho sembra funzionare perfettamente sui dispositivi che ho (iPod touch, iPhone 3G e iPad) ma non riesce a funzionare sul simulatore.
Sul simulatore, la funzione AudiounitInitialis fallisce e restituisce un valore di -10851 (kaudiouniterr_invalidpropertyvalue secondo la documentazione di Apple).
Ecco il mio codice di inizializzazione .. chiunque abbia più esperienza con questa API di quanto non vedo qualcosa che sto facendo errata qui?
#define kOutputBus 0
#define kInputBus 1
...
static OSStatus playbackCallback(void *inRefCon,
AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList* ioData)
{
// Mix audio here - but it never gets here on the simulator
return noErr;
}
...
{
OSStatus status;
// Describe audio component
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
// Get component
AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
// Get audio units
status = AudioComponentInstanceNew(inputComponent, &m_audio_unit);
if(status != noErr) {
NSLog(@"Failed to get audio component instance: %d", status);
}
// Enable IO for playback
UInt32 flag = 1;
status = AudioUnitSetProperty(m_audio_unit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Output,
kOutputBus,
&flag,
sizeof(flag));
if(status != noErr) {
NSLog(@"Failed to enable audio i/o for playback: %d", status);
}
// Describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 4;
audioFormat.mBytesPerFrame = 4;
// Apply format
status = AudioUnitSetProperty(m_audio_unit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
if(status != noErr) {
NSLog(@"Failed to set format descriptor: %d", status);
}
// Set output callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = playbackCallback;
callbackStruct.inputProcRefCon = self;
status = AudioUnitSetProperty(m_audio_unit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Global,
kOutputBus,
&callbackStruct,
sizeof(callbackStruct));
if(status != noErr) {
NSLog(@"Failed to set output callback: %d", status);
}
// Initialize (This is where it fails on the simulator)
status = AudioUnitInitialize(m_audio_unit);
if(status != noErr) {
NSLog(@"Failed to initialise audio unit: %d", status);
}
}
La mia versione Xcode è 3.2.2 (64 bit) La mia versione del simulatore è 3.2 (anche se lo stesso problema si verifica in 3.1.3 debug o versione)
Grazie, lo apprezzo!
Soluzione
La compilazione per un dispositivo e per un simulatore è totalmente diverso. Le cose più comuni hanno lo stesso risultato previsto. Ad esempio, caricando un passaggio di vista tra loro suoni e così via. Tuttavia, quando si tratta di altre cose come suonare il suono con il caricamento aperto di 10 buffer e quindi passare da un po ', il simulatore non può gestirlo, ma i dispositivi possono.
Il modo in cui lo vedo è fintanto che funziona sul dispositivo, è tutto ciò che mi interessa. Prova a non tirare fuori i capelli solo per far funzionare un'applicazione su un simulatore quando funziona bene sul dispositivo.
Spero possa aiutare
Pk
Altri suggerimenti
Hai configurato e abilitato una sessione audio prima di chiamare il codice di inizializzazione Remoteio?
Quando si impostano le proprietà del flusso sul bus di input, si utilizzano kOutputBus
Per il tuo ambito di input. Probabilmente non va bene. Inoltre, probabilmente non è necessario applicare il callback di rendering all'ambito globale, poiché ne hai bisogno solo per l'output. Inoltre, penso che le tue definizioni di kOutputBus
e kInputBus
sono sbagliati ... quando guardo il codice audio iPhone funzionante, utilizza 0 per il bus di input e 1 per il bus di output.
Posso anche pensare ad alcune cose minori per quanto
- Aggiungi il
kAudioFormatFlagsNativeEndian
Proprietà alle flag del tuo formato - Impostare esplicitamente il
mReserved
campo a 0.