2015-12-30 3 views
1

В проекте Apple, представленном aurioTouch, я слышал, что AudioBufferList ioData в файле AudioController в функции performRender() переносит аудиоданные с микрофона на аудиоплеер? Может ли кто-нибудь подтвердить это? Вот код:Цель AurioTouch AudioBufferList

// Render callback function 
static OSStatus performRender (void       *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp   *inTimeStamp, 
          UInt32      inBusNumber, 
          UInt32      inNumberFrames, 
          AudioBufferList    *ioData) 
{ 
OSStatus err = noErr; 
if (*cd.audioChainIsBeingReconstructed == NO) 
{ 
    // we are calling AudioUnitRender on the input bus of AURemoteIO 
    // this will store the audio data captured by the microphone in ioData 
    err = AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData); 

    // filter out the DC component of the signal 
    cd.dcRejectionFilter->ProcessInplace((Float32*) ioData->mBuffers[0].mData, inNumberFrames); 

    // based on the current display mode, copy the required data to the buffer manager 
    if (cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeOscilloscopeWaveform) 
    { 
     cd.bufferManager->CopyAudioDataToDrawBuffer((Float32*)ioData->mBuffers[0].mData, inNumberFrames); 
    } 

    else if ((cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeSpectrum) || (cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeOscilloscopeFFT)) 
    { 
     if (cd.bufferManager->NeedsNewFFTData()) 
      cd.bufferManager->CopyAudioDataToFFTInputBuffer((Float32*)ioData->mBuffers[0].mData, inNumberFrames); 
    } 

    // mute audio if needed 
    if (*cd.muteAudio) 
    { 
     for (UInt32 i=0; i<ioData->mNumberBuffers; ++i) 
      memset(ioData->mBuffers[i].mData, 0, ioData->mBuffers[i].mDataByteSize); 
    } 
} 

return err; 
} 

ответ

1

Аудиоблок RemoteIO является компонентом, который может получить доступ как аудио вход аппаратных средств (микрофоны) и выход (динамик).

Входные данные получают данные от микрофона или буфера. Выходные данные передают звуковые данные в динамик или буфер.

Поскольку входные данные получают данные от микрофона, вы можете делать с ним все, что хотите. Вы можете сохранить его в файл. Вы можете отправить его сетевому потоку. Вы можете сохранить его в памяти.

Для вывода устройство вывода звука и динамик запрашивают данные для воспроизведения.

Таким образом, в программном обеспечении, которое вы предоставили, все, что они сделали, это подключение микрофона к динамику, как прямой аудиопроход.

Функция performRender() периодически вызывается звуковой системой, и в ней говорится: «Дайте некоторые звуковые образцы для воспроизведения». Внутри этой функции он считывает данные, полученные микрофоном в строке: AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);

Вы можете заменить внутренности performRender() и сделать свои собственные аудиоданные программным путем, читать из файла или буфера и т. Д. Все, что они сделали, это просто читать данные микрофона.

Что касается вашего вопроса о цели AudioBufferList. Это просто предоставляет список буферов, где каждый буфер является каналом. Иногда у вас есть несколько каналов аудио в зависимости от формата (моно, стерео, стерео чередующиеся, каналы микшера и т. Д.) И тип устройства.

+0

Благодарим вас за такой подробный ответ, который действительно прояснил ситуацию. Это невероятно широкий вопрос, но я действительно борюсь с отправкой микрофонных данных на другой телефон, используя эту инфраструктуру под названием Multipeer Connectivity, и я чувствую себя глубже в аудиоматериалах, поэтому я должен спросить об этом. Я попытался инициализировать NSStream и отправить «iodata» на другой телефон. Хотя он получил данные, он ничего не сделал, что имеет смысл сейчас, потому что я не отправлял ему полные данные микрофона. Мой вопрос в том, как вы будете отправлять поток данных микрофона на другой телефон в режиме реального времени? –

+0

Да очень широкий вопрос. Я не очень разбираюсь в той структуре, которую вы упоминаете. Однако при потоковой передаче вам необходимо адресовать эти вопросы и ограничения: 1) Ограничения полосы пропускания? (например, LAN vs WAN) 2) Является ли ваш протокол сетевой связи надежным или ненадежным (rg tcp vs udp)? Как вы будете обрабатывать потери данных, если они ненадежны? 3) Определите ограничение времени ожидания в реальном времени. (30 мс, 100 мс, 2 секунды?) Нет системы в качестве 0 латентности. 4) Как вы собираетесь сжимать данные? (Opus очень хорош для потоковой передачи с малой задержкой) 5) Вы отправляете данные одному человеку или многим людям? – jaybers

+0

Но я не могу отправить параметры в функцию AudioUnitRender (cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData); на другой телефон, верно? Каким-то образом его нужно превратить в сжатую версию этих данных, а затем отправить. –

Смежные вопросы