#include "ampmanager.h" AmpManager::AmpManager(Microcontroller *micro, int relayNumber, QAudioDeviceInfo device, QObject *parent) : QObject(parent), _micro(micro), _relayNumber(relayNumber) { QAudioFormat format; format.setSampleRate(8000); format.setChannelCount(1); format.setSampleSize(8); format.setCodec("audio/pcm"); format.setByteOrder(QAudioFormat::LittleEndian); format.setSampleType(QAudioFormat::UnSignedInt); _audioDevice = new QAudioInput(device/*, format*/); } AmpManager::~AmpManager() { abort(); delete _audioDevice; } void AmpManager::run() { abort(); _ioDevice = _audioDevice->start(); loop.reset(new QEventLoop); QTimer timer; connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); timer.setInterval(500); timer.start(); qDebug()<<"Start Auto Amp Manager\n"; _micro->relayOn(_relayNumber); relayState = true; loop->exec(); } void AmpManager::abort() { if (!loop.isNull())loop->quit(); if(_audioDevice->error() == 0)_audioDevice->stop(); if(_ioDevice != nullptr)delete _ioDevice; qDebug()<<"Stop Auto Amp Manager\n"; } void AmpManager::doTick() { if(_audioDevice->error() == 0 && _ioDevice != nullptr) { QByteArray buffer = _ioDevice->readAll(); for(long i = 0; i < buffer.size(); i++) { if((uint8_t) buffer.at(i) != 128) { silenceCount = 0; } } if(silenceCount > 40 && relayState) { std::cout<<"Auto off Amp\n"; _micro->relayOff(_relayNumber); relayState = false; } else if(silenceCount == 0 && !relayState) { std::cout<<"Auto on Amp\n"; _micro->relayOn(_relayNumber); relayState = true; } silenceCount++; } }