Files
UvosSmartHomeInterface/ampmanager.cpp
2017-12-30 20:53:12 +01:00

109 lines
2.9 KiB
C++

#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(&params);
/* 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++;
}
}