본문 바로가기

프로그래밍/WebRTC

[WebRTC] iOS Audio 관련 클래스

RTCPeerConnectionFactory

sdk/objc/api/peerconnection/RTCPeerConnectionFactory.mm

 

webrtc peer connection 객체를 생성하는 factory 클래스,
init 시에 비디오 encoder, decoder factory 를 설정하고, audio device module 을 생성한다.

 

아래 함수를 통해 audio device module을 설정하게 된다. 

#if defined(WEBRTC_IOS)
#import "sdk/objc/native/api/audio_device_module.h"
#endif



- (rtc::scoped_refptr<webrtc::AudioDeviceModule>)audioDevicdeModule {
#if defined(WEBRTC_IOS)
    return webrtc::CreateAudioDeviceModule();
#else
    return nullptr;
#endif
}

 

webrtc::CreateAudioDeviceModule 메쏘드는 sdk/objc/native/api/audio_device_module.mm

단순하게 AudioDeviceModuleIOS 를 생성해서 리턴.


rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceModule() {
#if defined(WEBRTC_IOS)
  return new rtc::RefCountedObject<ios_adm::AudioDeviceModuleIOS>();
#else
  RTC_LOG(LERROR)
      << "current platform is not supported => this module will self destruct!";
  return nullptr;
#endif
}

 

 

AudioDeviceModuleIOS

sdk/objc/native/src/audio/audio_device_module_ios.mm

Audio Device 랩핑 클래스. 대부분의 메쏘들은 실제 device와의 인터페이스 용도의 함수들이다.

헤더에 보면 실제 Audio Device 관련 클래스들이 선언되어 있다.

std::unique_ptr<AudioDeviceIOS> audio_device_;
std::unique_ptr<AudioDeviceBuffer> audio_device_buffer_;

Init() 메쏘드에서 위 객체들을 생성한다.

audio_device_buffer_.reset(new webrtc::AudioDeviceBuffer(task_queue_factory_.get()));
audio_device_.reset(new ios_adm::AudioDeviceIOS());

 

 

 

AudioDeviceIOS

sdk/objc/native/src/audio/audio_device_ios.mm

iOS의 audio session 과 audio component, audio unit을 관리하는 클래스.


AudioDeviceBuffer* audio_device_buffer_;
AudioParameters playout_parameters_;
AudioParameters record_parameters_;
std::unique_ptr<VoiceProcessingAudioUnit> audio_unit_;
std::unique_ptr<FineAudioBuffer> fine_audio_buffer_;
std::BufferT<int16_t> record_audio_buffer_;

RTCNativeAudioSessionDelegateAdapter* audio_session_observer_;

생성시 RTCAudioSessionDelegate 설정

audio_session_observer_ = [[RTCNativeAudioSessionDelegateAdapter alloc] initWithObserver:this];

 

오디오 디바이스 버퍼 설정

AttachAudioBuffer(AudioDeviceBuffer* audioBuffer)
audio_device_buffer_ = audioBuffer;

 

Init()

RTCAudioSessionConfiguration 을 가져와 파라미터들을 설정, 오디오 버퍼 설정.

RTCAudioSessionConfiguration을 가져오므로, 이전에 해당 값이 설정되어 있어야 한다.

RTCAudioSessionConfiguration* config = [RTCAudioSessionConfiguration webRTCConfiguration];
playout_parameters_.reset( config.sampleRate, config.outputNumberOfChannels );
record_parameters_.reset(config.sampleRate, config.inputNumberOfChannels);

audio_device_buffer_->SetPlayoutSampleRate( playout_parameters_.sample_rate());
audio_device_buffer_->SetPlayoutChannels( playout_parameters_.channels());
audio_device_buffer_->SetRecordingSampleRate( record_parameters_.sample_rate());
audio_device_buffer_->SetRecordingChannels(record_parameters_.channels());

 

오디오유닛 관련 메쏘드

CreateAudioUnit()
InitPlayout()
InitRecording()
StartPlayout()
StopPlayout()
StartRecording()
StopRecording()

//AudioUnit Callback
OnDeliverRecordedData()
OnGetPlayoutData()

 

 

 

 

 

 

VoiceProcessingAudioUnit

sdk/objc/native/src/audio/voice_processing_audio_unit.mm

오디오유닛 관련 클래스

오디오 코어가 제공되는 부분 : 오디오 관련 처리가 이루어진다. 믹싱이나 EQ등 커스텀이 필요할때 수정이 필요한 부분