2009-11-13 6 views
-1

J'appelle AudioSessionInitialize comme siAudioSessionInitialize retour code d'erreur insondable

OSStatus result = AudioSessionInitialize(NULL,NULL,interruptionListener,NULL); 

et obtenir le résultat 0xbfffde94 (c.-à--1073750040) qui ne correspond pas à quoi que ce soit dans la documentation, qui sont tous de lisibles de 4cC comme '!ini' et ainsi avant. Les bonnes nouvelles sont que semble comme l'appel a travaillé.Néanmoins, quelqu'un peut-il faire la lumière sur ce code d'erreur?

EDIT: Le code d'erreur ci-dessus est renvoyé dans le simulateur. Sur l'appareil, le code d'erreur est 2fffe810.

+1

Bizarre. Est-ce sur l'appareil ou le simulateur? Ou les deux? –

+0

Bonne question. Tous les deux. – Grumdrig

+0

Incidemment, de la façon dont tout cela se comporte, j'ai un peu l'impression que ces chiffres retournés sont des adresses de mémoire.J'ai inspecté la mémoire et cela ressemblait un peu à du stockage pour différentes variables. (Par exemple, la similarité dans les groupes de 4 octets.) Il y avait 4 octets de 0 à l'adresse retournée. – Grumdrig

Répondre

1

Je l'ai compris. Je suis un idiot. Il y avait une erreur dans la macro que j'avais enveloppant l'appel & rapportant l'erreur, qui a appelé l'AudioSessionInitialize deux fois. Cela n'explique pas tout à fait le code d'erreur que j'ai vu, mais ça ne vaut pas la peine de s'interroger. MISE À JOUR: En fait, c'est une belle farce, donc je vais vous expliquer.

La macro incriminée était à l'origine:

#define CHECK(S) { OSStatus err = (S); if (S) printf("Error %x at \"%s\"\n", err, #S);} 

donc bug # 1 est le if (S) qui devrait être le cas if (err). Par conséquent, je répète tous les appels au système audio, ce qui explique d'autres choses étranges, alors je suis très heureux d'avoir essayé de comprendre ce qui semblait être une anomalie inoffensive. Dans ce cas, le second appel s'est plaint que la session audio était déjà initialisée.

Mais pourquoi le code d'erreur bizarre? Je voulais voir de la 4CC donc je changé la macro à cela, portant l'erreur le long:

#define CHECK(S) { OSStatus err[2] = {S,0}; if (S) printf("Error %x '%4s' at \"%s\"\n", err, &err, #S); } 

(Le deuxième OSStatus de 0 termine la chaîne définie par la 4CC première OSStatus, donc je peux l'imprimer au format %s .) Mais j'ai oublié de changer err à err[0], donc il était en effet l'impression de l'adresse du tableau err. Ce que je suis assez sûr est correcte maintenant:

#define CHECK(S) { OSStatus err[2] = {S,0}; if (*err) printf("Error %x '%4s' at \"%s\"\n", *err, err, #S); } 
+0

hehe - super :) ... Avec les mots de Forest Gump: la merde arrive, je suppose. Codage heureux! – Till

1

Comme ces résultats sont faux et ne sont pas définis ou décrits par Apple, il ne me reste qu'une hypothèse; vous avez un mélange bizarre de Frameworks installé - peut-être d'anciennes versions mélangées avec des versions plus récentes. Donc, tout ce que je pourrais recommander est de réinstaller l'ensemble du SDK iPhone.

+0

J'ai construit et couru sur une machine différente, et j'ai obtenu une sorte de la même chose, '0xbfffdf54' dans le simulateur. Puis, dans mon projet, j'ai remplacé AudioToolbox.framework dans/System/Library/Frameworks par celui de /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.2.sdk/System/Library/Frameworks (bien sûr que cela serait le résoudre) mais a obtenu le même problème, le code d'erreur différent '0xbfffe0a4'. Pourtant, peut-être avez-vous raison, d'une manière ou d'une autre. – Grumdrig

+0

Avez-vous essayé l'un des exemples d'Apple en utilisant la sortie audio? Si non, allez-y tester quelque chose comme par exemple .MusicCube. Est-ce qu'ils reçoivent des valeurs correctes de l'AudioSessionInitialize? – Till

0

Regardez la variable OSStatus dans la liste du débogueur des variables (bas à gauche). Faites un clic droit dessus et sélectionnez Afficher la valeur sous-> Octets (Hex avec ASCII). Lisez le code à 4 lettres en arrière. * Ceci devrait correspondre à l'un des codes de résultat documentés.

Une valeur de 1768843636 est 74 69 6e 69 lorsqu'elle est vue de cette façon. À côté de cela, la fenêtre de débogage affiche 'tini'. Tournez cela autour et vous obtenez 'init', que la documentation dit est kAudioSessionAlreadyInitialized.

* Non, je ne sais pas pourquoi.

+0

Je comprends cela, mais les codes d'état que je voyais (voir ci-dessus) n'étaient pas lisibles comme des codes à 4 caractères. – Grumdrig

+0

\ * Aussi, je sais pourquoi. Le processeur est little-endian \ * \ *, donc par ex. 0x74696e69 est stocker dans la mémoire comme 69,6e, 69,74. Et 4cc sont comme les nombres de base-256 de sorte que la constante de caractère 'init' apparaît dans la mémoire comme 't', 'i', 'n', 'i'. [\ * \ * Le processeur ARM est "bi-endian" mais little-endian par défaut et dans ce cas.] – Grumdrig

Questions connexes