#include "ampmanager.h" AmpManager::AmpManager(Microcontroller *micro, int relayNumber, QAudioDeviceInfo device, QObject *parent) : QObject(parent), _micro(micro), _relayNumber(relayNumber) { /* Open PCM device for recording (capture). */ rc = snd_pcm_open(&handle, "default", SND_PCM_STREAM_CAPTURE, 0); if (rc < 0) { fprintf(stderr, "unable to open pcm device: %s\n", snd_strerror(rc)); exit(1); } /* Allocate a hardware parameters object. */ snd_pcm_hw_params_alloca(¶ms); /* Fill it in with default values. */ snd_pcm_hw_params_any(handle, params); /* Set the desired hardware parameters. */ /* Interleaved mode */ snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED); /* Signed 16-bit little-endian format */ snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE); s /* One channel (mono) */ snd_pcm_hw_params_set_channels(handle, params, 1); /* 16000 bits/second sampling rate */ val = 16000; snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir); /* Set period size to 2048 frames. */ frames = 2048; snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir); /* Write the parameters to the driver */ rc = snd_pcm_hw_params(handle, params); if (rc < 0) { fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc)); exit(1); } /* Use a buffer large enough to hold one period */ snd_pcm_hw_params_get_period_size(params, &frames, &dir); size = frames * 2; /* 2 bytes/sample, 1 channels */ char* buffer = new char[size](); } AmpManager::~AmpManager() { abort(); snd_pcm_drain(handle); snd_pcm_close(handle); } 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++; } }