Pourquoi ce travail d'initialisation Audio Unit RemoteIO sur iPhone, mais pas dans le simulateur?
-
25-09-2019 - |
Question
J'utilise les services de l'unité audio de mettre en place une sortie de rendu rappel, je peux mélanger audio ensemble synthétisé. Le code je semble fonctionner parfaitement sur les appareils que j'ai (iPod Touch, iPhone 3G et iPad), mais ne fonctionne pas sur le simulateur.
Sur le simulateur, la fonction AudioUnitInitialise échoue et renvoie une valeur de -10851 (kAudioUnitErr_InvalidPropertyValue selon la documentation Apple).
Voici mon code d'initialisation .. quelqu'un avec plus d'expérience avec cette API que je vois tout ce que je fais ici incorrecte?
#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);
}
}
Ma version XCode est 3.2.2 (64 bits) Ma version de simulateur est 3.2 (Bien que le même problème se produit dans 3.1.3 Debug ou Release)
Merci, je l'apprécie!
La solution
compilation pour un dispositif et un simulateur est totalement différent. La plupart des choses communes ont le même résultat attendu. Par exemple le chargement d'un commutateur de vue entre les jouer des sons et ainsi de suite. Cependant, quand il vient à d'autres choses comme jouer avec son chargement OpenAL 10 tampons et la commutation entre eux le simulateur ne peut pas gérer, mais les appareils peuvent.
La façon dont je le vois est aussi longtemps que cela fonctionne sur le dispositif qui est tout ce que je me soucie de. Essayez de ne pas tirer t vos cheveux juste pour faire un travail d'application sur un simulateur quand il fonctionne très bien sur l'appareil.
espoir qui aide
Pk
Autres conseils
Avez-vous configuré et activer une session audio avant d'appeler votre code d'initialisation RemoteIO?
Lorsque vous définissez les propriétés de flux au bus d'entrée, vous utilisez kOutputBus
pour votre champ d'entrée. C'est probablement pas bon. , Vous n'avez pas besoin probablement d'appliquer le rendu rappel à la portée globale, comme vous ne le faut pour la sortie. De plus, je pense que vos définitions de kOutputBus
et kInputBus
sont mal ... quand je regarde le code de travail iPhone Audio, il utilise 0 pour le bus d'entrée et 1 pour le bus de sortie.
Je peux aussi penser à quelques petites choses en ce qui concerne la AudioStreamBasicDescription, bien que je ne pense pas que ceux-ci feront une grande différence:
- Ajoutez la propriété
kAudioFormatFlagsNativeEndian
à vos drapeaux de format - set Explicitement le champ
mReserved
à 0.