Я понял это. Я идиот. Была ошибка в макросе, который у меня был, оборачивая вызов и сообщая об ошибке, который дважды вызывал AudioSessionInitialize. Это не совсем объясняет код ошибки, который я видел, но об этом не стоит задумываться.
ОБНОВЛЕНИЕ: На самом деле, это довольно грубая помеха, поэтому я собираюсь объяснить.
Макрос-нарушитель изначально был:
#define CHECK(S) { OSStatus err = (S); if (S) printf("Error %x at \"%s\"\n", err, #S);}
так что ошибка # 1 - это if (S)
, которая должна быть, если if (err)
. Поэтому я повторяю каждый звонок в аудиосистему, которая объясняет различные другие странные вещи, поэтому я очень рад, что попытался выяснить, что казалось безобидной аномалией. В этом случае второй звонок жаловался, что аудио сеанс уже был инициализирован.
Но почему странный код ошибки? Я хотел увидеть 4CC, поэтому я изменил макрос на этот, неся ошибку:
#define CHECK(S) { OSStatus err[2] = {S,0}; if (S) printf("Error %x '%4s' at \"%s\"\n", err, &err, #S); }
(Второй OSStatus 0 завершает строку, определенную первым OSStatus 4CC, поэтому я могу напечатать его в формате %s
.) Но я забыл изменить err
на err[0]
, так что он действительно печатал адрес массива err
. Я уверен, что теперь это правильно:
#define CHECK(S) { OSStatus err[2] = {S,0}; if (*err) printf("Error %x '%4s' at \"%s\"\n", *err, err, #S); }