Warum funktioniert diese Audioeinheit Remoteio -Initialisierung auf dem iPhone, aber nicht in Simulator?
-
25-09-2019 - |
Frage
Ich verwende die Audio -Einheit -Dienste, um einen Rückruf für die Ausgabe -Rendering einzurichten, damit ich synthetisierte Audio miteinander mischen kann. Der Code, den ich habe, scheint perfekt auf den Geräten zu funktionieren, die ich habe (iPod touch, iPhone 3G und iPad), funktioniert jedoch nicht am Simulator.
Auf dem Simulator schlägt die Audiounitinitial -Funktion fehl und gibt einen Wert von -10851 zurück (kaudiouniterr_invalidpropertyValue gemäß Apple -Dokumentation).
Hier ist mein Initialisierungscode. Jeder mit mehr Erfahrung mit dieser API als ich etwas sehe, was ich hier falsch mache?
#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);
}
}
Meine Xcode -Version ist 3.2.2 (64 Bit) Meine Simulator -Version ist 3.2 (obwohl das gleiche Problem in 3.1.3 Debug oder Veröffentlichung auftritt)
Danke ich schätze das!
Lösung
Das Kompilieren für ein Gerät und für einen Simulator ist völlig anders. Die meisten häufigsten Dinge haben das gleiche erwartete Ergebnis. Zum Beispiel laden Sie einen View -Schalter zwischen ihnen, um Sounds und so weiter zu spielen. Wenn es jedoch um andere Dinge geht, wie das Spielen von Sound mit Openal -Laden von 10 Puffern und dann zwischen ihnen, kann der Simulator das nicht verarbeiten, aber die Geräte können.
Die Art und Weise, wie ich es sehe, ist, solange es auf dem Gerät funktioniert, was mir wichtig ist. Versuchen Sie nicht, Ihr Haar nicht auszuziehen, nur um eine Anwendung auf einem Simulator zu bearbeiten, wenn es auf dem Gerät einwandfrei funktioniert.
Ich hoffe, das hilft
Pk
Andere Tipps
Haben Sie eine Audiositzung konfiguriert und aktiviert, bevor Sie Ihren Remoteio -Initialisierungscode aufgerufen haben?
Wenn Sie die Stream -Eigenschaften auf den Eingabebus einstellen, verwenden Sie kOutputBus
Für Ihren Eingangsbereich. Das ist wahrscheinlich nicht gut. Außerdem müssen Sie den Render -Rückruf wahrscheinlich nicht auf den globalen Bereich anwenden, da Sie ihn nur für die Ausgabe benötigen. Darüber hinaus denke ich, dass Ihre Definitionen von kOutputBus
und kInputBus
sind falsch ... wenn ich mich mit dem arbeitenden iPhone -Audiocode anschaue, verwendet er 0 für den Eingabebus und 1 für den Ausgangsbus.
Ich kann mir auch ein paar kleinere Dinge in Bezug auf die AudioTreamBasicDescription vorstellen, obwohl ich nicht glaube, dass diese einen großen Unterschied machen werden:
- Ergänzen Sie die
kAudioFormatFlagsNativeEndian
Eigenschaft zu Ihren Formatflags - Setzen Sie die ausdrücklich die
mReserved
Feld bis 0.