iOS: ошибка в симуляторе с помощью AudioUnitRender - PullRequest
1 голос
/ 09 июля 2011

Я обнаружил еще одну ошибку симулятора iOS. У меня вопрос, есть ли обходной путь?

Ошибка заключается в следующем:

Загрузить Apple AurioTouch Пример проекта.

и просто распечатайте количество кадров, получаемых обратным вызовом (в aurioTouchAppDelegate.mm)

static OSStatus PerformThru(
                            void                        *inRefCon, 
                            AudioUnitRenderActionFlags  *ioActionFlags, 
                            const AudioTimeStamp        *inTimeStamp, 
                            UInt32                      inBusNumber, 
                            UInt32                      inNumberFrames, 
                            AudioBufferList             *ioData)
{
    printf( "%u, ", (unsigned int)inNumberFrames );

Я получаю следующий вывод:

471, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, ...

Однако, если вы закомментируете вызов AudioUnitRender в следующей строке:

{
    printf( "%u, ", (unsigned int)inNumberFrames );

    aurioTouchAppDelegate *THIS = (aurioTouchAppDelegate *)inRefCon;
    OSStatus err = 0; // AudioUnitRender(THIS->rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);

Теперь каждый раз отправляет соответствующее число поплавков.

471, 470, 471, 470, 470, 471, 470, 471, 470, 470, 471, 470, 471, 470, 470, 471, 470,

Другой вопрос, который у меня возникает: почему такое случайное число, как 470, 471? Я где-то читал, что вы указываете длину буфера неявно, указав его длительность, и он устанавливает длину буфера равной , т.е. степень двойки, которая дает наилучшее приближение к этой продолжительности . Но эмпирические данные свидетельствуют о том, что это не так.

Во всяком случае, уверен, что это ошибка. Я собираюсь пойти на файл это. Если кто-то может пролить свет, пожалуйста, сделайте!

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Если вы хотите, чтобы звук работал с вашим симулятором, вам нужно убедиться, что частота дискретизации установлена ​​на 44.1k в инструменте настройки аудио / midi OS X. AVAudioSession / Audio Services сообщит о вашей частоте дискретизации как 44.1k независимо от того, какой она на самом деле при использовании симулятора.

Установив частоту дискретизации вашего компьютера Mac на уровне 44,1 Кб, вы получите непротиворечивый inNumberFrames (по умолчанию 1024) для каждого обратного вызова, хотя он все еще может быть изменен системой (например, приложение переходит в фоновый режим).

1 голос
/ 09 сентября 2011

Обычно обходной путь к ошибкам симулятора заключается в тестировании приложения на устройстве.Симуляторы iOS - это всего лишь симулятор, а не эмулятор.

Симулятор iOS содержит некоторые странные ошибки.Это может быть связано с размерами буфера согласно этому посту Кристофера Пенроуза:

Имитатор будет действовать совершенно по-другому, поскольку зависит от вашего аудиоустройства хоста, которое в вашем случае можетсторонний интерфейс.Я видел, что симулятор отказывается от разумной мощности 2 размера из-за устройства.Я не смог надежно использовать звук в симуляторе.
Джеймс говорит мне, что я глуп, но на практике я смог положиться на исходный сконфигурированный размер буфера, не меняя его.

Ссылка с возможно более полезной информацией: http://osdir.com/ml/coreaudio-api/2010-04/msg00150.html

...