Ich schrieb eine Befehlszeile c-Tool zum Erzeugen einer Sinuswelle und spielt es mit CoreAudio auf der Standard-Audio-Ausgang. Ich initialisiere ein AURenderCallbackStruct
und initialisiere ein AudioUnit mit AudioUnitInitialize
(wie bereits in diesem Forum diskutiert). All dies funktioniert wie vorgesehen, aber wenn es um das Schließen des Programms kommt Ich bin nicht in der Lage, die Audio Unit zu schließen, weder bei der Verwendung von AudioOutputUnitStop(player.outputUnit);
noch AudioOutputUnitStop(player.outputUnit);
noch AudioComponentInstanceDispose(player.outputUnit);
CoreAudio: AudioUnit kann nicht gestoppt oder nicht initialisiert werden
Die Reihenfolge des Erscheinens dieser Anrufe in dem Code nicht ändert das Verhalten. Das Programm wird ohne Fehlermeldungen kompiliert, aber der Sinus ist noch hörbar, solange der Rest des Programms läuft.
Hier ist der Code, den ich für die Initialisierung des Audio Unit mit:
void CreateAndConnectOutputUnit (ToneGenerator *player) {
AudioComponentDescription outputcd = {0};
outputcd.componentType = kAudioUnitType_Output;
outputcd.componentSubType = kAudioUnitSubType_DefaultOutput;
outputcd.componentManufacturer = kAudioUnitManufacturer_Apple;
AudioComponent comp = AudioComponentFindNext (NULL, &outputcd);
if (comp == NULL) {
printf ("can't get output unit");
exit (-1);
}
AudioComponentInstanceNew(comp, &player->outputUnit);
// register render callback
AURenderCallbackStruct input;
input.inputProc = SineWaveRenderCallback;
input.inputProcRefCon = player;
AudioUnitSetProperty(player->outputUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Output,
0,
&input,
sizeof(input);
// initialize unit
AudioUnitInitialize(player->outputUnit);
}
In meinem Hauptprogramm mir das Audio Unit und die Sinuswelle fange.
void main {
// code for doing various things
ToneGenerator player = {0}; // create a sound object
CreateAndConnectOutputUnit (&player);
AudioOutputUnitStart(player.outputUnit);
// waiting to listen to the sine wave
sleep(3);
// attempt to stop the sound output
AudioComponentInstanceDispose(player.outputUnit);
AudioUnitUninitialize(player.outputUnit);
AudioOutputUnitStop(player.outputUnit);
//additional code that should be executed without sine wave being audible
}
Wie ich bin neu in beide, dieses Forum sowie Programmierung in Xcode Ich hoffe, dass ich dieses Problem in einer Weise erklären könnte, dass Sie mir helfen können, und ich hoffe, dass ich nicht die vermißte antworten Sie irgendwo im Forum, während Sie nach einer Lösung suchen.
Vielen Dank im Voraus für Ihre Zeit und Eingabe,
Stefan
Ich würde damit beginnen, dafür zu sorgen, dass die Dinge in der umgekehrten Reihenfolge ablaufen: InstanceNew; Initialize; Start -> Stop; Uninitialize; InstanceDispose und Überprüfung der Rückgabewerte aller Funktionen. (Sie geben Fehlercodes aus einem Grund zurück, und der Grund ist nicht, dass sie ignoriert werden sollten.) – molbdnilo
Vielen Dank für Ihre Antwort molbdnilo. Das Ändern der Reihenfolge scheint logisch zu sein, ändert jedoch nicht das Verhalten. Die Funktionen werfen Fehler -2147450879. Ich habe keine nützlichen Informationen zu diesen Fehlern gefunden. Ich benutze diese Funktion zum Abfangen der Fehler: [link] (https://github.com/Xcode-Snippets/Objective-C/blob/master/checkerror.m). –