mirror of
https://github.com/danog/libtgvoip.git
synced 2024-12-02 09:37:52 +01:00
bfd5cfecb3
- Apply AGC after AEC/NS to work around loud echo on desktops - Fixed (?) mic muting on Windows
83 lines
2.1 KiB
C++
83 lines
2.1 KiB
C++
//
|
|
// libtgvoip is free and unencumbered public domain software.
|
|
// For more information, see http://unlicense.org or the UNLICENSE file
|
|
// you should have received with this source code distribution.
|
|
//
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
#include "AudioUnitIO.h"
|
|
#include "AudioInputAudioUnit.h"
|
|
#include "../../logging.h"
|
|
|
|
#define BUFFER_SIZE 960
|
|
|
|
using namespace tgvoip;
|
|
using namespace tgvoip::audio;
|
|
|
|
AudioInputAudioUnit::AudioInputAudioUnit(std::string deviceID){
|
|
remainingDataSize=0;
|
|
isRecording=false;
|
|
this->io=AudioUnitIO::Get();
|
|
#if TARGET_OS_OSX
|
|
io->SetCurrentDevice(true, deviceID);
|
|
#endif
|
|
io->AttachInput(this);
|
|
failed=io->IsFailed();
|
|
}
|
|
|
|
AudioInputAudioUnit::~AudioInputAudioUnit(){
|
|
io->DetachInput();
|
|
AudioUnitIO::Release();
|
|
}
|
|
|
|
void AudioInputAudioUnit::Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels){
|
|
io->Configure(sampleRate, bitsPerSample, channels);
|
|
}
|
|
|
|
void AudioInputAudioUnit::Start(){
|
|
isRecording=true;
|
|
io->EnableInput(true);
|
|
failed=io->IsFailed();
|
|
}
|
|
|
|
void AudioInputAudioUnit::Stop(){
|
|
isRecording=false;
|
|
io->EnableInput(false);
|
|
}
|
|
|
|
void AudioInputAudioUnit::HandleBufferCallback(AudioBufferList *ioData){
|
|
int i;
|
|
int j;
|
|
for(i=0;i<ioData->mNumberBuffers;i++){
|
|
AudioBuffer buf=ioData->mBuffers[i];
|
|
#if TARGET_OS_OSX
|
|
assert(remainingDataSize+buf.mDataByteSize/2<10240);
|
|
float* src=reinterpret_cast<float*>(buf.mData);
|
|
int16_t* dst=reinterpret_cast<int16_t*>(remainingData+remainingDataSize);
|
|
for(j=0;j<buf.mDataByteSize/4;j++){
|
|
dst[j]=(int16_t)(src[j]*INT16_MAX);
|
|
}
|
|
remainingDataSize+=buf.mDataByteSize/2;
|
|
#else
|
|
assert(remainingDataSize+buf.mDataByteSize<10240);
|
|
memcpy(remainingData+remainingDataSize, buf.mData, buf.mDataByteSize);
|
|
remainingDataSize+=buf.mDataByteSize;
|
|
#endif
|
|
while(remainingDataSize>=BUFFER_SIZE*2){
|
|
InvokeCallback((unsigned char*)remainingData, BUFFER_SIZE*2);
|
|
remainingDataSize-=BUFFER_SIZE*2;
|
|
if(remainingDataSize>0){
|
|
memmove(remainingData, remainingData+(BUFFER_SIZE*2), remainingDataSize);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#if TARGET_OS_OSX
|
|
void AudioInputAudioUnit::SetCurrentDevice(std::string deviceID){
|
|
io->SetCurrentDevice(true, deviceID);
|
|
}
|
|
#endif
|