Как отключить звук в приложении Apple Aurio Touch (пример аудиосессии)? - PullRequest
1 голос
/ 14 ноября 2010

Я написал детектор дыхания на основе примера приложения aurio Touch от Apple.Но я не могу понять, как настроить аудиоустройство или аудио сеанс, чтобы не воспроизводить звуки с аудиовхода.Теперь, когда дует в микрофон, я слышу дыхание из динамика iphone.Как это предотвратить?

Вот код инициализации аудио сессии Apple:

            XThrowIfError(AudioSessionInitialize(NULL, NULL, rioInterruptionListener, self), "couldn't initialize audio session");
        XThrowIfError(AudioSessionSetActive(true), "couldn't set audio session active\n");


        UInt32 audioCategory = kAudioSessionCategory_RecordAudio;
        XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory), "couldn't set audio category");
        XThrowIfError(AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self), "couldn't set property listener");

        Float32 preferredBufferSize = .005;
        XThrowIfError(AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize), "couldn't set i/o buffer duration");

        UInt32 size = sizeof(hwSampleRate);
        XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &size, &hwSampleRate), "couldn't get hw sample rate");

        XThrowIfError(SetupRemoteIO(rioUnit, inputProc, thruFormat), "couldn't setup remote i/o unit");

        dcFilter = new DCRejectionFilter[thruFormat.NumberChannels()];

        UInt32 maxFPS;
        size = sizeof(maxFPS);
        XThrowIfError(AudioUnitGetProperty(rioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &maxFPS, &size), "couldn't get the remote I/O unit's max frames per slice");

        fftBufferManager = new FFTBufferManager(maxFPS);
        l_fftData = new int32_t[maxFPS/2];



        XThrowIfError(AudioOutputUnitStart(rioUnit), "couldn't start remote i/o unit");

        size = sizeof(thruFormat);
        XThrowIfError(AudioUnitGetProperty(rioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &thruFormat, &size), "couldn't get the remote I/O unit's output client format");

1 Ответ

0 голосов
/ 15 ноября 2010

Большое спасибо Тиму Болстаду Его ответ: AURIOTouch использует один обратный вызов для передачи звука с входа на выход. Так что самое простое было бы в ноль из структуры ioData после обнаружения дыхания.

Что-то вроде:

for (UInt32 i=0; i < inData->mNumberBuffers; i++)
memset(inData->mBuffers[i].mData, 0, inData->mBuffers[i].mDataByteSize);

Или вы можете посмотреть на пример CAPlayThrough, который имеет отдельные обратные вызовы для ввода и вывода.

...