играть и записывать - AudioSessionSetProperty ..? - PullRequest
1 голос
/ 20 марта 2012

Наше приложение использует remoteIO (аудиоустройство) для получения аудиовхода с микрофона и DSP через него в режиме реального времени, оно имеет функцию обратного вызова, которая дает мне буфер, и я работаю над ним.

В то же время нам нужно проигрывать звуки через avAudioPlayer.

Я вставил в свой init this: (направьте звуки на динамик и дайте ему воспроизвести и записать)

UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
        AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

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

Тогда я сделал трюк. Я видел, что для того, чтобы действительно направить звуки на динамики, мне нужно что-то воспроизвести и одновременно выполнить эти 4 строки выше. Если я делаю это 1 раз, то звуки возвращаются в динамики навсегда . Я сделал это с помощью таймера, который вызывает метод, и в тот момент, когда этот метод выполняет их, я воспроизводил звук с помощью avaudioPlayer, а затем исправлял его и направлял звук в динамики.

У кого-нибудь есть какое-либо решение или объяснение этой вещи? Мне действительно нужно воспроизводить звуки через динамики без трюков.

1 Ответ

3 голосов
/ 20 апреля 2012

Причина, по которой он воспроизводится вечно, заключается в том, что микрофон улавливает воспроизводимый звук и входит в петлю AKA эффект Larsen

Вы можете принудительно включить звук в нижний динамик с помощью

-(void)setSpeaker
{
    OSStatus error;
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
    error = AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), &audioRouteOverride);
    if (error) NSLog(@"Couldn't route audio to speaker");
}

Вы также можете представить пользовательский интерфейс для выбора нижнего или верхнего динамика с помощью MPVolumeView

...