Использование эффекта аудиоустройства фильтра в iOS5 - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь использовать подключение к удаленному вводу-выводу и маршрутизировать аудиовход через встроенный эффект фильтра (только для iOS 5), а затем отключить аппаратное обеспечение.Я могу сделать это прямо от входа к выходу, но я не могу заставить фильтр работать.Я не уверен, что это аудио-модуль фильтра или маршрутизация, в которой я ошибся.

Этот бит - просто моя попытка настроить фильтр и изменить маршрут так, чтобы он обрабатывал данные.

Любая помощь приветствуется.

// ******* BEGIN FILTER ********

NSLog(@"Begin filter");

// Creates Audio Component Description - Output Filter    
AudioComponentDescription filterCompDesc;
filterCompDesc .componentType = kAudioUnitType_Effect;
filterCompDesc.componentSubType = kAudioUnitSubType_LowPassFilter;
filterCompDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
filterCompDesc.componentFlags = 1;
filterCompDesc.componentFlagsMask = 1;


// Create Filter Unit
AudioUnit lpFilterUnit;
AudioComponent filterComponent = AudioComponentFindNext(NULL, &filterCompDesc);
setupErr = AudioComponentInstanceNew(filterComponent, &lpFilterUnit);
NSAssert(setupErr == noErr, @"No instance of filter");

AudioUnitElement bus2 = 2;
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Output, bus2, &oneFlag, sizeof(oneFlag));

AudioUnitElement bus3 = 3;
setupErr = AudioUnitSetProperty(lpFilterUnit, kAudioUnitSubType_LowPassFilter, kAudioUnitScope_Input, bus3, &oneFlag, sizeof(oneFlag));



// ******** END FILTER ******** //


AudioUnitConnection hardInToLP;
hardInToLP.sourceAudioUnit    = remoteIOunit;
hardInToLP.sourceOutputNumber = 1;
hardInToLP.destInputNumber    = 3;

setupErr = AudioUnitSetProperty (
                      remoteIOunit,                     // connection destination
                      kAudioUnitProperty_MakeConnection,  // property key
                      kAudioUnitScope_Input,              // destination scope
                      bus3,                // destination element
                      &hardInToLP,                // connection definition
                      sizeof (hardInToLP)
                      );

AudioUnitConnection LPToHardOut;
LPToHardOut.sourceAudioUnit    = lpFilterUnit;
LPToHardOut.sourceOutputNumber = 1;
LPToHardOut.destInputNumber    = 3;

setupErr = AudioUnitSetProperty (
                      remoteIOunit,                     // connection destination
                      kAudioUnitProperty_MakeConnection,  // property key
                      kAudioUnitScope_Input,              // destination scope
                      bus3,                // destination element
                      &hardInToLP,                // connection definition
                      sizeof (hardInToLP)
                      );


/*
// Sets up the Audio Units Connection - new instance called connection
AudioUnitConnection connection;

// Connect Audio Input's out to Audio Out's in
connection.sourceAudioUnit = remoteIOunit;
connection.sourceOutputNumber = bus1;
connection.destInputNumber = bus0;


setupErr = AudioUnitSetProperty(remoteIOunit, kAudioUnitProperty_MakeConnection, kAudioUnitScope_Input, bus0, &connection, sizeof(connection));
*/ 

NSAssert(setupErr == noErr, @"No RIO connection");

Ответы [ 3 ]

8 голосов
/ 25 января 2012

Здесь происходит пара вещей:

  • Вы очень поможете себе, если сделаете утверждение (или что-то вроде проверки-ошибки-и-регистрации) после каждого вызовакоторый может вернуть OSStatus.Таким образом, вы поймете, как далеко вы получаете.Вероятно, также нужно зарегистрировать фактическое значение OSStatus, когда оно! = NoErr, а затем найти его (запустить в «Справочнике по службам компонентов аудиоустройства» в средстве просмотра документации Xcode).
  • После создания фильтра AudioUnit яне получите то, что вы делаете с вызовами AudioUnitSetProperty ().Вторым параметром должно быть имя свойства (которое начинается с kAudioUnitProperty ...).Это почти наверняка возвращает ошибку прямо здесь.
  • remoteIOunit имеет только две шины, и они имеют особое значение.шина 1 является входом для микрофона, шина 0 - для оборудования.Попытка подключиться к удаленной шине 3 ввода-вывода ввода-вывода, вероятно, будет еще одной ошибкой

Предложите откатиться, когда у вас работала передача звука.Это будет означать, что у вас есть только remoteIO и соединение между выходной областью действия / шиной 1 и входной областью действия / шиной 0.

Затем создайте блок фильтра.Измените ваши соединения так, чтобы вы подключали:

  • шина 1 выходной области удаленного ввода-вывода 1 для фильтрации шины входного диапазона 0
  • фильтра выходная шина области 0 к шине входного удаленного объема 0

Еще одна проблема, которая будет представлять собой проблему, заключается в том, что все эти фильтры iOS 5, похоже, хотят использовать форматы LPCM с плавающей запятой, что не является каноническим форматом, по умолчанию используемым другими модулями.Возможно, вам придется получить формат потока от блока фильтра (область ввода или вывода, вероятно, одинаковы?), А затем установить его в качестве формата, который создает область вывода remoteIO / шина 1 и принимает область ввода remoteIO / шина 0.Другим вариантом может быть введение блоков AUConverter до и после блока фильтров.

3 голосов
/ 21 марта 2012

Первый ответ, данный здесь, спас меня гораздо больше разочарований.Нет, где документация Apple говорит вам, что форматы файлов для модулей Effect требуют плавающей запятой.Я не мог понять, почему он продолжал не воспроизводить звук должным образом, пока я не прочитал этот пост.Я следовал приведенному выше совету и извлек формат потока из модуля фильтра нижних частот, и использовал его для настройки двух созданных мной модулей преобразования (т. Е. Для установки формата вывода преобразователя предварительного фильтра и формата ввода постфильтра).конвертер. Как только я сделал это и соединил все узлы вместе, он начал работать как положено.

0 голосов
/ 17 мая 2013

я пытаюсь использовать фильтр нижних частот, и при попытке сделать так, как предложено, также установить формат, я продолжаю получать сообщение об ошибке «операция не может быть завершена», что в этом коде неисправно? После получения lowpassUnit я также проверяю ошибки, но их нет.

result = AudioUnitSetProperty(lowpassUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &stereoStreamFormat, sizeof (stereoStreamFormat));
    if (noErr != result)
{
    NSLog(@"%@", [NSError errorWithDomain:NSOSStatusErrorDomain code:result        userInfo:nil]);
    return;
}

PS: Если кто-нибудь знает о правильной документации аудиоустройства, пожалуйста, поделитесь, поскольку официальной документации действительно не хватает

...