Свежий пример SpeakHere приложение имеет ошибку при записи звука в Simulator / Xcode


Я не могу записывать аудио с помощью приложения SpeakHere example от apple. Когда я запускаю приложение в симуляторе из Xcode, оно запускается нормально, но когда я нажимаю кнопку записи, возникает ошибка " Thread 1: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)": скриншот после возникновения проблемы

Сообщение журнала о пропавшем корневом контроллере представления при запуске приложения уже существует до возникновения вышеуказанной ошибки, и это, вероятно, не связано с моей проблемой.

Я скачал Speacher пример проекта из связанного веб-сайта (см. начало этого вопроса), открыл свежую загрузку в Xcode и непосредственно запустил приложение. Я не изменил ни одной настройки и ни одной строки кода. Я также искал в google и stackoverflow эту проблему и не нашел решения, хотя эта проблема должна быть очень общей.

Я использую Xcode версии 4.5.2 (4G2008a) и MacBook Pro с конца 2009 года с Mac OS X 10.8.

У меня также был друг, который попробовал это на своем компьютере, и у него есть та же самая проблема. У него та же ОС, и его версия XCode также 4.5.2.

Я бы сейчас попробовал старые версии Xcode,но сейчас мне не нравится загружать несколько гигабайт для пробного подхода к моему соединению.

Любая помощь оценена, включая отчеты типа " работает для меня с версией Xcode ...". Спасибо!

2 2

2 ответа:

Проблема возникает потому, что в методе AQRecorder::StartRecord(CFStringRef inRecordFile) Функция CFURLCreateWithString() терпит неудачу и возвращает указатель на nil. Это не обнаружено, а позже в коде вызывается CFRelease() на нулевой указатель, который вызывает EXC_BREAKPOINT.

Цель метода CFURLCreateWithString() в основном состоит в том, чтобы взять строку url в качестве входных данных и вернуть указатель на объект CFURL в качестве выходных данных. Проблема здесь в том, что входные данные не являются строкой url. Вместо этого, это просто путь в локальной файловой системе без file:/ или подобного как префикс. По этой причине этот метод не работает.

Решение состоит в том, чтобы удалить неработающий вызов метода CFURLCreateWithString() и вместо этого вызвать связанный метод, а именно CFURLCreateWithFileSystemPath(), который готов принять путь локальной файловой системы и преобразовать его в CFURL:

В методе AQRecorder::StartRecord(CFStringRef inRecordFile) Замените или закомментируйте строку

url = CFURLCreateWithString(kCFAllocatorDefault, (CFStringRef)recordFile, NULL);

И вставить

url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)recordFile, kCFURLPOSIXPathStyle, false);

На своем месте.

url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)recordFile, kCFURLPOSIXPathStyle, false);

Приведенный выше код сделал мой xcoce 4.6 скомпилировать и запустить в симуляторе, но это не рекорд мой голос с моего микрофона USB, я могу проверить мой микрофон в ГараШ диапазон применения и успешно записывать и воспроизводить свой голос, и dbmeter не двигается вообще никак, когда я портировать его на реальном устройстве, он просто не может записать и воспроизвести голос в мой тренажер.