// // 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 #include #include #include "AudioOutputAudioUnit.h" #include "../../logging.h" #include "AudioUnitIO.h" #define BUFFER_SIZE 960 using namespace tgvoip; using namespace tgvoip::audio; AudioOutputAudioUnit::AudioOutputAudioUnit(std::string deviceID, AudioUnitIO* io){ isPlaying=false; remainingDataSize=0; level=0.0; this->io=io; #if TARGET_OS_OSX io->SetCurrentDevice(false, deviceID); #endif io->AttachOutput(this); failed=io->IsFailed(); } AudioOutputAudioUnit::~AudioOutputAudioUnit(){ io->DetachOutput(); } void AudioOutputAudioUnit::Configure(uint32_t sampleRate, uint32_t bitsPerSample, uint32_t channels){ io->Configure(sampleRate, bitsPerSample, channels); } bool AudioOutputAudioUnit::IsPhone(){ return false; } void AudioOutputAudioUnit::EnableLoudspeaker(bool enabled){ } void AudioOutputAudioUnit::Start(){ isPlaying=true; io->EnableOutput(true); failed=io->IsFailed(); } void AudioOutputAudioUnit::Stop(){ isPlaying=false; io->EnableOutput(false); } bool AudioOutputAudioUnit::IsPlaying(){ return isPlaying; } float AudioOutputAudioUnit::GetLevel(){ return level / 9.0; } void AudioOutputAudioUnit::HandleBufferCallback(AudioBufferList *ioData){ int i; for(i=0;imNumberBuffers;i++){ AudioBuffer buf=ioData->mBuffers[i]; if(!isPlaying){ memset(buf.mData, 0, buf.mDataByteSize); return; } #if TARGET_OS_OSX unsigned int k; while(remainingDataSize(buf.mData); int16_t* src=reinterpret_cast(remainingData); for(k=0;kSetCurrentDevice(false, deviceID); } #endif