📄 dspaudioout.cpp
字号:
#include <stdio.h>#include <assert.h>#include <unistd.h>#include "../config.h"#include "audiobuffer.h"#include "dspout.h"#include "dspoutrtp.h"#include "dspaudioout.h"DspAudioOut::DspAudioOut( DspOut *in, DspOut *out ) : DspAudio( in, out ){ curpos = 0;}DspAudioOut::~DspAudioOut( void ){}void DspAudioOut::timerTick( void ){ if( broken ){ printf("(b)"); fflush(stdout); return; } short *curbuf; unsigned int outputsize = output->getBuffer().getSize() / sizeof( short ); if ( !broken ) { int numBytes; if( input->getDeviceState() == DspOut::DeviceClosed ) { return; } numBytes = input->readableBytes(); unsigned int samplesleft = input->getBuffer().getSize() / sizeof( short ); short *inbuf = (short *)input->getBuffer().getData(); if (numBytes > 0) { input->readBuffer( numBytes ); } if (!numBytes) { if (!currentTone && !newTone) { return; } } else if (dtmfSamples > 0) { // This is complete bullshit. dtmfSamples can never have a value other than 0 if (dtmfSamples - samplesleft > 0) { dtmfSamples -= 80; return; } else { inbuf += dtmfSamples; samplesleft -= dtmfSamples; dtmfSamples = 0; } } while( samplesleft > 0 ) { if( isCanceled() ) break; if( samplesleft >= ( outputsize - curpos ) ) { curbuf = (short *) copybuffer.getData(); curbuf += curpos; if (!generateDTMF(curbuf, outputsize - curpos)) { memcpy( curbuf, inbuf, ( outputsize - curpos ) * sizeof( short ) ); } memcpy( output->getBuffer().getData(), copybuffer.getData(), output->getBuffer().getSize() ); // If the write fails, mark the pipe as broken and stop sending! if( !output->writeBuffer() ) { printf( QObject::tr("DspAudio: Broken pipe") + "\n" ); broken = true; } samplesleft -= ( outputsize - curpos ); inbuf += ( outputsize - curpos ); curpos = 0; } else { curbuf = (short *) copybuffer.getData(); curbuf += curpos; if (!generateDTMF(curbuf, samplesleft)) { memcpy( curbuf, inbuf, samplesleft * sizeof( short ) ); } curpos += samplesleft; samplesleft = 0; } } }}#ifndef QT_THREAD_SUPPORTvoid DspAudioOut::start( void ){ timer = new QTimer(); connect( timer, SIGNAL( timeout() ), this, SLOT( timeout() ) ); timer->start( 1 );}void DspAudioOut::timeout(){ timerTick();}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -